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 26 namespace { 27 28 class 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 49 ProfileSigninConfirmationHandler::ProfileSigninConfirmationHandler( 50 const ProfileSigninConfirmationDialog* dialog, 51 ui::ProfileSigninConfirmationDelegate* delegate) 52 : dialog_(dialog), delegate_(delegate) { 53 } 54 55 ProfileSigninConfirmationHandler::~ProfileSigninConfirmationHandler() { 56 } 57 58 void 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 73 void ProfileSigninConfirmationHandler::OnCancelButtonClicked( 74 const base::ListValue* args) { 75 // TODO(dconnelly): redirect back to NTP? 76 delegate_->OnCancelSignin(); 77 dialog_->Close(); 78 } 79 80 void ProfileSigninConfirmationHandler::OnCreateProfileClicked( 81 const base::ListValue* args) { 82 delegate_->OnSigninWithNewProfile(); 83 dialog_->Close(); 84 } 85 86 void 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) 95 namespace chrome { 96 // static 97 // Declared in browser_dialogs.h 98 void 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 114 ProfileSigninConfirmationDialog::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 127 ProfileSigninConfirmationDialog::~ProfileSigninConfirmationDialog() { 128 } 129 130 // static 131 void 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 149 void ProfileSigninConfirmationDialog::Close() const { 150 closed_by_handler_ = true; 151 dialog_delegate_->OnDialogCloseFromWebUI(); 152 } 153 154 void ProfileSigninConfirmationDialog::Show(bool prompt) { 155 prompt_for_new_profile_ = prompt; 156 dialog_delegate_ = 157 CreateConstrainedWebDialog(profile_, this, NULL, web_contents_); 158 } 159 160 ui::ModalType ProfileSigninConfirmationDialog::GetDialogModalType() const { 161 return ui::MODAL_TYPE_WINDOW; 162 } 163 164 string16 ProfileSigninConfirmationDialog::GetDialogTitle() const { 165 return l10n_util::GetStringUTF16(IDS_ENTERPRISE_SIGNIN_TITLE); 166 } 167 168 GURL ProfileSigninConfirmationDialog::GetDialogContentURL() const { 169 return GURL(chrome::kChromeUIProfileSigninConfirmationURL); 170 } 171 172 void ProfileSigninConfirmationDialog::GetWebUIMessageHandlers( 173 std::vector<content::WebUIMessageHandler*>* handlers) const { 174 handlers->push_back( 175 new ProfileSigninConfirmationHandler(this, signin_delegate_)); 176 } 177 178 void 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 190 std::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 202 void ProfileSigninConfirmationDialog::OnDialogClosed( 203 const std::string& json_retval) { 204 if (!closed_by_handler_) 205 signin_delegate_->OnCancelSignin(); 206 } 207 208 void ProfileSigninConfirmationDialog::OnCloseContents( 209 content::WebContents* source, 210 bool* out_close_dialog) { 211 if (out_close_dialog) 212 *out_close_dialog = true; 213 } 214 215 bool ProfileSigninConfirmationDialog::ShouldShowDialogTitle() const { 216 return true; 217 } 218