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_UI_WEBUI_LOGIN_VIEW_H_ 6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define CHROME_BROWSER_CHROMEOS_LOGIN_UI_WEBUI_LOGIN_VIEW_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/observer_list.h" 13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/extensions/signin/scoped_gaia_auth_extension.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/ui/chrome_web_modal_dialog_manager_delegate.h" 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/web_modal/popup_manager.h" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/web_modal/web_contents_modal_dialog_host.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_delegate.h" 208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/views/controls/webview/unhandled_keyboard_event_handler.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget_delegate.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebUI; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class View; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebView; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Widget; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// View used to render a WebUI supporting Widget. This widget is used for the 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebUI based start up and lock screens. It contains a WebView. 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebUILoginView : public views::View, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public content::WebContentsDelegate, 438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) public content::WebContentsObserver, 44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public content::NotificationObserver, 45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public ChromeWebModalDialogManagerDelegate, 46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public web_modal::WebContentsModalDialogHost { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch class FrameObserver { 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Called when a frame failed to load. 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void OnFrameError(const std::string& frame_unique_name) = 0; 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch }; 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Internal class name. 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const char kViewClassName[]; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUILoginView(); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~WebUILoginView(); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initializes the webui login view. 613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void Init(); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Overridden from views::View: 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool AcceleratorPressed( 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Accelerator& accelerator) OVERRIDE; 66b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual const char* GetClassName() const OVERRIDE; 67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void RequestFocus() OVERRIDE; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Overridden from ChromeWebModalDialogManagerDelegate: 70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual web_modal::WebContentsModalDialogHost* 71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GetWebContentsModalDialogHost() OVERRIDE; 72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Overridden from web_modal::WebContentsModalDialogHost: 74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual gfx::NativeView GetHostView() const OVERRIDE; 75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual gfx::Point GetDialogPosition(const gfx::Size& size) OVERRIDE; 7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual gfx::Size GetMaximumDialogSize() OVERRIDE; 77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void AddObserver( 784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) web_modal::ModalDialogHostObserver* observer) OVERRIDE; 79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void RemoveObserver( 804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) web_modal::ModalDialogHostObserver* observer) OVERRIDE; 81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets the native window from the view widget. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeWindow GetNativeWindow() const; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Loads given page. Should be called after Init() has been called. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LoadURL(const GURL& url); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns current WebUI. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebUI* GetWebUI(); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns current WebContents. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* GetWebContents(); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Opens proxy settings dialog. 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenProxySettings(); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when WebUI is being shown after being initilized hidden. 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnPostponedShow(); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Toggles status area visibility. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetStatusAreaVisible(bool visible); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets whether UI should be enabled. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetUIEnabled(bool enabled); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_is_hidden(bool hidden) { is_hidden_ = hidden; } 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool webui_visible() const { return webui_visible_; } 10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Let suppress emission of this signal. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_should_emit_login_prompt_visible(bool emit) { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) should_emit_login_prompt_visible_ = emit; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void AddFrameObserver(FrameObserver* frame_observer); 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void RemoveFrameObserver(FrameObserver* frame_observer); 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) protected: 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from views::View: 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Layout() OVERRIDE; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnLocaleChanged() OVERRIDE; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ChildPreferredSizeChanged(View* child) OVERRIDE; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void AboutToRequestFocusFromTabTraversal(bool reverse) OVERRIDE; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from content::NotificationObserver. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) OVERRIDE; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebView for rendering a webpage as a webui login. 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::WebView* webui_login_; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Map type for the accelerator-to-identifier map. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::map<ui::Accelerator, std::string> AccelMap; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from content::WebContentsDelegate. 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool HandleContextMenu( 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::ContextMenuParams& params) OVERRIDE; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void HandleKeyboardEvent( 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* source, 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NativeWebKeyboardEvent& event) OVERRIDE; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsPopupOrPanel( 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::WebContents* source) const OVERRIDE; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool TakeFocus(content::WebContents* source, bool reverse) OVERRIDE; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RequestMediaAccessPermission( 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* web_contents, 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::MediaStreamRequest& request, 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::MediaResponseCallback& callback) OVERRIDE; 1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual bool CheckMediaAccessPermission( 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::WebContents* web_contents, 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const GURL& security_origin, 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::MediaStreamType type) OVERRIDE; 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual bool PreHandleGestureEvent( 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::WebContents* source, 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const blink::WebGestureEvent& event) OVERRIDE; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Overridden from content::WebContentsObserver. 1598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) virtual void DidFailProvisionalLoad( 160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RenderFrameHost* render_frame_host, 1618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const GURL& validated_url, 1628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) int error_code, 163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::string16& error_description) OVERRIDE; 1648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Performs series of actions when login prompt is considered 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to be ready and visible. 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1. Emits LoginPromptVisible signal if needed 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2. Notifies OOBE/sign classes. 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnLoginPromptVisible(); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when focus is returned from status area. 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |reverse| is true when focus is traversed backwards (using Shift-Tab). 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReturnFocus(bool reverse); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationRegistrar registrar_; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Converts keyboard events on the WebContents to accelerators. 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) views::UnhandledKeyboardEventHandler unhandled_keyboard_event_handler_; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Maps installed accelerators to OOBE webui accelerator identifiers. 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccelMap accel_map_; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True when WebUI is being initialized hidden. 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_hidden_; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // True when the WebUI has finished initializing and is visible. 18758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool webui_visible_; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should we emit the login-prompt-visible signal when the login page is 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // displayed? 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool should_emit_login_prompt_visible_; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True to forward keyboard event. 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool forward_keyboard_event_; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<ScopedGaiaAuthExtension> auth_extension_; 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ObserverList<web_modal::ModalDialogHostObserver> observer_list_; 199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ObserverList<FrameObserver> frame_observer_list_; 200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Manage popups appearing over the login window. 202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(gbillock): See if we can get rid of this. Perhaps in favor of 203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // in-content styled popups or something? There oughtta be a way... 204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<web_modal::PopupManager> popup_manager_; 205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WebUILoginView); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif // CHROME_BROWSER_CHROMEOS_LOGIN_UI_WEBUI_LOGIN_VIEW_H_ 212