1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_CHROMEOS_LOGIN_UI_WEBUI_LOGIN_VIEW_H_ 6 #define CHROME_BROWSER_CHROMEOS_LOGIN_UI_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/signin/scoped_gaia_auth_extension.h" 14 #include "chrome/browser/ui/chrome_web_modal_dialog_manager_delegate.h" 15 #include "components/web_modal/popup_manager.h" 16 #include "components/web_modal/web_contents_modal_dialog_host.h" 17 #include "content/public/browser/notification_observer.h" 18 #include "content/public/browser/notification_registrar.h" 19 #include "content/public/browser/web_contents_delegate.h" 20 #include "content/public/browser/web_contents_observer.h" 21 #include "ui/views/controls/webview/unhandled_keyboard_event_handler.h" 22 #include "ui/views/widget/widget.h" 23 #include "ui/views/widget/widget_delegate.h" 24 25 class GURL; 26 27 namespace content { 28 class WebUI; 29 } 30 31 namespace views { 32 class View; 33 class WebView; 34 class Widget; 35 } 36 37 namespace chromeos { 38 39 // View used to render a WebUI supporting Widget. This widget is used for the 40 // WebUI based start up and lock screens. It contains a WebView. 41 class WebUILoginView : public views::View, 42 public content::WebContentsDelegate, 43 public content::WebContentsObserver, 44 public content::NotificationObserver, 45 public ChromeWebModalDialogManagerDelegate, 46 public web_modal::WebContentsModalDialogHost { 47 public: 48 class FrameObserver { 49 public: 50 // Called when a frame failed to load. 51 virtual void OnFrameError(const std::string& frame_unique_name) = 0; 52 }; 53 54 // Internal class name. 55 static const char kViewClassName[]; 56 57 WebUILoginView(); 58 virtual ~WebUILoginView(); 59 60 // Initializes the webui login view. 61 virtual void Init(); 62 63 // Overridden from views::View: 64 virtual bool AcceleratorPressed( 65 const ui::Accelerator& accelerator) OVERRIDE; 66 virtual const char* GetClassName() const OVERRIDE; 67 virtual void RequestFocus() OVERRIDE; 68 69 // Overridden from ChromeWebModalDialogManagerDelegate: 70 virtual web_modal::WebContentsModalDialogHost* 71 GetWebContentsModalDialogHost() OVERRIDE; 72 73 // Overridden from web_modal::WebContentsModalDialogHost: 74 virtual gfx::NativeView GetHostView() const OVERRIDE; 75 virtual gfx::Point GetDialogPosition(const gfx::Size& size) OVERRIDE; 76 virtual gfx::Size GetMaximumDialogSize() OVERRIDE; 77 virtual void AddObserver( 78 web_modal::ModalDialogHostObserver* observer) OVERRIDE; 79 virtual void RemoveObserver( 80 web_modal::ModalDialogHostObserver* observer) OVERRIDE; 81 82 // Gets the native window from the view widget. 83 gfx::NativeWindow GetNativeWindow() const; 84 85 // Loads given page. Should be called after Init() has been called. 86 void LoadURL(const GURL& url); 87 88 // Returns current WebUI. 89 content::WebUI* GetWebUI(); 90 91 // Returns current WebContents. 92 content::WebContents* GetWebContents(); 93 94 // Opens proxy settings dialog. 95 void OpenProxySettings(); 96 97 // Called when WebUI is being shown after being initilized hidden. 98 void OnPostponedShow(); 99 100 // Toggles status area visibility. 101 void SetStatusAreaVisible(bool visible); 102 103 // Sets whether UI should be enabled. 104 void SetUIEnabled(bool enabled); 105 set_is_hidden(bool hidden)106 void set_is_hidden(bool hidden) { is_hidden_ = hidden; } 107 webui_visible()108 bool webui_visible() const { return webui_visible_; } 109 110 // Let suppress emission of this signal. set_should_emit_login_prompt_visible(bool emit)111 void set_should_emit_login_prompt_visible(bool emit) { 112 should_emit_login_prompt_visible_ = emit; 113 } 114 115 void AddFrameObserver(FrameObserver* frame_observer); 116 void RemoveFrameObserver(FrameObserver* frame_observer); 117 118 protected: 119 // Overridden from views::View: 120 virtual void Layout() OVERRIDE; 121 virtual void OnLocaleChanged() OVERRIDE; 122 virtual void ChildPreferredSizeChanged(View* child) OVERRIDE; 123 virtual void AboutToRequestFocusFromTabTraversal(bool reverse) OVERRIDE; 124 125 // Overridden from content::NotificationObserver. 126 virtual void Observe(int type, 127 const content::NotificationSource& source, 128 const content::NotificationDetails& details) OVERRIDE; 129 130 // WebView for rendering a webpage as a webui login. 131 views::WebView* webui_login_; 132 133 private: 134 // Map type for the accelerator-to-identifier map. 135 typedef std::map<ui::Accelerator, std::string> AccelMap; 136 137 // Overridden from content::WebContentsDelegate. 138 virtual bool HandleContextMenu( 139 const content::ContextMenuParams& params) OVERRIDE; 140 virtual void HandleKeyboardEvent( 141 content::WebContents* source, 142 const content::NativeWebKeyboardEvent& event) OVERRIDE; 143 virtual bool IsPopupOrPanel( 144 const content::WebContents* source) const OVERRIDE; 145 virtual bool TakeFocus(content::WebContents* source, bool reverse) OVERRIDE; 146 virtual void RequestMediaAccessPermission( 147 content::WebContents* web_contents, 148 const content::MediaStreamRequest& request, 149 const content::MediaResponseCallback& callback) OVERRIDE; 150 virtual bool CheckMediaAccessPermission( 151 content::WebContents* web_contents, 152 const GURL& security_origin, 153 content::MediaStreamType type) OVERRIDE; 154 virtual bool PreHandleGestureEvent( 155 content::WebContents* source, 156 const blink::WebGestureEvent& event) OVERRIDE; 157 158 // Overridden from content::WebContentsObserver. 159 virtual void DidFailProvisionalLoad( 160 content::RenderFrameHost* render_frame_host, 161 const GURL& validated_url, 162 int error_code, 163 const base::string16& error_description) OVERRIDE; 164 165 // Performs series of actions when login prompt is considered 166 // to be ready and visible. 167 // 1. Emits LoginPromptVisible signal if needed 168 // 2. Notifies OOBE/sign classes. 169 void OnLoginPromptVisible(); 170 171 // Called when focus is returned from status area. 172 // |reverse| is true when focus is traversed backwards (using Shift-Tab). 173 void ReturnFocus(bool reverse); 174 175 content::NotificationRegistrar registrar_; 176 177 // Converts keyboard events on the WebContents to accelerators. 178 views::UnhandledKeyboardEventHandler unhandled_keyboard_event_handler_; 179 180 // Maps installed accelerators to OOBE webui accelerator identifiers. 181 AccelMap accel_map_; 182 183 // True when WebUI is being initialized hidden. 184 bool is_hidden_; 185 186 // True when the WebUI has finished initializing and is visible. 187 bool webui_visible_; 188 189 // Should we emit the login-prompt-visible signal when the login page is 190 // displayed? 191 bool should_emit_login_prompt_visible_; 192 193 // True to forward keyboard event. 194 bool forward_keyboard_event_; 195 196 scoped_ptr<ScopedGaiaAuthExtension> auth_extension_; 197 198 ObserverList<web_modal::ModalDialogHostObserver> observer_list_; 199 ObserverList<FrameObserver> frame_observer_list_; 200 201 // Manage popups appearing over the login window. 202 // TODO(gbillock): See if we can get rid of this. Perhaps in favor of 203 // in-content styled popups or something? There oughtta be a way... 204 scoped_ptr<web_modal::PopupManager> popup_manager_; 205 206 DISALLOW_COPY_AND_ASSIGN(WebUILoginView); 207 }; 208 209 } // namespace chromeos 210 211 #endif // CHROME_BROWSER_CHROMEOS_LOGIN_UI_WEBUI_LOGIN_VIEW_H_ 212