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)#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_LOCK_WEBUI_SCREEN_LOCKER_H_
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define CHROME_BROWSER_CHROMEOS_LOGIN_LOCK_WEBUI_SCREEN_LOCKER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ash/shell_delegate.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ash/wm/lock_state_observer.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/weak_ptr.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/lock/screen_locker_delegate.h"
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/login/signin_specifics.h"
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/lock_window.h"
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/login_display.h"
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/webui_login_view.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/dbus/power_manager_client.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h"
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/keyboard/keyboard_controller_observer.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/widget_observer.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content {
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebUI;
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class OobeUI;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScreenLocker;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebUILoginDisplay;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace login {
39ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass NetworkStateHelper;
40ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
41ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebUIScreenLockerTester;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version of ScreenLockerDelegate displays a WebUI lock screen based on
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the Oobe account picker screen.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebUIScreenLocker : public WebUILoginView,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          public LoginDisplay::Delegate,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          public ScreenLockerDelegate,
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          public LockWindow::Observer,
52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                          public ash::LockStateObserver,
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          public views::WidgetObserver,
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                          public PowerManagerClient::Observer,
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                          public ash::VirtualKeyboardStateObserver,
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                          public keyboard::KeyboardControllerObserver {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit WebUIScreenLocker(ScreenLocker* screen_locker);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ScreenLockerDelegate implementation.
61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void LockScreen() OVERRIDE;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ScreenLockReady() OVERRIDE;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnAuthenticate() OVERRIDE;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetInputEnabled(bool enabled) OVERRIDE;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ShowErrorMessage(
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int error_msg_id,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HelpAppLauncher::HelpTopic help_topic_id) OVERRIDE;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ClearErrors() OVERRIDE;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AnimateAuthenticationSuccess() OVERRIDE;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::NativeWindow GetNativeWindow() const OVERRIDE;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual content::WebUI* GetAssociatedWebUI() OVERRIDE;
723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void OnLockWebUIReady() OVERRIDE;
733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void OnLockBackgroundDisplayed() OVERRIDE;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // LoginDisplay::Delegate: implementation
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void CancelPasswordChangedFlow() OVERRIDE;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CreateAccount() OVERRIDE;
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CompleteLogin(const UserContext& user_context) OVERRIDE;
79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual base::string16 GetConnectedNetworkName() OVERRIDE;
80a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual bool IsSigninInProgress() const OVERRIDE;
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void Login(const UserContext& user_context,
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                     const SigninSpecifics& specifics) OVERRIDE;
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void MigrateUserData(const std::string& old_password) OVERRIDE;
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnSigninScreenReady() OVERRIDE;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnStartEnterpriseEnrollment() OVERRIDE;
867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void OnStartKioskEnableScreen() OVERRIDE;
87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void OnStartKioskAutolaunchScreen() OVERRIDE;
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ShowWrongHWIDScreen() OVERRIDE;
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ResetPublicSessionAutoLoginTimer() OVERRIDE;
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ResyncUserData() OVERRIDE;
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetDisplayEmail(const std::string& email) OVERRIDE;
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Signout() OVERRIDE;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // content::NotificationObserver (via WebUILoginView) implementation.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Observe(int type,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationSource& source,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // LockWindow::Observer implementation.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnLockWindowReady() OVERRIDE;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // LockStateObserver override.
103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void OnLockStateEvent(
104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ash::LockStateObserver::EventType event) OVERRIDE;
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // WidgetObserver override.
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnWidgetDestroying(views::Widget* widget) OVERRIDE;
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // PowerManagerClient::Observer overrides:
1100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual void SuspendDone(const base::TimeDelta& sleep_duration) OVERRIDE;
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void LidEventReceived(bool open,
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                const base::TimeTicks& time) OVERRIDE;
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Overridden from content::WebContentsObserver:
1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void RenderProcessGone(base::TerminationStatus status) OVERRIDE;
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Overridden from ash::KeyboardStateObserver:
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnVirtualKeyboardStateChanged(bool activated) OVERRIDE;
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Overridden from keyboard::KeyboardControllerObserver:
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnKeyboardBoundsChanging(const gfx::Rect& new_bounds) OVERRIDE;
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Returns instance of the OOBE WebUI.
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  OobeUI* GetOobeUI();
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class test::WebUIScreenLockerTester;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~WebUIScreenLocker();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Ensures that user pod is focused.
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void FocusUserPod();
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The screen locker window.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget* lock_window_;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Login UI implementation instance.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WebUILoginDisplay> login_display_;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used for user image changed notifications.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar registrar_;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tracks when the lock window is displayed and ready.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool lock_ready_;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tracks when the WebUI finishes loading.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool webui_ready_;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Time when lock was initiated, required for metrics.
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeTicks lock_time_;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
152ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  scoped_ptr<login::NetworkStateHelper> network_state_helper_;
153ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // True is subscribed as keyboard controller observer.
155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool is_observing_keyboard_;
156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The bounds of the virtual keyboard.
158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::Rect keyboard_bounds_;
159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::WeakPtrFactory<WebUIScreenLocker> weak_factory_;
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WebUIScreenLocker);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif  // CHROME_BROWSER_CHROMEOS_LOGIN_LOCK_WEBUI_SCREEN_LOCKER_H_
168