1 // Copyright (c) 2011 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 #include "chrome/browser/ui/webui/chromeos/login/login_ui.h" 6 7 #include "base/memory/ref_counted_memory.h" 8 #include "base/memory/singleton.h" 9 #include "base/string_piece.h" 10 #include "base/values.h" 11 #include "chrome/browser/chromeos/cros/cros_library.h" 12 #include "chrome/browser/chromeos/cros/power_library.h" 13 #include "chrome/browser/chromeos/login/dom_login_display.h" 14 #include "chrome/browser/profiles/profile.h" 15 #include "chrome/browser/ui/browser.h" 16 #include "chrome/browser/ui/browser_window.h" 17 #include "chrome/browser/ui/webui/chrome_url_data_manager.h" 18 #include "chrome/browser/ui/webui/chromeos/login/login_ui_helpers.h" 19 #include "chrome/common/url_constants.h" 20 #include "content/browser/browser_thread.h" 21 #include "content/browser/tab_contents/tab_contents.h" 22 23 namespace { 24 const char* kResetPrompt = "resetPrompt"; 25 } // namespace 26 27 namespace chromeos { 28 29 // LoginUIHTMLSource, public: -------------------------------------------------- 30 31 LoginUIHTMLSource::LoginUIHTMLSource(MessageLoop* message_loop) 32 : DataSource(chrome::kChromeUILoginHost, message_loop), 33 html_operations_(new HTMLOperationsInterface()) { 34 } 35 36 void LoginUIHTMLSource::StartDataRequest(const std::string& path, 37 bool is_incognito, 38 int request_id) { 39 DictionaryValue localized_strings; 40 SetFontAndTextDirection(&localized_strings); 41 42 base::StringPiece login_html = html_operations_->GetLoginHTML(); 43 std::string full_html = html_operations_->GetFullHTML(login_html, 44 &localized_strings); 45 scoped_refptr<RefCountedBytes> html_bytes( 46 html_operations_->CreateHTMLBytes(full_html)); 47 SendResponse(request_id, 48 (html_bytes.get())); 49 } 50 51 std::string LoginUIHTMLSource::GetMimeType(const std::string&) const { 52 return "text/html"; 53 } 54 55 // LoginUIHandlerDelegate, protected: ------------------------------------------ 56 57 LoginUIHandlerDelegate::~LoginUIHandlerDelegate() {} 58 59 // LoginUIHandler, public: ----------------------------------------------------- 60 61 LoginUIHandler::LoginUIHandler() { 62 delegate_ = DOMLoginDisplay::GetInstance(); 63 delegate_->set_login_handler(this); 64 } 65 66 WebUIMessageHandler* LoginUIHandler::Attach(WebUI* web_ui) { 67 return WebUIMessageHandler::Attach(web_ui); 68 } 69 70 void LoginUIHandler::RegisterMessages() { 71 web_ui_->RegisterMessageCallback( 72 "LaunchIncognito", 73 NewCallback(this, 74 &LoginUIHandler::HandleLaunchIncognito)); 75 web_ui_->RegisterMessageCallback( 76 "AuthenticateUser", 77 NewCallback(this, 78 &LoginUIHandler::HandleAuthenticateUser)); 79 web_ui_->RegisterMessageCallback( 80 "ShutdownSystem", 81 NewCallback(this, 82 &LoginUIHandler::HandleShutdownSystem)); 83 } 84 85 void LoginUIHandler::HandleAuthenticateUser(const ListValue* args) { 86 std::string username; 87 std::string password; 88 size_t expected_size = 2; 89 CHECK_EQ(args->GetSize(), expected_size); 90 args->GetString(0, &username); 91 args->GetString(1, &password); 92 delegate_->Login(username, password); 93 } 94 95 void LoginUIHandler::HandleLaunchIncognito(const ListValue* args) { 96 delegate_->LoginAsGuest(); 97 } 98 99 void LoginUIHandler::HandleShutdownSystem(const ListValue* args) { 100 DCHECK(CrosLibrary::Get()->EnsureLoaded()); 101 CrosLibrary::Get()->GetPowerLibrary()->RequestShutdown(); 102 } 103 104 void LoginUIHandler::ClearAndEnablePassword() { 105 web_ui_->CallJavascriptFunction(kResetPrompt); 106 } 107 108 109 // LoginUI, public: ------------------------------------------------------------ 110 111 LoginUI::LoginUI(TabContents* contents) 112 : WebUI(contents) { 113 LoginUIHandler* handler = new LoginUIHandler(); 114 AddMessageHandler(handler->Attach(this)); 115 LoginUIHTMLSource* html_source = 116 new LoginUIHTMLSource(MessageLoop::current()); 117 118 contents->profile()->GetChromeURLDataManager()->AddDataSource(html_source); 119 } 120 121 } // namespace chromeos 122