172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// found in the LICENSE file. 4513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 5513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/browser_signin.h" 6513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 7513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include <string> 8513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include <vector> 9513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 10513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "base/json/json_reader.h" 11513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "base/json/json_writer.h" 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/singleton.h" 13513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "base/message_loop.h" 14513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "base/string_util.h" 15513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "base/values.h" 16513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/prefs/pref_service.h" 1721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h" 18513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/sync/profile_sync_service.h" 19513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/sync/sync_setup_flow.h" 20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/chrome_url_data_manager.h" 21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/constrained_html_ui.h" 22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/html_dialog_ui.h" 23513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/common/jstemplate_builder.h" 24513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/common/pref_names.h" 25513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/common/url_constants.h" 26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h" 27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host.h" 28dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h" 29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_details.h" 30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_source.h" 31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_type.h" 32513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "grit/browser_resources.h" 3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/resource/resource_bundle.h" 34513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 35513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass BrowserSigninResourcesSource : public ChromeURLDataManager::DataSource { 36513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public: 37513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch BrowserSigninResourcesSource() 38513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch : DataSource(chrome::kChromeUIDialogHost, MessageLoop::current()) { 39513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 40513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 41513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual void StartDataRequest(const std::string& path, 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool is_incognito, 43513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int request_id); 44513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 45513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual std::string GetMimeType(const std::string& path) const { 46513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return "text/html"; 47513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 48513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 49513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch private: 50513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual ~BrowserSigninResourcesSource() {} 51513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 52513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch DISALLOW_COPY_AND_ASSIGN(BrowserSigninResourcesSource); 53513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}; 54513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 55513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid BrowserSigninResourcesSource::StartDataRequest(const std::string& path, 56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool is_incognito, 57513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int request_id) { 58513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const char kSigninPath[] = "signin"; 59513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 60513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string response; 61513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch if (path == kSigninPath) { 62513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const base::StringPiece html( 63513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ResourceBundle::GetSharedInstance().GetRawDataResource( 64513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch IDR_SIGNIN_HTML)); 65513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch DictionaryValue dict; 66513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch SetFontAndTextDirection(&dict); 67513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch response = jstemplate_builder::GetI18nTemplateHtml(html, &dict); 68513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 69513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 70513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<RefCountedBytes> html_bytes(new RefCountedBytes); 71513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch html_bytes->data.resize(response.size()); 72513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::copy(response.begin(), response.end(), html_bytes->data.begin()); 73513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch SendResponse(request_id, html_bytes); 74513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 75513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 76513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass BrowserSigninHtml : public HtmlDialogUIDelegate, 7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public WebUIMessageHandler { 78513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public: 79513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch BrowserSigninHtml(BrowserSignin* signin, 80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const string16& suggested_email, 81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const string16& login_message); 82513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual ~BrowserSigninHtml() {} 83513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 84513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // HtmlDialogUIDelegate implementation 85513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual bool IsDialogModal() const { 86513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return false; 87513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch }; 88513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual std::wstring GetDialogTitle() const { 89513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return L""; 90513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 91513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual GURL GetDialogContentURL() const { 92513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return GURL("chrome://dialog/signin"); 93513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual void GetWebUIMessageHandlers( 9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::vector<WebUIMessageHandler*>* handlers) const { 9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const WebUIMessageHandler* handler = this; 9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen handlers->push_back(const_cast<WebUIMessageHandler*>(handler)); 98513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 99513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual void GetDialogSize(gfx::Size* size) const { 100513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch size->set_width(600); 101513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch size->set_height(300); 102513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 103513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual std::string GetDialogArgs() const { 104513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return UTF16ToASCII(login_message_); 105513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 106513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual void OnDialogClosed(const std::string& json_retval) { 107513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch closed_ = true; 108513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch signin_->Cancel(); 109513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 110513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual void OnCloseContents(TabContents* source, bool* out_close_dialog) { 111513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 112513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual bool ShouldShowDialogTitle() const { return true; } 113513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // WebUIMessageHandler implementation. 115513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual void RegisterMessages(); 116513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 117513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Refreshes the UI, such as after an authentication error. 118513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void ReloadUI(); 119513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 120513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Method which calls into javascript to force the dialog to close. 121513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void ForceDialogClose(); 122513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 123513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch private: 124513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // JS callback handlers. 125513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void HandleSigninInit(const ListValue* args); 126513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void HandleSubmitAuth(const ListValue* args); 127513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 128513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Nonowned pointer; |signin_| owns this object. 129513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch BrowserSignin* signin_; 130513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 131513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch string16 suggested_email_; 132513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch string16 login_message_; 133513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 134513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool closed_; 135513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}; 136513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 137513209b27ff55e2841eac0e4120199c23acce758Ben MurdochBrowserSigninHtml::BrowserSigninHtml(BrowserSignin* signin, 138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const string16& suggested_email, 139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const string16& login_message) 140513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch : signin_(signin), 141513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch suggested_email_(suggested_email), 142513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch login_message_(login_message), 143513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch closed_(false) { 144513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 145513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 146513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid BrowserSigninHtml::RegisterMessages() { 14772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen web_ui_->RegisterMessageCallback( 148513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch "SubmitAuth", NewCallback(this, &BrowserSigninHtml::HandleSubmitAuth)); 14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen web_ui_->RegisterMessageCallback( 150513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch "SigninInit", NewCallback(this, &BrowserSigninHtml::HandleSigninInit)); 151513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 152513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 153513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid BrowserSigninHtml::ReloadUI() { 154513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch HandleSigninInit(NULL); 155513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 156513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 157513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid BrowserSigninHtml::ForceDialogClose() { 15872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!closed_ && web_ui_) { 159513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch StringValue value("DialogClose"); 160513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ListValue close_args; 161513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch close_args.Append(new StringValue("")); 162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->CallJavascriptFunction("chrome.send", value, close_args); 163513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 164513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 165513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 166513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid BrowserSigninHtml::HandleSigninInit(const ListValue* args) { 16772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!web_ui_) 168513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return; 169513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 17072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RenderViewHost* rvh = web_ui_->tab_contents()->render_view_host(); 17172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen rvh->ExecuteJavascriptInWebFrame(ASCIIToUTF16("//iframe[@id='login']"), 17272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASCIIToUTF16("hideBlurb();")); 173513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 174513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch DictionaryValue json_args; 175513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string json; 176513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::wstring javascript(L""); 177513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch SyncSetupFlow::GetArgsForGaiaLogin(signin_->GetProfileSyncService(), 178513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch &json_args); 179513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 180513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Replace the suggested email, unless sync has already required a 181513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // particular value. 182513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool is_editable; 183513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string user; 184513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch json_args.GetBoolean("editable_user", &is_editable); 185513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch json_args.GetString("user", &user); 186513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch if (is_editable && user.empty() && !suggested_email_.empty()) 187513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch json_args.SetString("user", suggested_email_); 188513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 189513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch base::JSONWriter::Write(&json_args, false, &json); 190513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch javascript += L"showGaiaLogin(" + UTF8ToWide(json) + L");"; 19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen rvh->ExecuteJavascriptInWebFrame(ASCIIToUTF16("//iframe[@id='login']"), 19272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen WideToUTF16Hack(javascript)); 193513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 194513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 195513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid BrowserSigninHtml::HandleSubmitAuth(const ListValue* args) { 196dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::string json; 197dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!args->GetString(0, &json)) 198dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen NOTREACHED() << "Could not read JSON argument"; 199dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 200513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_ptr<DictionaryValue> result(static_cast<DictionaryValue*>( 201513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch base::JSONReader::Read(json, false))); 202513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string username; 203513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string password; 204513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string captcha; 205513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string access_code; 206513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch if (!result.get() || 207513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch !result->GetString("user", &username) || 208513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch !result->GetString("pass", &password) || 209513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch !result->GetString("captcha", &captcha) || 210513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch !result->GetString("access_code", &access_code)) { 211513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch LOG(ERROR) << "Unintelligble format for authentication data from page."; 212513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch signin_->Cancel(); 213513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 214513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch signin_->GetProfileSyncService()->OnUserSubmittedAuth( 215513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch username, password, captcha, access_code); 216513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 217513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 218513209b27ff55e2841eac0e4120199c23acce758Ben MurdochBrowserSignin::BrowserSignin(Profile* profile) 219513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch : profile_(profile), 220513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch delegate_(NULL), 221513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch html_dialog_ui_delegate_(NULL) { 22272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // profile is NULL during testing. 22372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (profile) { 22472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen BrowserSigninResourcesSource* source = new BrowserSigninResourcesSource(); 22572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen profile->GetChromeURLDataManager()->AddDataSource(source); 22672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 227513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 228513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 229513209b27ff55e2841eac0e4120199c23acce758Ben MurdochBrowserSignin::~BrowserSignin() { 230513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch delegate_ = NULL; 231513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 232513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 233513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid BrowserSignin::RequestSignin(TabContents* tab_contents, 234513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const string16& suggested_email, 235513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const string16& login_message, 236513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch SigninDelegate* delegate) { 237513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch CHECK(tab_contents); 238513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch CHECK(delegate); 239513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Cancel existing request. 240513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch if (delegate_) 241513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Cancel(); 242513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch delegate_ = delegate; 243513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch suggested_email_ = suggested_email; 244513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch login_message_ = login_message; 245513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch RegisterAuthNotifications(); 246513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ShowSigninTabModal(tab_contents); 247513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 248513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 249513209b27ff55e2841eac0e4120199c23acce758Ben Murdochstd::string BrowserSignin::GetSignedInUsername() const { 250513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string username = 251513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch profile_->GetPrefs()->GetString(prefs::kGoogleServicesUsername); 252513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch VLOG(1) << "GetSignedInUsername: " << username; 253513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return username; 254513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 255513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 256513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid BrowserSignin::Observe(NotificationType type, 257513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const NotificationSource& source, 258513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const NotificationDetails& details) { 259513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch switch (type.value) { 260513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch case NotificationType::GOOGLE_SIGNIN_SUCCESSFUL: { 261513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch VLOG(1) << "GOOGLE_SIGNIN_SUCCESSFUL"; 262513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch if (delegate_) 263513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch delegate_->OnLoginSuccess(); 264513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Close the dialog. 265513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch OnLoginFinished(); 266513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch break; 267513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 268513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch case NotificationType::GOOGLE_SIGNIN_FAILED: { 269513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch VLOG(1) << "GOOGLE_SIGNIN_FAILED"; 270513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The signin failed, refresh the UI with error information. 271513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch html_dialog_ui_delegate_->ReloadUI(); 272513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch break; 273513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 274513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch default: 275513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch NOTREACHED(); 276513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 277513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 278513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 279513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid BrowserSignin::Cancel() { 280513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch if (delegate_) { 281513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch delegate_->OnLoginFailure(GoogleServiceAuthError( 282513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch GoogleServiceAuthError::REQUEST_CANCELED)); 283201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch GetProfileSyncService()->OnUserCancelledDialog(); 284513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 285513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch OnLoginFinished(); 286513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 287513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 288513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid BrowserSignin::OnLoginFinished() { 289513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch if (html_dialog_ui_delegate_) 290513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch html_dialog_ui_delegate_->ForceDialogClose(); 29172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // The dialog will be deleted by WebUI due to the dialog close, 292513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // don't hold a reference. 293513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch html_dialog_ui_delegate_ = NULL; 294513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 295513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch if (delegate_) { 296513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch UnregisterAuthNotifications(); 297513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch delegate_ = NULL; 298513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 299513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 300513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 301513209b27ff55e2841eac0e4120199c23acce758Ben MurdochProfileSyncService* BrowserSignin::GetProfileSyncService() const { 302513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return profile_->GetProfileSyncService(); 303513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 304513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 305513209b27ff55e2841eac0e4120199c23acce758Ben MurdochBrowserSigninHtml* BrowserSignin::CreateHtmlDialogUI() { 306513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return new BrowserSigninHtml(this, suggested_email_, login_message_); 307513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 308513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 309513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid BrowserSignin::RegisterAuthNotifications() { 310513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch registrar_.Add(this, 311513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch NotificationType::GOOGLE_SIGNIN_SUCCESSFUL, 312513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Source<Profile>(profile_)); 313513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch registrar_.Add(this, 314513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch NotificationType::GOOGLE_SIGNIN_FAILED, 315513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Source<Profile>(profile_)); 316513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 317513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 318513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid BrowserSignin::UnregisterAuthNotifications() { 319513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch registrar_.Remove(this, 320513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch NotificationType::GOOGLE_SIGNIN_SUCCESSFUL, 321513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Source<Profile>(profile_)); 322513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch registrar_.Remove(this, 323513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch NotificationType::GOOGLE_SIGNIN_FAILED, 324513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Source<Profile>(profile_)); 325513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 326513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 327513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid BrowserSignin::ShowSigninTabModal(TabContents* tab_contents) { 328513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// TODO(johnnyg): Need a linux views implementation for ConstrainedHtmlDialog. 329201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#if defined(OS_WIN) || defined(OS_CHROMEOS) || !defined(TOOLKIT_VIEWS) 330513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch html_dialog_ui_delegate_ = CreateHtmlDialogUI(); 331513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ConstrainedHtmlUI::CreateConstrainedHtmlDialog(profile_, 332513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch html_dialog_ui_delegate_, 333513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch tab_contents); 334513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#endif 335513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 336