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