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 |