| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/chromeos/login/existing_user_controller.h" | 5 #include "chrome/browser/chromeos/login/existing_user_controller.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <functional> | 8 #include <functional> |
| 9 #include <map> | 9 #include <map> |
| 10 | 10 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 | 40 |
| 41 namespace { | 41 namespace { |
| 42 | 42 |
| 43 // Max number of users we'll show. The true max is the min of this and the | 43 // Max number of users we'll show. The true max is the min of this and the |
| 44 // number of windows that fit on the screen. | 44 // number of windows that fit on the screen. |
| 45 const size_t kMaxUsers = 6; | 45 const size_t kMaxUsers = 6; |
| 46 | 46 |
| 47 // Used to indicate no user has been selected. | 47 // Used to indicate no user has been selected. |
| 48 const size_t kNotSelected = -1; | 48 const size_t kNotSelected = -1; |
| 49 | 49 |
| 50 // Offset of cursor in first position from edit left side. It's used to position |
| 51 // info bubble arrow to cursor. |
| 52 const int kCursorOffset = 5; |
| 53 |
| 50 // Checks if display names are unique. If there are duplicates, enables | 54 // Checks if display names are unique. If there are duplicates, enables |
| 51 // tooltips with full emails to let users distinguish their accounts. | 55 // tooltips with full emails to let users distinguish their accounts. |
| 52 // Otherwise, disables the tooltips. | 56 // Otherwise, disables the tooltips. |
| 53 void EnableTooltipsIfNeeded(const std::vector<UserController*>& controllers) { | 57 void EnableTooltipsIfNeeded(const std::vector<UserController*>& controllers) { |
| 54 std::map<std::string, int> visible_display_names; | 58 std::map<std::string, int> visible_display_names; |
| 55 for (size_t i = 0; i + 1 < controllers.size(); ++i) { | 59 for (size_t i = 0; i + 1 < controllers.size(); ++i) { |
| 56 const std::string& display_name = | 60 const std::string& display_name = |
| 57 controllers[i]->user().GetDisplayName(); | 61 controllers[i]->user().GetDisplayName(); |
| 58 ++visible_display_names[display_name]; | 62 ++visible_display_names[display_name]; |
| 59 } | 63 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 70 ExistingUserController* | 74 ExistingUserController* |
| 71 ExistingUserController::delete_scheduled_instance_ = NULL; | 75 ExistingUserController::delete_scheduled_instance_ = NULL; |
| 72 | 76 |
| 73 ExistingUserController::ExistingUserController( | 77 ExistingUserController::ExistingUserController( |
| 74 const std::vector<UserManager::User>& users, | 78 const std::vector<UserManager::User>& users, |
| 75 const gfx::Rect& background_bounds) | 79 const gfx::Rect& background_bounds) |
| 76 : background_bounds_(background_bounds), | 80 : background_bounds_(background_bounds), |
| 77 background_window_(NULL), | 81 background_window_(NULL), |
| 78 background_view_(NULL), | 82 background_view_(NULL), |
| 79 selected_view_index_(kNotSelected), | 83 selected_view_index_(kNotSelected), |
| 84 num_login_attempts_(0), |
| 80 bubble_(NULL) { | 85 bubble_(NULL) { |
| 81 if (delete_scheduled_instance_) | 86 if (delete_scheduled_instance_) |
| 82 delete_scheduled_instance_->Delete(); | 87 delete_scheduled_instance_->Delete(); |
| 83 | 88 |
| 84 // Caclulate the max number of users from available screen size. | 89 // Caclulate the max number of users from available screen size. |
| 85 size_t max_users = kMaxUsers; | 90 size_t max_users = kMaxUsers; |
| 86 int screen_width = background_bounds.width(); | 91 int screen_width = background_bounds.width(); |
| 87 if (screen_width > 0) { | 92 if (screen_width > 0) { |
| 88 max_users = std::max(static_cast<size_t>(2), std::min(kMaxUsers, | 93 max_users = std::max(static_cast<size_t>(2), std::min(kMaxUsers, |
| 89 static_cast<size_t>((screen_width - login::kUserImageSize) | 94 static_cast<size_t>((screen_width - login::kUserImageSize) |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 182 message.set_param(0, is_enabled); | 187 message.set_param(0, is_enabled); |
| 183 WmIpc::instance()->SendMessage(message); | 188 WmIpc::instance()->SendMessage(message); |
| 184 } | 189 } |
| 185 | 190 |
| 186 void ExistingUserController::Login(UserController* source, | 191 void ExistingUserController::Login(UserController* source, |
| 187 const string16& password) { | 192 const string16& password) { |
| 188 BootTimesLoader::Get()->RecordLoginAttempted(); | 193 BootTimesLoader::Get()->RecordLoginAttempted(); |
| 189 std::vector<UserController*>::const_iterator i = | 194 std::vector<UserController*>::const_iterator i = |
| 190 std::find(controllers_.begin(), controllers_.end(), source); | 195 std::find(controllers_.begin(), controllers_.end(), source); |
| 191 DCHECK(i != controllers_.end()); | 196 DCHECK(i != controllers_.end()); |
| 192 selected_view_index_ = i - controllers_.begin(); | 197 |
| 198 if (selected_view_index_ == static_cast<size_t>(i - controllers_.begin())) { |
| 199 num_login_attempts_++; |
| 200 } else { |
| 201 selected_view_index_ = i - controllers_.begin(); |
| 202 num_login_attempts_ = 0; |
| 203 } |
| 193 | 204 |
| 194 authenticator_ = LoginUtils::Get()->CreateAuthenticator(this); | 205 authenticator_ = LoginUtils::Get()->CreateAuthenticator(this); |
| 195 Profile* profile = g_browser_process->profile_manager()->GetDefaultProfile(); | 206 Profile* profile = g_browser_process->profile_manager()->GetDefaultProfile(); |
| 196 ChromeThread::PostTask( | 207 ChromeThread::PostTask( |
| 197 ChromeThread::UI, FROM_HERE, | 208 ChromeThread::UI, FROM_HERE, |
| 198 NewRunnableMethod(authenticator_.get(), | 209 NewRunnableMethod(authenticator_.get(), |
| 199 &Authenticator::AuthenticateToLogin, | 210 &Authenticator::AuthenticateToLogin, |
| 200 profile, | 211 profile, |
| 201 controllers_[selected_view_index_]->user().email(), | 212 controllers_[selected_view_index_]->user().email(), |
| 202 UTF16ToUTF8(password), | 213 UTF16ToUTF8(password), |
| (...skipping 23 matching lines...) Expand all Loading... |
| 226 | 237 |
| 227 void ExistingUserController::OnUserSelected(UserController* source) { | 238 void ExistingUserController::OnUserSelected(UserController* source) { |
| 228 std::vector<UserController*>::const_iterator i = | 239 std::vector<UserController*>::const_iterator i = |
| 229 std::find(controllers_.begin(), controllers_.end(), source); | 240 std::find(controllers_.begin(), controllers_.end(), source); |
| 230 DCHECK(i != controllers_.end()); | 241 DCHECK(i != controllers_.end()); |
| 231 size_t new_selected_index = i - controllers_.begin(); | 242 size_t new_selected_index = i - controllers_.begin(); |
| 232 if (new_selected_index != selected_view_index_ && | 243 if (new_selected_index != selected_view_index_ && |
| 233 selected_view_index_ != kNotSelected) { | 244 selected_view_index_ != kNotSelected) { |
| 234 controllers_[selected_view_index_]->ClearAndEnableFields(); | 245 controllers_[selected_view_index_]->ClearAndEnableFields(); |
| 235 ClearCaptchaState(); | 246 ClearCaptchaState(); |
| 247 num_login_attempts_ = 0; |
| 236 } | 248 } |
| 237 selected_view_index_ = new_selected_index; | 249 selected_view_index_ = new_selected_index; |
| 238 } | 250 } |
| 239 | 251 |
| 240 void ExistingUserController::ActivateWizard(const std::string& screen_name) { | 252 void ExistingUserController::ActivateWizard(const std::string& screen_name) { |
| 241 // WizardController takes care of deleting itself when done. | 253 // WizardController takes care of deleting itself when done. |
| 242 WizardController* controller = new WizardController(); | 254 WizardController* controller = new WizardController(); |
| 243 | 255 |
| 244 // Give the background window to the controller. | 256 // Give the background window to the controller. |
| 245 controller->OwnBackground(background_window_, background_view_); | 257 controller->OwnBackground(background_window_, background_view_); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 305 view->set_delegate(this); | 317 view->set_delegate(this); |
| 306 views::Window* window = views::Window::CreateChromeWindow( | 318 views::Window* window = views::Window::CreateChromeWindow( |
| 307 GetNativeWindow(), gfx::Rect(), view); | 319 GetNativeWindow(), gfx::Rect(), view); |
| 308 window->SetIsAlwaysOnTop(true); | 320 window->SetIsAlwaysOnTop(true); |
| 309 window->Show(); | 321 window->Show(); |
| 310 } else { | 322 } else { |
| 311 LOG(WARNING) << "No captcha image url was found?"; | 323 LOG(WARNING) << "No captcha image url was found?"; |
| 312 ShowError(IDS_LOGIN_ERROR_AUTHENTICATING, error); | 324 ShowError(IDS_LOGIN_ERROR_AUTHENTICATING, error); |
| 313 } | 325 } |
| 314 } else { | 326 } else { |
| 315 ShowError(IDS_LOGIN_ERROR_AUTHENTICATING, error); | 327 if (controllers_[selected_view_index_]->is_guest()) |
| 328 ShowError(IDS_LOGIN_ERROR_AUTHENTICATING_NEW, error); |
| 329 else |
| 330 ShowError(IDS_LOGIN_ERROR_AUTHENTICATING, error); |
| 316 } | 331 } |
| 317 } | 332 } |
| 318 | 333 |
| 319 controllers_[selected_view_index_]->ClearAndEnablePassword(); | 334 controllers_[selected_view_index_]->ClearAndEnablePassword(); |
| 320 | 335 |
| 321 // Reenable clicking on other windows. | 336 // Reenable clicking on other windows. |
| 322 SendSetLoginState(true); | 337 SendSetLoginState(true); |
| 323 } | 338 } |
| 324 | 339 |
| 325 void ExistingUserController::AppendStartUrlToCmdline() { | 340 void ExistingUserController::AppendStartUrlToCmdline() { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 338 } | 353 } |
| 339 | 354 |
| 340 void ExistingUserController::ShowError(int error_id, | 355 void ExistingUserController::ShowError(int error_id, |
| 341 const std::string& details) { | 356 const std::string& details) { |
| 342 ClearErrors(); | 357 ClearErrors(); |
| 343 std::wstring error_text = l10n_util::GetString(error_id); | 358 std::wstring error_text = l10n_util::GetString(error_id); |
| 344 // TODO(dpolukhin): show detailed error info. |details| string contains | 359 // TODO(dpolukhin): show detailed error info. |details| string contains |
| 345 // low level error info that is not localized and even is not user friendly. | 360 // low level error info that is not localized and even is not user friendly. |
| 346 // For now just ignore it because error_text contains all required information | 361 // For now just ignore it because error_text contains all required information |
| 347 // for end users, developers can see details string in Chrome logs. | 362 // for end users, developers can see details string in Chrome logs. |
| 363 |
| 364 gfx::Rect bounds = controllers_[selected_view_index_]->GetScreenBounds(); |
| 365 BubbleBorder::ArrowLocation arrow; |
| 366 if (controllers_[selected_view_index_]->is_guest()) { |
| 367 arrow = BubbleBorder::LEFT_TOP; |
| 368 } else { |
| 369 // Point info bubble arrow to cursor position (approximately). |
| 370 bounds.set_width(kCursorOffset * 2); |
| 371 arrow = BubbleBorder::BOTTOM_LEFT; |
| 372 } |
| 373 std::wstring help_link; |
| 374 if (num_login_attempts_ > static_cast<size_t>(1)) |
| 375 help_link = l10n_util::GetString(IDS_CANT_ACCESS_ACCOUNT_BUTTON); |
| 376 |
| 348 bubble_ = MessageBubble::Show( | 377 bubble_ = MessageBubble::Show( |
| 349 controllers_[selected_view_index_]->controls_window(), | 378 controllers_[selected_view_index_]->controls_window(), |
| 350 controllers_[selected_view_index_]->GetScreenBounds(), | 379 bounds, |
| 351 BubbleBorder::BOTTOM_LEFT, | 380 arrow, |
| 352 ResourceBundle::GetSharedInstance().GetBitmapNamed(IDR_WARNING), | 381 ResourceBundle::GetSharedInstance().GetBitmapNamed(IDR_WARNING), |
| 353 error_text, | 382 error_text, |
| 383 help_link, |
| 354 this); | 384 this); |
| 355 } | 385 } |
| 356 | 386 |
| 357 void ExistingUserController::OnLoginSuccess(const std::string& username, | 387 void ExistingUserController::OnLoginSuccess(const std::string& username, |
| 358 const GaiaAuthConsumer::ClientLoginResult& credentials) { | 388 const GaiaAuthConsumer::ClientLoginResult& credentials) { |
| 359 | 389 |
| 360 AppendStartUrlToCmdline(); | 390 AppendStartUrlToCmdline(); |
| 361 if (selected_view_index_ + 1 == controllers_.size()) { | 391 if (selected_view_index_ + 1 == controllers_.size()) { |
| 362 // For new user login don't launch browser until we pass image screen. | 392 // For new user login don't launch browser until we pass image screen. |
| 363 LoginUtils::Get()->EnableBrowserLaunch(false); | 393 LoginUtils::Get()->EnableBrowserLaunch(false); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 395 | 425 |
| 396 cached_credentials_ = credentials; | 426 cached_credentials_ = credentials; |
| 397 PasswordChangedView* view = new PasswordChangedView(this); | 427 PasswordChangedView* view = new PasswordChangedView(this); |
| 398 views::Window* window = views::Window::CreateChromeWindow(GetNativeWindow(), | 428 views::Window* window = views::Window::CreateChromeWindow(GetNativeWindow(), |
| 399 gfx::Rect(), | 429 gfx::Rect(), |
| 400 view); | 430 view); |
| 401 window->SetIsAlwaysOnTop(true); | 431 window->SetIsAlwaysOnTop(true); |
| 402 window->Show(); | 432 window->Show(); |
| 403 } | 433 } |
| 404 | 434 |
| 435 void ExistingUserController::OnHelpLinkActivated() { |
| 436 AddStartUrl(GetAccountRecoveryHelpUrl()); |
| 437 LoginOffTheRecord(); |
| 438 } |
| 439 |
| 405 void ExistingUserController::OnCaptchaEntered(const std::string& captcha) { | 440 void ExistingUserController::OnCaptchaEntered(const std::string& captcha) { |
| 406 login_captcha_ = captcha; | 441 login_captcha_ = captcha; |
| 407 } | 442 } |
| 408 | 443 |
| 409 void ExistingUserController::RecoverEncryptedData( | 444 void ExistingUserController::RecoverEncryptedData( |
| 410 const std::string& old_password) { | 445 const std::string& old_password) { |
| 411 ChromeThread::PostTask( | 446 ChromeThread::PostTask( |
| 412 ChromeThread::UI, FROM_HERE, | 447 ChromeThread::UI, FROM_HERE, |
| 413 NewRunnableMethod(authenticator_.get(), | 448 NewRunnableMethod(authenticator_.get(), |
| 414 &Authenticator::RecoverEncryptedData, | 449 &Authenticator::RecoverEncryptedData, |
| 415 old_password, | 450 old_password, |
| 416 cached_credentials_)); | 451 cached_credentials_)); |
| 417 cached_credentials_ = GaiaAuthConsumer::ClientLoginResult(); | 452 cached_credentials_ = GaiaAuthConsumer::ClientLoginResult(); |
| 418 } | 453 } |
| 419 | 454 |
| 420 void ExistingUserController::ResyncEncryptedData() { | 455 void ExistingUserController::ResyncEncryptedData() { |
| 421 ChromeThread::PostTask( | 456 ChromeThread::PostTask( |
| 422 ChromeThread::UI, FROM_HERE, | 457 ChromeThread::UI, FROM_HERE, |
| 423 NewRunnableMethod(authenticator_.get(), | 458 NewRunnableMethod(authenticator_.get(), |
| 424 &Authenticator::ResyncEncryptedData, | 459 &Authenticator::ResyncEncryptedData, |
| 425 cached_credentials_)); | 460 cached_credentials_)); |
| 426 cached_credentials_ = GaiaAuthConsumer::ClientLoginResult(); | 461 cached_credentials_ = GaiaAuthConsumer::ClientLoginResult(); |
| 427 } | 462 } |
| 428 | 463 |
| 429 } // namespace chromeos | 464 } // namespace chromeos |
| OLD | NEW |