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