Chromium Code Reviews| 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 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 96 | 96 |
| 97 void set_sign_in_promo_dismissal_reason( | 97 void set_sign_in_promo_dismissal_reason( |
| 98 password_manager::metrics_util::SyncSignInUserAction reason) { | 98 password_manager::metrics_util::SyncSignInUserAction reason) { |
| 99 sign_in_promo_dismissal_reason_ = reason; | 99 sign_in_promo_dismissal_reason_ = reason; |
| 100 } | 100 } |
| 101 | 101 |
| 102 void SetClockForTesting(std::unique_ptr<base::Clock> clock) { | 102 void SetClockForTesting(std::unique_ptr<base::Clock> clock) { |
| 103 clock_ = std::move(clock); | 103 clock_ = std::move(clock); |
| 104 } | 104 } |
| 105 | 105 |
| 106 void set_sign_in_promo_count(int count) { | |
| 107 sign_in_promo_count = count; | |
| 108 } | |
| 109 | |
| 106 private: | 110 private: |
| 107 // The way the bubble appeared. | 111 // The way the bubble appeared. |
| 108 const password_manager::metrics_util::UIDisplayDisposition | 112 const password_manager::metrics_util::UIDisplayDisposition |
| 109 display_disposition_; | 113 display_disposition_; |
| 110 | 114 |
| 111 // Dismissal reason for a bubble. | 115 // Dismissal reason for a bubble. |
| 112 password_manager::metrics_util::UIDismissalReason dismissal_reason_; | 116 password_manager::metrics_util::UIDismissalReason dismissal_reason_; |
| 113 | 117 |
| 114 // Dismissal reason for the update bubble. | 118 // Dismissal reason for the update bubble. |
| 115 password_manager::metrics_util::UpdatePasswordSubmissionEvent | 119 password_manager::metrics_util::UpdatePasswordSubmissionEvent |
| 116 update_password_submission_event_; | 120 update_password_submission_event_; |
| 117 | 121 |
| 118 // Dismissal reason for the Chrome Sign in bubble. | 122 // Dismissal reason for the Chrome Sign in bubble. |
| 119 password_manager::metrics_util::SyncSignInUserAction | 123 password_manager::metrics_util::SyncSignInUserAction |
| 120 sign_in_promo_dismissal_reason_; | 124 sign_in_promo_dismissal_reason_; |
| 121 | 125 |
| 122 // Current statistics for the save password bubble; | 126 // Current statistics for the save password bubble; |
| 123 password_manager::InteractionsStats interaction_stats_; | 127 password_manager::InteractionsStats interaction_stats_; |
| 124 | 128 |
| 125 // Used to retrieve the current time, in base::Time units. | 129 // Used to retrieve the current time, in base::Time units. |
| 126 std::unique_ptr<base::Clock> clock_; | 130 std::unique_ptr<base::Clock> clock_; |
| 127 | 131 |
| 132 // Number of times the sign-in promo was shown to the user. | |
| 133 int sign_in_promo_count; | |
|
Ilya Sherman
2016/11/05 01:31:39
nit: I'd add "shown" before "count"
vasilii
2016/11/07 10:40:24
Done.
| |
| 134 | |
| 128 DISALLOW_COPY_AND_ASSIGN(InteractionKeeper); | 135 DISALLOW_COPY_AND_ASSIGN(InteractionKeeper); |
| 129 }; | 136 }; |
| 130 | 137 |
| 131 ManagePasswordsBubbleModel::InteractionKeeper::InteractionKeeper( | 138 ManagePasswordsBubbleModel::InteractionKeeper::InteractionKeeper( |
| 132 password_manager::InteractionsStats stats, | 139 password_manager::InteractionsStats stats, |
| 133 password_manager::metrics_util::UIDisplayDisposition display_disposition) | 140 password_manager::metrics_util::UIDisplayDisposition display_disposition) |
| 134 : display_disposition_(display_disposition), | 141 : display_disposition_(display_disposition), |
| 135 dismissal_reason_(metrics_util::NO_DIRECT_INTERACTION), | 142 dismissal_reason_(metrics_util::NO_DIRECT_INTERACTION), |
| 136 update_password_submission_event_(metrics_util::NO_UPDATE_SUBMISSION), | 143 update_password_submission_event_(metrics_util::NO_UPDATE_SUBMISSION), |
| 137 sign_in_promo_dismissal_reason_(metrics_util::CHROME_SIGNIN_DISMISSED), | 144 sign_in_promo_dismissal_reason_(metrics_util::CHROME_SIGNIN_DISMISSED), |
| 138 interaction_stats_(std::move(stats)), | 145 interaction_stats_(std::move(stats)), |
| 139 clock_(new base::DefaultClock) {} | 146 clock_(new base::DefaultClock), |
| 147 sign_in_promo_count(0) {} | |
| 140 | 148 |
| 141 void ManagePasswordsBubbleModel::InteractionKeeper::ReportInteractions( | 149 void ManagePasswordsBubbleModel::InteractionKeeper::ReportInteractions( |
| 142 const ManagePasswordsBubbleModel* model) { | 150 const ManagePasswordsBubbleModel* model) { |
| 143 if (model->state() == password_manager::ui::PENDING_PASSWORD_STATE) { | 151 if (model->state() == password_manager::ui::PENDING_PASSWORD_STATE) { |
| 144 Profile* profile = model->GetProfile(); | 152 Profile* profile = model->GetProfile(); |
| 145 if (profile) { | 153 if (profile) { |
| 146 if (GetSmartLockBrandingState(profile) == | 154 if (GetSmartLockBrandingState(profile) == |
| 147 password_bubble_experiment::SmartLockBranding::FULL) { | 155 password_bubble_experiment::SmartLockBranding::FULL) { |
| 148 password_bubble_experiment::RecordSavePromptFirstRunExperienceWasShown( | 156 password_bubble_experiment::RecordSavePromptFirstRunExperienceWasShown( |
| 149 profile->GetPrefs()); | 157 profile->GetPrefs()); |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 163 } | 171 } |
| 164 } | 172 } |
| 165 } | 173 } |
| 166 | 174 |
| 167 if (model->state() == password_manager::ui::CHROME_SIGN_IN_PROMO_STATE) { | 175 if (model->state() == password_manager::ui::CHROME_SIGN_IN_PROMO_STATE) { |
| 168 metrics_util::LogAutoSigninPromoUserAction(sign_in_promo_dismissal_reason_); | 176 metrics_util::LogAutoSigninPromoUserAction(sign_in_promo_dismissal_reason_); |
| 169 if (sign_in_promo_dismissal_reason_ == | 177 if (sign_in_promo_dismissal_reason_ == |
| 170 password_manager::metrics_util::CHROME_SIGNIN_OK || | 178 password_manager::metrics_util::CHROME_SIGNIN_OK || |
| 171 sign_in_promo_dismissal_reason_ == | 179 sign_in_promo_dismissal_reason_ == |
| 172 password_manager::metrics_util::CHROME_SIGNIN_CANCEL) { | 180 password_manager::metrics_util::CHROME_SIGNIN_CANCEL) { |
| 173 DCHECK(model->delegate_); | |
| 174 int show_count = model->GetProfile()->GetPrefs()->GetInteger( | |
| 175 password_manager::prefs::kNumberSignInPasswordPromoShown); | |
| 176 UMA_HISTOGRAM_COUNTS_100("PasswordManager.SignInPromoCountTilClick", | 181 UMA_HISTOGRAM_COUNTS_100("PasswordManager.SignInPromoCountTilClick", |
| 177 show_count); | 182 sign_in_promo_count); |
| 183 } else { | |
| 184 UMA_HISTOGRAM_COUNTS_100("PasswordManager.SignInPromoDismissalCount", | |
|
Ilya Sherman
2016/11/05 01:31:40
Does CHROME_SIGNIN_CANCEL not correspond to a dism
vasilii
2016/11/07 10:40:24
No. The request was to count implicit dismissals.
| |
| 185 sign_in_promo_count); | |
| 178 } | 186 } |
| 179 } else if (model->state() != | 187 } else if (model->state() != |
| 180 password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) { | 188 password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) { |
| 181 // We have separate metrics for the Update bubble so do not record dismissal | 189 // We have separate metrics for the Update bubble so do not record dismissal |
| 182 // reason for it. | 190 // reason for it. |
| 183 metrics_util::LogUIDismissalReason(dismissal_reason_); | 191 metrics_util::LogUIDismissalReason(dismissal_reason_); |
| 184 } | 192 } |
| 185 | 193 |
| 186 if (model->state() == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE || | 194 if (model->state() == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE || |
| 187 model->state() == password_manager::ui::PENDING_PASSWORD_STATE) { | 195 model->state() == password_manager::ui::PENDING_PASSWORD_STATE) { |
| (...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 439 const browser_sync::ProfileSyncService* sync_service = | 447 const browser_sync::ProfileSyncService* sync_service = |
| 440 ProfileSyncServiceFactory::GetForProfile(GetProfile()); | 448 ProfileSyncServiceFactory::GetForProfile(GetProfile()); |
| 441 if (password_bubble_experiment::ShouldShowChromeSignInPasswordPromo( | 449 if (password_bubble_experiment::ShouldShowChromeSignInPasswordPromo( |
| 442 prefs, sync_service)) { | 450 prefs, sync_service)) { |
| 443 interaction_keeper_->ReportInteractions(this); | 451 interaction_keeper_->ReportInteractions(this); |
| 444 title_brand_link_range_ = gfx::Range(); | 452 title_brand_link_range_ = gfx::Range(); |
| 445 title_ = l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_SIGNIN_PROMO_TITLE); | 453 title_ = l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_SIGNIN_PROMO_TITLE); |
| 446 state_ = password_manager::ui::CHROME_SIGN_IN_PROMO_STATE; | 454 state_ = password_manager::ui::CHROME_SIGN_IN_PROMO_STATE; |
| 447 int show_count = prefs->GetInteger( | 455 int show_count = prefs->GetInteger( |
| 448 password_manager::prefs::kNumberSignInPasswordPromoShown); | 456 password_manager::prefs::kNumberSignInPasswordPromoShown); |
| 457 show_count++; | |
|
Ilya Sherman
2016/11/05 01:31:39
nit: Please use pre-increment.
vasilii
2016/11/07 10:40:24
Why?
Ilya Sherman
2016/11/07 19:43:20
Hmm, I think the style guide used to recommend pre
vabr (Chromium)
2016/11/08 08:36:33
The style guide still requires it for iterators, b
| |
| 449 prefs->SetInteger(password_manager::prefs::kNumberSignInPasswordPromoShown, | 458 prefs->SetInteger(password_manager::prefs::kNumberSignInPasswordPromoShown, |
| 450 show_count + 1); | 459 show_count); |
| 460 interaction_keeper_->set_sign_in_promo_count(show_count); | |
|
Ilya Sherman
2016/11/05 01:31:39
What's the purpose of tracking this in two locatio
vasilii
2016/11/07 10:40:24
Because if one closes the tab then GetWebContents(
| |
| 451 return true; | 461 return true; |
| 452 } | 462 } |
| 453 return false; | 463 return false; |
| 454 } | 464 } |
| 455 | 465 |
| 456 void ManagePasswordsBubbleModel::SetClockForTesting( | 466 void ManagePasswordsBubbleModel::SetClockForTesting( |
| 457 std::unique_ptr<base::Clock> clock) { | 467 std::unique_ptr<base::Clock> clock) { |
| 458 interaction_keeper_->SetClockForTesting(std::move(clock)); | 468 interaction_keeper_->SetClockForTesting(std::move(clock)); |
| 459 } | 469 } |
| 460 | 470 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 501 return metrics_util::NO_UPDATE_SUBMISSION; | 511 return metrics_util::NO_UPDATE_SUBMISSION; |
| 502 } | 512 } |
| 503 if (state_ != password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) | 513 if (state_ != password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) |
| 504 return metrics_util::NO_UPDATE_SUBMISSION; | 514 return metrics_util::NO_UPDATE_SUBMISSION; |
| 505 if (password_overridden_) | 515 if (password_overridden_) |
| 506 return update_events[3][behavior]; | 516 return update_events[3][behavior]; |
| 507 if (ShouldShowMultipleAccountUpdateUI()) | 517 if (ShouldShowMultipleAccountUpdateUI()) |
| 508 return update_events[2][behavior]; | 518 return update_events[2][behavior]; |
| 509 return update_events[1][behavior]; | 519 return update_events[1][behavior]; |
| 510 } | 520 } |
| OLD | NEW |