Home | History | Annotate | Download | only in login
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_CHROMEOS_LOGIN_WEBUI_LOGIN_VIEW_H_
      6 #define CHROME_BROWSER_CHROMEOS_LOGIN_WEBUI_LOGIN_VIEW_H_
      7 
      8 #include <map>
      9 #include <string>
     10 
     11 #include "base/memory/scoped_ptr.h"
     12 #include "base/observer_list.h"
     13 #include "chrome/browser/extensions/scoped_gaia_auth_extension.h"
     14 #include "chrome/browser/ui/chrome_web_modal_dialog_manager_delegate.h"
     15 #include "components/web_modal/web_contents_modal_dialog_host.h"
     16 #include "content/public/browser/notification_observer.h"
     17 #include "content/public/browser/notification_registrar.h"
     18 #include "content/public/browser/web_contents_delegate.h"
     19 #include "ui/views/controls/webview/unhandled_keyboard_event_handler.h"
     20 #include "ui/views/widget/widget.h"
     21 #include "ui/views/widget/widget_delegate.h"
     22 
     23 class GURL;
     24 
     25 namespace content {
     26 class WebUI;
     27 }
     28 
     29 namespace views {
     30 class View;
     31 class WebView;
     32 class Widget;
     33 }
     34 
     35 namespace chromeos {
     36 
     37 // View used to render a WebUI supporting Widget. This widget is used for the
     38 // WebUI based start up and lock screens. It contains a WebView.
     39 class WebUILoginView : public views::View,
     40                        public content::WebContentsDelegate,
     41                        public content::NotificationObserver,
     42                        public ChromeWebModalDialogManagerDelegate,
     43                        public web_modal::WebContentsModalDialogHost {
     44  public:
     45   // Internal class name.
     46   static const char kViewClassName[];
     47 
     48   WebUILoginView();
     49   virtual ~WebUILoginView();
     50 
     51   // Initializes the webui login view.
     52   virtual void Init(views::Widget* login_window);
     53 
     54   // Overridden from views::Views:
     55   virtual bool AcceleratorPressed(
     56       const ui::Accelerator& accelerator) OVERRIDE;
     57   virtual const char* GetClassName() const OVERRIDE;
     58 
     59   // Overridden from ChromeWebModalDialogManagerDelegate:
     60   virtual web_modal::WebContentsModalDialogHost*
     61       GetWebContentsModalDialogHost() OVERRIDE;
     62 
     63   // Overridden from web_modal::WebContentsModalDialogHost:
     64   virtual gfx::NativeView GetHostView() const OVERRIDE;
     65   virtual gfx::Point GetDialogPosition(const gfx::Size& size) OVERRIDE;
     66   virtual void AddObserver(
     67       web_modal::WebContentsModalDialogHostObserver* observer) OVERRIDE;
     68   virtual void RemoveObserver(
     69       web_modal::WebContentsModalDialogHostObserver* observer) OVERRIDE;
     70 
     71   // Called when WebUI window is created.
     72   virtual void OnWindowCreated();
     73 
     74   // Gets the native window from the view widget.
     75   gfx::NativeWindow GetNativeWindow() const;
     76 
     77   // Invokes SetWindowType for the window. This is invoked during startup and
     78   // after we've painted.
     79   void UpdateWindowType();
     80 
     81   // Loads given page. Should be called after Init() has been called.
     82   void LoadURL(const GURL& url);
     83 
     84   // Returns current WebUI.
     85   content::WebUI* GetWebUI();
     86 
     87   // Returns current WebContents.
     88   content::WebContents* GetWebContents();
     89 
     90   // Opens proxy settings dialog.
     91   void OpenProxySettings();
     92 
     93   // Called when WebUI is being shown after being initilized hidden.
     94   void OnPostponedShow();
     95 
     96   // Toggles status area visibility.
     97   void SetStatusAreaVisible(bool visible);
     98 
     99   // Sets whether UI should be enabled.
    100   void SetUIEnabled(bool enabled);
    101 
    102   void set_is_hidden(bool hidden) { is_hidden_ = hidden; }
    103 
    104   // Let suppress emission of this signal.
    105   void set_should_emit_login_prompt_visible(bool emit) {
    106     should_emit_login_prompt_visible_ = emit;
    107   }
    108 
    109  protected:
    110   // Overridden from views::View:
    111   virtual void Layout() OVERRIDE;
    112   virtual void OnLocaleChanged() OVERRIDE;
    113   virtual void ChildPreferredSizeChanged(View* child) OVERRIDE;
    114   virtual void AboutToRequestFocusFromTabTraversal(bool reverse) OVERRIDE;
    115 
    116   // Overridden from content::NotificationObserver.
    117   virtual void Observe(int type,
    118                        const content::NotificationSource& source,
    119                        const content::NotificationDetails& details) OVERRIDE;
    120 
    121   // WebView for rendering a webpage as a webui login.
    122   views::WebView* webui_login_;
    123 
    124  private:
    125   // Map type for the accelerator-to-identifier map.
    126   typedef std::map<ui::Accelerator, std::string> AccelMap;
    127 
    128   // Overridden from content::WebContentsDelegate.
    129   virtual bool HandleContextMenu(
    130       const content::ContextMenuParams& params) OVERRIDE;
    131   virtual void HandleKeyboardEvent(
    132       content::WebContents* source,
    133       const content::NativeWebKeyboardEvent& event) OVERRIDE;
    134   virtual bool IsPopupOrPanel(
    135       const content::WebContents* source) const OVERRIDE;
    136   virtual bool TakeFocus(content::WebContents* source, bool reverse) OVERRIDE;
    137   virtual void RequestMediaAccessPermission(
    138       content::WebContents* web_contents,
    139       const content::MediaStreamRequest& request,
    140       const content::MediaResponseCallback& callback) OVERRIDE;
    141 
    142   // Performs series of actions when login prompt is considered
    143   // to be ready and visible.
    144   // 1. Emits LoginPromptVisible signal if needed
    145   // 2. Notifies OOBE/sign classes.
    146   void OnLoginPromptVisible();
    147 
    148   // Called when focus is returned from status area.
    149   // |reverse| is true when focus is traversed backwards (using Shift-Tab).
    150   void ReturnFocus(bool reverse);
    151 
    152   content::NotificationRegistrar registrar_;
    153 
    154   // Login window which shows the view.
    155   views::Widget* login_window_;
    156 
    157   // Converts keyboard events on the WebContents to accelerators.
    158   views::UnhandledKeyboardEventHandler unhandled_keyboard_event_handler_;
    159 
    160   // Maps installed accelerators to OOBE webui accelerator identifiers.
    161   AccelMap accel_map_;
    162 
    163   // Whether the host window is frozen.
    164   bool host_window_frozen_;
    165 
    166   // True when WebUI is being initialized hidden.
    167   bool is_hidden_;
    168 
    169   // True is login-prompt-visible event has been already handled.
    170   bool login_prompt_visible_handled_;
    171 
    172   // Should we emit the login-prompt-visible signal when the login page is
    173   // displayed?
    174   bool should_emit_login_prompt_visible_;
    175 
    176   // True to forward keyboard event.
    177   bool forward_keyboard_event_;
    178 
    179   scoped_ptr<ScopedGaiaAuthExtension> auth_extension_;
    180 
    181   ObserverList<web_modal::WebContentsModalDialogHostObserver> observer_list_;
    182 
    183   DISALLOW_COPY_AND_ASSIGN(WebUILoginView);
    184 };
    185 
    186 }  // namespace chromeos
    187 
    188 #endif  // CHROME_BROWSER_CHROMEOS_LOGIN_WEBUI_LOGIN_VIEW_H_
    189