1// Copyright (c) 2013 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/signin/profile_signin_confirmation_dialog.h"
6
7#include "base/basictypes.h"
8#include "base/json/json_writer.h"
9#include "base/logging.h"
10#include "base/values.h"
11#include "chrome/browser/profiles/profile_manager.h"
12#include "chrome/browser/ui/browser.h"
13#include "chrome/browser/ui/browser_dialogs.h"
14#include "chrome/browser/ui/browser_window.h"
15#include "chrome/browser/ui/webui/constrained_web_dialog_ui.h"
16#include "chrome/common/url_constants.h"
17#include "content/public/browser/web_ui.h"
18#include "content/public/browser/web_ui_message_handler.h"
19#include "grit/browser_resources.h"
20#include "grit/chromium_strings.h"
21#include "grit/generated_resources.h"
22#include "ui/base/l10n/l10n_util.h"
23
24// ProfileSigninConfirmationHandler --------------------------------------------
25
26namespace {
27
28class ProfileSigninConfirmationHandler : public content::WebUIMessageHandler {
29 public:
30  ProfileSigninConfirmationHandler(
31      const ProfileSigninConfirmationDialog* dialog,
32      ui::ProfileSigninConfirmationDelegate* delegate_);
33  virtual ~ProfileSigninConfirmationHandler();
34  virtual void RegisterMessages() OVERRIDE;
35
36 private:
37  // content::WebUIMessageHandler implementation.
38  void OnCancelButtonClicked(const base::ListValue* args);
39  void OnCreateProfileClicked(const base::ListValue* args);
40  void OnContinueButtonClicked(const base::ListValue* args);
41
42  // Weak ptr to parent dialog.
43  const ProfileSigninConfirmationDialog* dialog_;
44
45  // Dialog button handling.
46  ui::ProfileSigninConfirmationDelegate* delegate_;
47};
48
49ProfileSigninConfirmationHandler::ProfileSigninConfirmationHandler(
50    const ProfileSigninConfirmationDialog* dialog,
51    ui::ProfileSigninConfirmationDelegate* delegate)
52  : dialog_(dialog), delegate_(delegate) {
53}
54
55ProfileSigninConfirmationHandler::~ProfileSigninConfirmationHandler() {
56}
57
58void ProfileSigninConfirmationHandler::RegisterMessages() {
59  web_ui()->RegisterMessageCallback(
60      "cancel",
61      base::Bind(&ProfileSigninConfirmationHandler::OnCancelButtonClicked,
62                 base::Unretained(this)));
63  web_ui()->RegisterMessageCallback(
64      "createNewProfile",
65      base::Bind(&ProfileSigninConfirmationHandler::OnCreateProfileClicked,
66                 base::Unretained(this)));
67  web_ui()->RegisterMessageCallback(
68      "continue",
69      base::Bind(&ProfileSigninConfirmationHandler::OnContinueButtonClicked,
70                 base::Unretained(this)));
71}
72
73void ProfileSigninConfirmationHandler::OnCancelButtonClicked(
74    const base::ListValue* args) {
75  // TODO(dconnelly): redirect back to NTP?
76  delegate_->OnCancelSignin();
77  dialog_->Close();
78}
79
80void ProfileSigninConfirmationHandler::OnCreateProfileClicked(
81    const base::ListValue* args) {
82  delegate_->OnSigninWithNewProfile();
83  dialog_->Close();
84}
85
86void ProfileSigninConfirmationHandler::OnContinueButtonClicked(
87    const base::ListValue* args) {
88  delegate_->OnContinueSignin();
89  dialog_->Close();
90}
91
92}  // namespace
93
94#if !defined(TOOLKIT_VIEWS) && !defined(OS_MACOSX)
95namespace chrome {
96// static
97// Declared in browser_dialogs.h
98void ShowProfileSigninConfirmationDialog(
99    Browser* browser,
100    content::WebContents* web_contents,
101    Profile* profile,
102    const std::string& username,
103    ui::ProfileSigninConfirmationDelegate* delegate) {
104  ProfileSigninConfirmationDialog::ShowDialog(web_contents,
105                                              profile,
106                                              username,
107                                              delegate);
108}
109}  // namespace chrome
110#endif
111
112// ProfileSigninConfirmationDialog ---------------------------------------------
113
114ProfileSigninConfirmationDialog::ProfileSigninConfirmationDialog(
115    content::WebContents* web_contents,
116    Profile* profile,
117    const std::string& username,
118    ui::ProfileSigninConfirmationDelegate* delegate)
119  : web_contents_(web_contents),
120    profile_(profile),
121    username_(username),
122    signin_delegate_(delegate),
123    dialog_delegate_(NULL),
124    prompt_for_new_profile_(true) {
125}
126
127ProfileSigninConfirmationDialog::~ProfileSigninConfirmationDialog() {
128}
129
130// static
131void ProfileSigninConfirmationDialog::ShowDialog(
132  content::WebContents* web_contents,
133  Profile* profile,
134  const std::string& username,
135  ui::ProfileSigninConfirmationDelegate* delegate) {
136  ProfileSigninConfirmationDialog* dialog =
137      new ProfileSigninConfirmationDialog(web_contents,
138                                          profile,
139                                          username,
140                                          delegate);
141  ui::CheckShouldPromptForNewProfile(
142      profile,
143      // This callback is guaranteed to be invoked, and once it is, the dialog
144      // owns itself.
145      base::Bind(&ProfileSigninConfirmationDialog::Show,
146                 base::Unretained(dialog)));
147}
148
149void ProfileSigninConfirmationDialog::Close() const {
150  closed_by_handler_ = true;
151  dialog_delegate_->OnDialogCloseFromWebUI();
152}
153
154void ProfileSigninConfirmationDialog::Show(bool prompt) {
155  prompt_for_new_profile_ = prompt;
156  dialog_delegate_ =
157      CreateConstrainedWebDialog(profile_, this, NULL, web_contents_);
158}
159
160ui::ModalType ProfileSigninConfirmationDialog::GetDialogModalType() const {
161  return ui::MODAL_TYPE_WINDOW;
162}
163
164base::string16 ProfileSigninConfirmationDialog::GetDialogTitle() const {
165  return l10n_util::GetStringUTF16(IDS_ENTERPRISE_SIGNIN_TITLE);
166}
167
168GURL ProfileSigninConfirmationDialog::GetDialogContentURL() const {
169  return GURL(chrome::kChromeUIProfileSigninConfirmationURL);
170}
171
172void ProfileSigninConfirmationDialog::GetWebUIMessageHandlers(
173    std::vector<content::WebUIMessageHandler*>* handlers) const {
174  handlers->push_back(
175      new ProfileSigninConfirmationHandler(this, signin_delegate_));
176}
177
178void ProfileSigninConfirmationDialog::GetDialogSize(gfx::Size* size) const {
179  const int kMinimumDialogWidth = 480;
180#if defined(OS_WIN)
181  const int kMinimumDialogHeight = 180;
182#else
183  const int kMinimumDialogHeight = 210;
184#endif
185  const int kProfileCreationMessageHeight = prompt_for_new_profile_ ? 50 : 0;
186  size->SetSize(kMinimumDialogWidth,
187                kMinimumDialogHeight + kProfileCreationMessageHeight);
188}
189
190std::string ProfileSigninConfirmationDialog::GetDialogArgs() const {
191  std::string data;
192  base::DictionaryValue dict;
193  dict.SetString("username", username_);
194  dict.SetBoolean("promptForNewProfile", prompt_for_new_profile_);
195#if defined(OS_WIN)
196  dict.SetBoolean("hideTitle", true);
197#endif
198  base::JSONWriter::Write(&dict, &data);
199  return data;
200}
201
202void ProfileSigninConfirmationDialog::OnDialogClosed(
203    const std::string& json_retval) {
204  if (!closed_by_handler_)
205    signin_delegate_->OnCancelSignin();
206}
207
208void ProfileSigninConfirmationDialog::OnCloseContents(
209    content::WebContents* source,
210    bool* out_close_dialog) {
211  if (out_close_dialog)
212    *out_close_dialog = true;
213}
214
215bool ProfileSigninConfirmationDialog::ShouldShowDialogTitle() const {
216  return true;
217}
218