| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/ui/passwords/manage_passwords_bubble_model.h" | 5 #include "chrome/browser/ui/passwords/manage_passwords_bubble_model.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <limits> | 10 #include <limits> |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 54 const std::vector<std::unique_ptr<autofill::PasswordForm>>& forms) { | 54 const std::vector<std::unique_ptr<autofill::PasswordForm>>& forms) { |
| 55 std::vector<autofill::PasswordForm> result; | 55 std::vector<autofill::PasswordForm> result; |
| 56 result.reserve(forms.size()); | 56 result.reserve(forms.size()); |
| 57 std::transform(forms.begin(), forms.end(), std::back_inserter(result), | 57 std::transform(forms.begin(), forms.end(), std::back_inserter(result), |
| 58 [](const std::unique_ptr<autofill::PasswordForm>& form) { | 58 [](const std::unique_ptr<autofill::PasswordForm>& form) { |
| 59 return *form; | 59 return *form; |
| 60 }); | 60 }); |
| 61 return result; | 61 return result; |
| 62 } | 62 } |
| 63 | 63 |
| 64 password_bubble_experiment::SmartLockBranding GetSmartLockBrandingState( | 64 bool IsSmartLockUser(Profile* profile) { |
| 65 Profile* profile) { | |
| 66 const browser_sync::ProfileSyncService* sync_service = | 65 const browser_sync::ProfileSyncService* sync_service = |
| 67 ProfileSyncServiceFactory::GetForProfile(profile); | 66 ProfileSyncServiceFactory::GetForProfile(profile); |
| 68 return password_bubble_experiment::GetSmartLockBrandingState(sync_service); | 67 return password_bubble_experiment::IsSmartLockUser(sync_service); |
| 69 } | 68 } |
| 70 | 69 |
| 71 } // namespace | 70 } // namespace |
| 72 | 71 |
| 73 // Class responsible for collecting and reporting all the runtime interactions | 72 // Class responsible for collecting and reporting all the runtime interactions |
| 74 // with the bubble. | 73 // with the bubble. |
| 75 class ManagePasswordsBubbleModel::InteractionKeeper { | 74 class ManagePasswordsBubbleModel::InteractionKeeper { |
| 76 public: | 75 public: |
| 77 InteractionKeeper( | 76 InteractionKeeper( |
| 78 password_manager::InteractionsStats stats, | 77 password_manager::InteractionsStats stats, |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 144 sign_in_promo_dismissal_reason_(metrics_util::CHROME_SIGNIN_DISMISSED), | 143 sign_in_promo_dismissal_reason_(metrics_util::CHROME_SIGNIN_DISMISSED), |
| 145 interaction_stats_(std::move(stats)), | 144 interaction_stats_(std::move(stats)), |
| 146 clock_(new base::DefaultClock), | 145 clock_(new base::DefaultClock), |
| 147 sign_in_promo_shown_count(0) {} | 146 sign_in_promo_shown_count(0) {} |
| 148 | 147 |
| 149 void ManagePasswordsBubbleModel::InteractionKeeper::ReportInteractions( | 148 void ManagePasswordsBubbleModel::InteractionKeeper::ReportInteractions( |
| 150 const ManagePasswordsBubbleModel* model) { | 149 const ManagePasswordsBubbleModel* model) { |
| 151 if (model->state() == password_manager::ui::PENDING_PASSWORD_STATE) { | 150 if (model->state() == password_manager::ui::PENDING_PASSWORD_STATE) { |
| 152 Profile* profile = model->GetProfile(); | 151 Profile* profile = model->GetProfile(); |
| 153 if (profile) { | 152 if (profile) { |
| 154 if (GetSmartLockBrandingState(profile) == | |
| 155 password_bubble_experiment::SmartLockBranding::FULL) { | |
| 156 password_bubble_experiment::RecordSavePromptFirstRunExperienceWasShown( | |
| 157 profile->GetPrefs()); | |
| 158 } | |
| 159 if (dismissal_reason_ == metrics_util::NO_DIRECT_INTERACTION && | 153 if (dismissal_reason_ == metrics_util::NO_DIRECT_INTERACTION && |
| 160 display_disposition_ == | 154 display_disposition_ == |
| 161 metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING) { | 155 metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING) { |
| 162 if (interaction_stats_.dismissal_count < | 156 if (interaction_stats_.dismissal_count < |
| 163 std::numeric_limits<decltype( | 157 std::numeric_limits<decltype( |
| 164 interaction_stats_.dismissal_count)>::max()) | 158 interaction_stats_.dismissal_count)>::max()) |
| 165 interaction_stats_.dismissal_count++; | 159 interaction_stats_.dismissal_count++; |
| 166 interaction_stats_.update_time = clock_->Now(); | 160 interaction_stats_.update_time = clock_->Now(); |
| 167 password_manager::PasswordStore* password_store = | 161 password_manager::PasswordStore* password_store = |
| 168 PasswordStoreFactory::GetForProfile( | 162 PasswordStoreFactory::GetForProfile( |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 255 } else if (state_ == password_manager::ui::MANAGE_STATE) { | 249 } else if (state_ == password_manager::ui::MANAGE_STATE) { |
| 256 local_credentials_ = DeepCopyForms(delegate_->GetCurrentForms()); | 250 local_credentials_ = DeepCopyForms(delegate_->GetCurrentForms()); |
| 257 UpdateManageStateTitle(); | 251 UpdateManageStateTitle(); |
| 258 manage_link_ = | 252 manage_link_ = |
| 259 l10n_util::GetStringUTF16(IDS_OPTIONS_PASSWORDS_MANAGE_PASSWORDS_LINK); | 253 l10n_util::GetStringUTF16(IDS_OPTIONS_PASSWORDS_MANAGE_PASSWORDS_LINK); |
| 260 } | 254 } |
| 261 | 255 |
| 262 if (state_ == password_manager::ui::CONFIRMATION_STATE) { | 256 if (state_ == password_manager::ui::CONFIRMATION_STATE) { |
| 263 base::string16 save_confirmation_link = | 257 base::string16 save_confirmation_link = |
| 264 l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_LINK); | 258 l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_LINK); |
| 265 int confirmation_text_id = IDS_MANAGE_PASSWORDS_CONFIRM_GENERATED_TEXT; | |
| 266 if (GetSmartLockBrandingState(GetProfile()) == | |
| 267 password_bubble_experiment::SmartLockBranding::FULL) { | |
| 268 std::string management_hostname = | |
| 269 GURL(password_manager::kPasswordManagerAccountDashboardURL).host(); | |
| 270 save_confirmation_link = base::UTF8ToUTF16(management_hostname); | |
| 271 confirmation_text_id = | |
| 272 IDS_MANAGE_PASSWORDS_CONFIRM_GENERATED_SMART_LOCK_TEXT; | |
| 273 } | |
| 274 | |
| 275 size_t offset; | 259 size_t offset; |
| 276 save_confirmation_text_ = | 260 save_confirmation_text_ = |
| 277 l10n_util::GetStringFUTF16( | 261 l10n_util::GetStringFUTF16(IDS_MANAGE_PASSWORDS_CONFIRM_GENERATED_TEXT, |
| 278 confirmation_text_id, save_confirmation_link, &offset); | 262 save_confirmation_link, &offset); |
| 279 save_confirmation_link_range_ = | 263 save_confirmation_link_range_ = |
| 280 gfx::Range(offset, offset + save_confirmation_link.length()); | 264 gfx::Range(offset, offset + save_confirmation_link.length()); |
| 281 } | 265 } |
| 282 | 266 |
| 283 password_manager::metrics_util::UIDisplayDisposition display_disposition = | 267 password_manager::metrics_util::UIDisplayDisposition display_disposition = |
| 284 metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING; | 268 metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING; |
| 285 if (display_reason == USER_ACTION) { | 269 if (display_reason == USER_ACTION) { |
| 286 switch (state_) { | 270 switch (state_) { |
| 287 case password_manager::ui::PENDING_PASSWORD_STATE: | 271 case password_manager::ui::PENDING_PASSWORD_STATE: |
| 288 display_disposition = metrics_util::MANUAL_WITH_PASSWORD_PENDING; | 272 display_disposition = metrics_util::MANUAL_WITH_PASSWORD_PENDING; |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 375 } | 359 } |
| 376 | 360 |
| 377 // TODO(gcasto): Is it worth having this be separate from OnDoneClicked()? | 361 // TODO(gcasto): Is it worth having this be separate from OnDoneClicked()? |
| 378 // User intent is pretty similar in both cases. | 362 // User intent is pretty similar in both cases. |
| 379 void ManagePasswordsBubbleModel::OnOKClicked() { | 363 void ManagePasswordsBubbleModel::OnOKClicked() { |
| 380 interaction_keeper_->set_dismissal_reason(metrics_util::CLICKED_OK); | 364 interaction_keeper_->set_dismissal_reason(metrics_util::CLICKED_OK); |
| 381 } | 365 } |
| 382 | 366 |
| 383 void ManagePasswordsBubbleModel::OnManageLinkClicked() { | 367 void ManagePasswordsBubbleModel::OnManageLinkClicked() { |
| 384 interaction_keeper_->set_dismissal_reason(metrics_util::CLICKED_MANAGE); | 368 interaction_keeper_->set_dismissal_reason(metrics_util::CLICKED_MANAGE); |
| 385 if (GetSmartLockBrandingState(GetProfile()) == | 369 delegate_->NavigateToPasswordManagerSettingsPage(); |
| 386 password_bubble_experiment::SmartLockBranding::FULL) { | |
| 387 delegate_->NavigateToExternalPasswordManager(); | |
| 388 } else { | |
| 389 delegate_->NavigateToPasswordManagerSettingsPage(); | |
| 390 } | |
| 391 } | 370 } |
| 392 | 371 |
| 393 void ManagePasswordsBubbleModel::OnBrandLinkClicked() { | 372 void ManagePasswordsBubbleModel::OnBrandLinkClicked() { |
| 394 interaction_keeper_->set_dismissal_reason(metrics_util::CLICKED_BRAND_NAME); | 373 interaction_keeper_->set_dismissal_reason(metrics_util::CLICKED_BRAND_NAME); |
| 395 delegate_->NavigateToSmartLockHelpPage(); | 374 delegate_->NavigateToSmartLockHelpPage(); |
| 396 } | 375 } |
| 397 | 376 |
| 398 void ManagePasswordsBubbleModel::OnAutoSignInToastTimeout() { | 377 void ManagePasswordsBubbleModel::OnAutoSignInToastTimeout() { |
| 399 interaction_keeper_->set_dismissal_reason( | 378 interaction_keeper_->set_dismissal_reason( |
| 400 metrics_util::AUTO_SIGNIN_TOAST_TIMEOUT); | 379 metrics_util::AUTO_SIGNIN_TOAST_TIMEOUT); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 437 | 416 |
| 438 content::WebContents* ManagePasswordsBubbleModel::GetWebContents() const { | 417 content::WebContents* ManagePasswordsBubbleModel::GetWebContents() const { |
| 439 return delegate_ ? delegate_->GetWebContents() : nullptr; | 418 return delegate_ ? delegate_->GetWebContents() : nullptr; |
| 440 } | 419 } |
| 441 | 420 |
| 442 bool ManagePasswordsBubbleModel::ShouldShowMultipleAccountUpdateUI() const { | 421 bool ManagePasswordsBubbleModel::ShouldShowMultipleAccountUpdateUI() const { |
| 443 return state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE && | 422 return state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE && |
| 444 local_credentials_.size() > 1 && !password_overridden_; | 423 local_credentials_.size() > 1 && !password_overridden_; |
| 445 } | 424 } |
| 446 | 425 |
| 447 bool ManagePasswordsBubbleModel::ShouldShowGoogleSmartLockWelcome() const { | |
| 448 Profile* profile = GetProfile(); | |
| 449 if (GetSmartLockBrandingState(profile) == | |
| 450 password_bubble_experiment::SmartLockBranding::FULL) { | |
| 451 PrefService* prefs = profile->GetPrefs(); | |
| 452 return !prefs->GetBoolean( | |
| 453 password_manager::prefs::kWasSavePrompFirstRunExperienceShown); | |
| 454 } | |
| 455 return false; | |
| 456 } | |
| 457 | |
| 458 bool ManagePasswordsBubbleModel::ReplaceToShowSignInPromoIfNeeded() { | 426 bool ManagePasswordsBubbleModel::ReplaceToShowSignInPromoIfNeeded() { |
| 459 DCHECK_EQ(password_manager::ui::PENDING_PASSWORD_STATE, state_); | 427 DCHECK_EQ(password_manager::ui::PENDING_PASSWORD_STATE, state_); |
| 460 PrefService* prefs = GetProfile()->GetPrefs(); | 428 PrefService* prefs = GetProfile()->GetPrefs(); |
| 461 const browser_sync::ProfileSyncService* sync_service = | 429 const browser_sync::ProfileSyncService* sync_service = |
| 462 ProfileSyncServiceFactory::GetForProfile(GetProfile()); | 430 ProfileSyncServiceFactory::GetForProfile(GetProfile()); |
| 463 if (password_bubble_experiment::ShouldShowChromeSignInPasswordPromo( | 431 if (password_bubble_experiment::ShouldShowChromeSignInPasswordPromo( |
| 464 prefs, sync_service)) { | 432 prefs, sync_service)) { |
| 465 interaction_keeper_->ReportInteractions(this); | 433 interaction_keeper_->ReportInteractions(this); |
| 466 title_brand_link_range_ = gfx::Range(); | 434 title_brand_link_range_ = gfx::Range(); |
| 467 title_ = l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_SIGNIN_PROMO_TITLE); | 435 title_ = l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_SIGNIN_PROMO_TITLE); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 484 | 452 |
| 485 void ManagePasswordsBubbleModel::UpdatePendingStateTitle() { | 453 void ManagePasswordsBubbleModel::UpdatePendingStateTitle() { |
| 486 title_brand_link_range_ = gfx::Range(); | 454 title_brand_link_range_ = gfx::Range(); |
| 487 PasswordTitleType type = | 455 PasswordTitleType type = |
| 488 state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE | 456 state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE |
| 489 ? PasswordTitleType::UPDATE_PASSWORD | 457 ? PasswordTitleType::UPDATE_PASSWORD |
| 490 : (pending_password_.federation_origin.unique() | 458 : (pending_password_.federation_origin.unique() |
| 491 ? PasswordTitleType::SAVE_PASSWORD | 459 ? PasswordTitleType::SAVE_PASSWORD |
| 492 : PasswordTitleType::SAVE_ACCOUNT); | 460 : PasswordTitleType::SAVE_ACCOUNT); |
| 493 GetSavePasswordDialogTitleTextAndLinkRange( | 461 GetSavePasswordDialogTitleTextAndLinkRange( |
| 494 GetWebContents()->GetVisibleURL(), origin_, | 462 GetWebContents()->GetVisibleURL(), origin_, IsSmartLockUser(GetProfile()), |
| 495 GetSmartLockBrandingState(GetProfile()) != | |
| 496 password_bubble_experiment::SmartLockBranding::NONE, | |
| 497 type, &title_, &title_brand_link_range_); | 463 type, &title_, &title_brand_link_range_); |
| 498 } | 464 } |
| 499 | 465 |
| 500 void ManagePasswordsBubbleModel::UpdateManageStateTitle() { | 466 void ManagePasswordsBubbleModel::UpdateManageStateTitle() { |
| 501 GetManagePasswordsDialogTitleText(GetWebContents()->GetVisibleURL(), origin_, | 467 GetManagePasswordsDialogTitleText(GetWebContents()->GetVisibleURL(), origin_, |
| 502 &title_); | 468 &title_); |
| 503 } | 469 } |
| 504 | 470 |
| 505 metrics_util::UpdatePasswordSubmissionEvent | 471 metrics_util::UpdatePasswordSubmissionEvent |
| 506 ManagePasswordsBubbleModel::GetUpdateDismissalReason( | 472 ManagePasswordsBubbleModel::GetUpdateDismissalReason( |
| (...skipping 18 matching lines...) Expand all Loading... |
| 525 return metrics_util::NO_UPDATE_SUBMISSION; | 491 return metrics_util::NO_UPDATE_SUBMISSION; |
| 526 } | 492 } |
| 527 if (state_ != password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) | 493 if (state_ != password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) |
| 528 return metrics_util::NO_UPDATE_SUBMISSION; | 494 return metrics_util::NO_UPDATE_SUBMISSION; |
| 529 if (password_overridden_) | 495 if (password_overridden_) |
| 530 return update_events[3][behavior]; | 496 return update_events[3][behavior]; |
| 531 if (ShouldShowMultipleAccountUpdateUI()) | 497 if (ShouldShowMultipleAccountUpdateUI()) |
| 532 return update_events[2][behavior]; | 498 return update_events[2][behavior]; |
| 533 return update_events[1][behavior]; | 499 return update_events[1][behavior]; |
| 534 } | 500 } |
| OLD | NEW |