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 <string> | 10 #include <string> |
|
vabr (Chromium)
2016/05/31 18:38:22
#include <limits>
for std::numeric_limits
vasilii
2016/06/01 10:21:53
Done.
| |
| 11 #include <vector> | 11 #include <vector> |
| 12 | 12 |
| 13 #include "base/strings/utf_string_conversions.h" | 13 #include "base/strings/utf_string_conversions.h" |
| 14 #include "base/time/default_clock.h" | 14 #include "base/time/default_clock.h" |
| 15 #include "chrome/browser/password_manager/password_store_factory.h" | 15 #include "chrome/browser/password_manager/password_store_factory.h" |
| 16 #include "chrome/browser/profiles/profile.h" | 16 #include "chrome/browser/profiles/profile.h" |
| 17 #include "chrome/browser/sync/profile_sync_service_factory.h" | 17 #include "chrome/browser/sync/profile_sync_service_factory.h" |
| 18 #include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" | 18 #include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" |
| 19 #include "chrome/browser/ui/passwords/passwords_model_delegate.h" | 19 #include "chrome/browser/ui/passwords/passwords_model_delegate.h" |
| 20 #include "chrome/grit/chromium_strings.h" | 20 #include "chrome/grit/chromium_strings.h" |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 64 | 64 |
| 65 password_bubble_experiment::SmartLockBranding GetSmartLockBrandingState( | 65 password_bubble_experiment::SmartLockBranding GetSmartLockBrandingState( |
| 66 Profile* profile) { | 66 Profile* profile) { |
| 67 const ProfileSyncService* sync_service = | 67 const ProfileSyncService* sync_service = |
| 68 ProfileSyncServiceFactory::GetForProfile(profile); | 68 ProfileSyncServiceFactory::GetForProfile(profile); |
| 69 return password_bubble_experiment::GetSmartLockBrandingState(sync_service); | 69 return password_bubble_experiment::GetSmartLockBrandingState(sync_service); |
| 70 } | 70 } |
| 71 | 71 |
| 72 } // namespace | 72 } // namespace |
| 73 | 73 |
| 74 // Class responsible for collecting and reporting all the runtime interactions | |
| 75 // with the bubble. | |
| 76 class ManagePasswordsBubbleModel::InteractionKeeper { | |
| 77 public: | |
| 78 InteractionKeeper( | |
| 79 password_manager::InteractionsStats stats, | |
| 80 password_manager::metrics_util::UIDisplayDisposition display_disposition); | |
| 81 ~InteractionKeeper() = default; | |
|
vabr (Chromium)
2016/05/31 18:38:22
nit: Please separate from the constructor with a b
vasilii
2016/06/01 10:21:53
Done.
| |
| 82 | |
| 83 // Records UMA events and updates the interaction statistics when the bubble | |
| 84 // is closed. | |
| 85 void ReportInteractions(const ManagePasswordsBubbleModel* model); | |
| 86 | |
| 87 void set_dismissal_reason( | |
| 88 password_manager::metrics_util::UIDismissalReason reason) { | |
| 89 dismissal_reason_ = reason; | |
| 90 } | |
| 91 | |
| 92 void set_update_password_submission_event( | |
| 93 password_manager::metrics_util::UpdatePasswordSubmissionEvent event) { | |
| 94 update_password_submission_event_ = event; | |
| 95 } | |
| 96 | |
| 97 void SetClockForTesting(std::unique_ptr<base::Clock> clock) { | |
| 98 clock_ = std::move(clock); | |
| 99 } | |
| 100 | |
| 101 private: | |
| 102 // The way the bubble appeared. | |
| 103 const password_manager::metrics_util::UIDisplayDisposition | |
| 104 display_disposition_; | |
| 105 | |
| 106 // Dismissal reason for a bubble. | |
| 107 password_manager::metrics_util::UIDismissalReason dismissal_reason_; | |
| 108 | |
| 109 // Dismissal reason for the update bubble. | |
| 110 password_manager::metrics_util::UpdatePasswordSubmissionEvent | |
| 111 update_password_submission_event_; | |
| 112 | |
| 113 // Current statistics for the save password bubble; | |
| 114 password_manager::InteractionsStats interaction_stats_; | |
| 115 | |
| 116 // Used to retrieve the current time, in base::Time units. | |
| 117 std::unique_ptr<base::Clock> clock_; | |
| 118 | |
| 119 DISALLOW_COPY_AND_ASSIGN(InteractionKeeper); | |
| 120 }; | |
| 121 | |
| 122 ManagePasswordsBubbleModel::InteractionKeeper::InteractionKeeper( | |
| 123 password_manager::InteractionsStats stats, | |
| 124 password_manager::metrics_util::UIDisplayDisposition display_disposition) | |
| 125 : display_disposition_(display_disposition), | |
| 126 dismissal_reason_(metrics_util::NO_DIRECT_INTERACTION), | |
| 127 update_password_submission_event_(metrics_util::NO_UPDATE_SUBMISSION), | |
| 128 interaction_stats_(std::move(stats)), | |
| 129 clock_(new base::DefaultClock) { | |
| 130 } | |
| 131 | |
| 132 void ManagePasswordsBubbleModel::InteractionKeeper::ReportInteractions( | |
| 133 const ManagePasswordsBubbleModel* model) { | |
| 134 if (model->state() == password_manager::ui::PENDING_PASSWORD_STATE) { | |
| 135 Profile* profile = model->GetProfile(); | |
| 136 if (profile) { | |
| 137 if (GetSmartLockBrandingState(profile) == | |
| 138 password_bubble_experiment::SmartLockBranding::FULL) { | |
| 139 password_bubble_experiment::RecordSavePromptFirstRunExperienceWasShown( | |
| 140 profile->GetPrefs()); | |
| 141 } | |
| 142 if (dismissal_reason_ == metrics_util::NO_DIRECT_INTERACTION && | |
| 143 display_disposition_ == | |
| 144 metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING) { | |
| 145 if (interaction_stats_.dismissal_count < | |
| 146 std::numeric_limits<decltype( | |
| 147 interaction_stats_.dismissal_count)>::max()) | |
| 148 interaction_stats_.dismissal_count++; | |
| 149 interaction_stats_.update_time = clock_->Now(); | |
| 150 password_manager::PasswordStore* password_store = | |
| 151 PasswordStoreFactory::GetForProfile( | |
| 152 profile, ServiceAccessType::EXPLICIT_ACCESS).get(); | |
|
vabr (Chromium)
2016/05/31 18:38:22
Should this be IMPLICIT_ACCESS? In other words, is
vasilii
2016/06/01 10:21:53
Done.
| |
| 153 password_store->AddSiteStats(interaction_stats_); | |
| 154 } | |
| 155 } | |
| 156 } | |
| 157 | |
| 158 if (model->state() != password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) { | |
| 159 // We have separate metrics for the Update bubble so do not record dismissal | |
| 160 // reason for it. | |
| 161 metrics_util::LogUIDismissalReason(dismissal_reason_); | |
| 162 } | |
| 163 | |
| 164 PasswordsModelDelegate* delegate = model->web_contents() | |
| 165 ? PasswordsModelDelegateFromWebContents(model->web_contents()) | |
| 166 : nullptr; | |
| 167 // Check if this was update password and record update statistics. | |
| 168 if (update_password_submission_event_ == metrics_util::NO_UPDATE_SUBMISSION && | |
| 169 (model->state() == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE || | |
| 170 model->state() == password_manager::ui::PENDING_PASSWORD_STATE)) { | |
| 171 update_password_submission_event_ = | |
| 172 model->GetUpdateDismissalReason(NO_INTERACTION); | |
| 173 if (model->state() == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE && | |
| 174 delegate) | |
| 175 delegate->OnNoInteractionOnUpdate(); | |
| 176 } | |
| 177 if (update_password_submission_event_ != metrics_util::NO_UPDATE_SUBMISSION) | |
| 178 LogUpdatePasswordSubmissionEvent(update_password_submission_event_); | |
| 179 } | |
| 180 | |
| 74 ManagePasswordsBubbleModel::ManagePasswordsBubbleModel( | 181 ManagePasswordsBubbleModel::ManagePasswordsBubbleModel( |
| 75 content::WebContents* web_contents, | 182 content::WebContents* web_contents, |
| 76 DisplayReason display_reason) | 183 DisplayReason display_reason) |
| 77 : content::WebContentsObserver(web_contents), | 184 : content::WebContentsObserver(web_contents), |
| 78 password_overridden_(false), | 185 password_overridden_(false) { |
| 79 display_disposition_(metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING), | |
| 80 dismissal_reason_(metrics_util::NO_DIRECT_INTERACTION), | |
| 81 update_password_submission_event_(metrics_util::NO_UPDATE_SUBMISSION), | |
| 82 clock_(new base::DefaultClock) { | |
| 83 PasswordsModelDelegate* delegate = | 186 PasswordsModelDelegate* delegate = |
| 84 PasswordsModelDelegateFromWebContents(web_contents); | 187 PasswordsModelDelegateFromWebContents(web_contents); |
| 85 | 188 |
| 86 origin_ = delegate->GetOrigin(); | 189 origin_ = delegate->GetOrigin(); |
| 87 state_ = delegate->GetState(); | 190 state_ = delegate->GetState(); |
| 88 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE || | 191 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE || |
| 89 state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) { | 192 state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) { |
| 90 pending_password_ = delegate->GetPendingPassword(); | 193 pending_password_ = delegate->GetPendingPassword(); |
| 91 local_credentials_ = DeepCopyForms(delegate->GetCurrentForms()); | 194 local_credentials_ = DeepCopyForms(delegate->GetCurrentForms()); |
| 92 } else if (state_ == password_manager::ui::CONFIRMATION_STATE) { | 195 } else if (state_ == password_manager::ui::CONFIRMATION_STATE) { |
| 93 // We don't need anything. | 196 // We don't need anything. |
| 94 } else if (state_ == password_manager::ui::AUTO_SIGNIN_STATE) { | 197 } else if (state_ == password_manager::ui::AUTO_SIGNIN_STATE) { |
| 95 pending_password_ = delegate->GetPendingPassword(); | 198 pending_password_ = delegate->GetPendingPassword(); |
| 96 } else { | 199 } else { |
| 97 local_credentials_ = DeepCopyForms(delegate->GetCurrentForms()); | 200 local_credentials_ = DeepCopyForms(delegate->GetCurrentForms()); |
| 98 } | 201 } |
| 99 | 202 |
| 100 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE || | 203 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE || |
| 101 state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) { | 204 state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) { |
| 102 UpdatePendingStateTitle(); | 205 UpdatePendingStateTitle(); |
| 103 } else if (state_ == password_manager::ui::CONFIRMATION_STATE) { | 206 } else if (state_ == password_manager::ui::CONFIRMATION_STATE) { |
| 104 title_ = | 207 title_ = |
| 105 l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_CONFIRM_GENERATED_TITLE); | 208 l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_CONFIRM_GENERATED_TITLE); |
| 106 } else if (state_ == password_manager::ui::AUTO_SIGNIN_STATE) { | 209 } else if (state_ == password_manager::ui::AUTO_SIGNIN_STATE) { |
| 107 // There is no title. | 210 // There is no title. |
| 108 } else if (state_ == password_manager::ui::MANAGE_STATE) { | 211 } else if (state_ == password_manager::ui::MANAGE_STATE) { |
| 109 UpdateManageStateTitle(); | 212 UpdateManageStateTitle(); |
| 110 } | 213 } |
| 111 | 214 |
| 215 password_manager::InteractionsStats interaction_stats; | |
| 112 if (state_ == password_manager::ui::CONFIRMATION_STATE) { | 216 if (state_ == password_manager::ui::CONFIRMATION_STATE) { |
| 113 base::string16 save_confirmation_link = | 217 base::string16 save_confirmation_link = |
| 114 l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_LINK); | 218 l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_LINK); |
| 115 int confirmation_text_id = IDS_MANAGE_PASSWORDS_CONFIRM_GENERATED_TEXT; | 219 int confirmation_text_id = IDS_MANAGE_PASSWORDS_CONFIRM_GENERATED_TEXT; |
| 116 if (GetSmartLockBrandingState(GetProfile()) == | 220 if (GetSmartLockBrandingState(GetProfile()) == |
| 117 password_bubble_experiment::SmartLockBranding::FULL) { | 221 password_bubble_experiment::SmartLockBranding::FULL) { |
| 118 std::string management_hostname = | 222 std::string management_hostname = |
| 119 GURL(password_manager::kPasswordManagerAccountDashboardURL).host(); | 223 GURL(password_manager::kPasswordManagerAccountDashboardURL).host(); |
| 120 save_confirmation_link = base::UTF8ToUTF16(management_hostname); | 224 save_confirmation_link = base::UTF8ToUTF16(management_hostname); |
| 121 confirmation_text_id = | 225 confirmation_text_id = |
| 122 IDS_MANAGE_PASSWORDS_CONFIRM_GENERATED_SMART_LOCK_TEXT; | 226 IDS_MANAGE_PASSWORDS_CONFIRM_GENERATED_SMART_LOCK_TEXT; |
| 123 } | 227 } |
| 124 | 228 |
| 125 size_t offset; | 229 size_t offset; |
| 126 save_confirmation_text_ = | 230 save_confirmation_text_ = |
| 127 l10n_util::GetStringFUTF16( | 231 l10n_util::GetStringFUTF16( |
| 128 confirmation_text_id, save_confirmation_link, &offset); | 232 confirmation_text_id, save_confirmation_link, &offset); |
| 129 save_confirmation_link_range_ = | 233 save_confirmation_link_range_ = |
| 130 gfx::Range(offset, offset + save_confirmation_link.length()); | 234 gfx::Range(offset, offset + save_confirmation_link.length()); |
| 131 } else if (state_ == password_manager::ui::PENDING_PASSWORD_STATE) { | 235 } else if (state_ == password_manager::ui::PENDING_PASSWORD_STATE) { |
| 132 interaction_stats_.origin_domain = origin_.GetOrigin(); | 236 interaction_stats.origin_domain = origin_.GetOrigin(); |
| 133 interaction_stats_.username_value = pending_password_.username_value; | 237 interaction_stats.username_value = pending_password_.username_value; |
| 134 password_manager::InteractionsStats* stats = | 238 password_manager::InteractionsStats* stats = |
| 135 delegate->GetCurrentInteractionStats(); | 239 delegate->GetCurrentInteractionStats(); |
| 136 if (stats) { | 240 if (stats) { |
| 137 DCHECK_EQ(interaction_stats_.username_value, stats->username_value); | 241 DCHECK_EQ(interaction_stats.username_value, stats->username_value); |
| 138 DCHECK_EQ(interaction_stats_.origin_domain, stats->origin_domain); | 242 DCHECK_EQ(interaction_stats.origin_domain, stats->origin_domain); |
| 139 interaction_stats_.dismissal_count = stats->dismissal_count; | 243 interaction_stats.dismissal_count = stats->dismissal_count; |
| 140 } | 244 } |
| 141 } else if (state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) { | 245 } else if (state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) { |
| 142 password_overridden_ = delegate->IsPasswordOverridden(); | 246 password_overridden_ = delegate->IsPasswordOverridden(); |
| 143 } | 247 } |
| 144 | 248 |
| 145 manage_link_ = | 249 manage_link_ = |
| 146 l10n_util::GetStringUTF16(IDS_OPTIONS_PASSWORDS_MANAGE_PASSWORDS_LINK); | 250 l10n_util::GetStringUTF16(IDS_OPTIONS_PASSWORDS_MANAGE_PASSWORDS_LINK); |
| 147 | 251 |
| 252 password_manager::metrics_util::UIDisplayDisposition display_disposition = | |
| 253 metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING; | |
| 148 if (display_reason == USER_ACTION) { | 254 if (display_reason == USER_ACTION) { |
| 149 switch (state_) { | 255 switch (state_) { |
| 150 case password_manager::ui::PENDING_PASSWORD_STATE: | 256 case password_manager::ui::PENDING_PASSWORD_STATE: |
| 151 display_disposition_ = metrics_util::MANUAL_WITH_PASSWORD_PENDING; | 257 display_disposition = metrics_util::MANUAL_WITH_PASSWORD_PENDING; |
| 152 break; | 258 break; |
| 153 case password_manager::ui::PENDING_PASSWORD_UPDATE_STATE: | 259 case password_manager::ui::PENDING_PASSWORD_UPDATE_STATE: |
| 154 display_disposition_ = | 260 display_disposition = |
| 155 metrics_util::MANUAL_WITH_PASSWORD_PENDING_UPDATE; | 261 metrics_util::MANUAL_WITH_PASSWORD_PENDING_UPDATE; |
| 156 break; | 262 break; |
| 157 case password_manager::ui::MANAGE_STATE: | 263 case password_manager::ui::MANAGE_STATE: |
| 158 display_disposition_ = metrics_util::MANUAL_MANAGE_PASSWORDS; | 264 display_disposition = metrics_util::MANUAL_MANAGE_PASSWORDS; |
| 159 break; | 265 break; |
| 160 case password_manager::ui::CONFIRMATION_STATE: | 266 case password_manager::ui::CONFIRMATION_STATE: |
| 161 case password_manager::ui::CREDENTIAL_REQUEST_STATE: | 267 case password_manager::ui::CREDENTIAL_REQUEST_STATE: |
| 162 case password_manager::ui::AUTO_SIGNIN_STATE: | 268 case password_manager::ui::AUTO_SIGNIN_STATE: |
| 163 case password_manager::ui::INACTIVE_STATE: | 269 case password_manager::ui::INACTIVE_STATE: |
| 164 NOTREACHED(); | 270 NOTREACHED(); |
| 165 break; | 271 break; |
| 166 } | 272 } |
| 167 } else { | 273 } else { |
| 168 switch (state_) { | 274 switch (state_) { |
| 169 case password_manager::ui::PENDING_PASSWORD_STATE: | 275 case password_manager::ui::PENDING_PASSWORD_STATE: |
| 170 display_disposition_ = metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING; | 276 display_disposition = metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING; |
| 171 break; | 277 break; |
| 172 case password_manager::ui::PENDING_PASSWORD_UPDATE_STATE: | 278 case password_manager::ui::PENDING_PASSWORD_UPDATE_STATE: |
| 173 display_disposition_ = | 279 display_disposition = |
| 174 metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING_UPDATE; | 280 metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING_UPDATE; |
| 175 break; | 281 break; |
| 176 case password_manager::ui::CONFIRMATION_STATE: | 282 case password_manager::ui::CONFIRMATION_STATE: |
| 177 display_disposition_ = | 283 display_disposition = |
| 178 metrics_util::AUTOMATIC_GENERATED_PASSWORD_CONFIRMATION; | 284 metrics_util::AUTOMATIC_GENERATED_PASSWORD_CONFIRMATION; |
| 179 break; | 285 break; |
| 180 case password_manager::ui::AUTO_SIGNIN_STATE: | 286 case password_manager::ui::AUTO_SIGNIN_STATE: |
| 181 display_disposition_ = metrics_util::AUTOMATIC_SIGNIN_TOAST; | 287 display_disposition = metrics_util::AUTOMATIC_SIGNIN_TOAST; |
| 182 break; | 288 break; |
| 183 case password_manager::ui::MANAGE_STATE: | 289 case password_manager::ui::MANAGE_STATE: |
| 184 case password_manager::ui::CREDENTIAL_REQUEST_STATE: | 290 case password_manager::ui::CREDENTIAL_REQUEST_STATE: |
| 185 case password_manager::ui::INACTIVE_STATE: | 291 case password_manager::ui::INACTIVE_STATE: |
| 186 NOTREACHED(); | 292 NOTREACHED(); |
| 187 break; | 293 break; |
| 188 } | 294 } |
| 189 } | 295 } |
| 190 metrics_util::LogUIDisplayDisposition(display_disposition_); | 296 metrics_util::LogUIDisplayDisposition(display_disposition); |
| 297 interaction_keeper_.reset(new InteractionKeeper(std::move(interaction_stats), | |
| 298 display_disposition)); | |
| 191 | 299 |
| 192 delegate->OnBubbleShown(); | 300 delegate->OnBubbleShown(); |
| 193 } | 301 } |
| 194 | 302 |
| 195 ManagePasswordsBubbleModel::~ManagePasswordsBubbleModel() { | 303 ManagePasswordsBubbleModel::~ManagePasswordsBubbleModel() { |
| 196 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE) { | 304 interaction_keeper_->ReportInteractions(this); |
| 197 Profile* profile = GetProfile(); | 305 // web_contents() is nullptr if the tab is closing. |
| 198 if (profile) { | |
| 199 if (GetSmartLockBrandingState(profile) == | |
| 200 password_bubble_experiment::SmartLockBranding::FULL) { | |
| 201 password_bubble_experiment::RecordSavePromptFirstRunExperienceWasShown( | |
| 202 profile->GetPrefs()); | |
| 203 } | |
| 204 if (dismissal_reason_ == metrics_util::NO_DIRECT_INTERACTION && | |
| 205 display_disposition_ == | |
| 206 metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING) { | |
| 207 if (interaction_stats_.dismissal_count < | |
| 208 std::numeric_limits<decltype( | |
| 209 interaction_stats_.dismissal_count)>::max()) | |
| 210 interaction_stats_.dismissal_count++; | |
| 211 interaction_stats_.update_time = clock_->Now(); | |
| 212 password_manager::PasswordStore* password_store = | |
| 213 PasswordStoreFactory::GetForProfile( | |
| 214 profile, ServiceAccessType::EXPLICIT_ACCESS) | |
| 215 .get(); | |
| 216 password_store->AddSiteStats(interaction_stats_); | |
| 217 } | |
| 218 } | |
| 219 } | |
| 220 PasswordsModelDelegate* delegate = | 306 PasswordsModelDelegate* delegate = |
| 221 web_contents() ? PasswordsModelDelegateFromWebContents(web_contents()) | 307 web_contents() ? PasswordsModelDelegateFromWebContents(web_contents()) |
| 222 : nullptr; | 308 : nullptr; |
| 223 if (delegate) | 309 if (delegate) |
| 224 delegate->OnBubbleHidden(); | 310 delegate->OnBubbleHidden(); |
| 225 if (dismissal_reason_ == metrics_util::NOT_DISPLAYED) | |
| 226 return; | |
| 227 | |
| 228 if (state_ != password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) { | |
| 229 // We have separate metrics for the Update bubble so do not record dismissal | |
| 230 // reason for it. | |
| 231 metrics_util::LogUIDismissalReason(dismissal_reason_); | |
| 232 } | |
| 233 // Check if this was update password and record update statistics. | |
| 234 if (update_password_submission_event_ == metrics_util::NO_UPDATE_SUBMISSION && | |
| 235 (state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE || | |
| 236 state_ == password_manager::ui::PENDING_PASSWORD_STATE)) { | |
| 237 update_password_submission_event_ = | |
| 238 GetUpdateDismissalReason(NO_INTERACTION); | |
| 239 if (state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE && | |
| 240 delegate) | |
| 241 delegate->OnNoInteractionOnUpdate(); | |
| 242 } | |
| 243 if (update_password_submission_event_ != metrics_util::NO_UPDATE_SUBMISSION) | |
| 244 LogUpdatePasswordSubmissionEvent(update_password_submission_event_); | |
| 245 } | 311 } |
| 246 | 312 |
| 247 void ManagePasswordsBubbleModel::OnNeverForThisSiteClicked() { | 313 void ManagePasswordsBubbleModel::OnNeverForThisSiteClicked() { |
| 248 DCHECK_EQ(password_manager::ui::PENDING_PASSWORD_STATE, state_); | 314 DCHECK_EQ(password_manager::ui::PENDING_PASSWORD_STATE, state_); |
| 249 dismissal_reason_ = metrics_util::CLICKED_NEVER; | 315 interaction_keeper_->set_dismissal_reason(metrics_util::CLICKED_NEVER); |
| 250 update_password_submission_event_ = GetUpdateDismissalReason(NOPE_CLICKED); | 316 interaction_keeper_->set_update_password_submission_event( |
| 317 GetUpdateDismissalReason(NOPE_CLICKED)); | |
| 251 CleanStatisticsForSite(web_contents(), origin_); | 318 CleanStatisticsForSite(web_contents(), origin_); |
| 252 PasswordsModelDelegateFromWebContents(web_contents())->NeverSavePassword(); | 319 PasswordsModelDelegateFromWebContents(web_contents())->NeverSavePassword(); |
| 253 } | 320 } |
| 254 | 321 |
| 255 void ManagePasswordsBubbleModel::OnSaveClicked() { | 322 void ManagePasswordsBubbleModel::OnSaveClicked() { |
| 256 DCHECK_EQ(password_manager::ui::PENDING_PASSWORD_STATE, state_); | 323 DCHECK_EQ(password_manager::ui::PENDING_PASSWORD_STATE, state_); |
| 257 dismissal_reason_ = metrics_util::CLICKED_SAVE; | 324 interaction_keeper_->set_dismissal_reason(metrics_util::CLICKED_SAVE); |
| 258 update_password_submission_event_ = GetUpdateDismissalReason(UPDATE_CLICKED); | 325 interaction_keeper_->set_update_password_submission_event( |
| 326 GetUpdateDismissalReason(UPDATE_CLICKED)); | |
| 259 CleanStatisticsForSite(web_contents(), origin_); | 327 CleanStatisticsForSite(web_contents(), origin_); |
| 260 PasswordsModelDelegateFromWebContents(web_contents())->SavePassword(); | 328 PasswordsModelDelegateFromWebContents(web_contents())->SavePassword(); |
| 261 } | 329 } |
| 262 | 330 |
| 263 void ManagePasswordsBubbleModel::OnNopeUpdateClicked() { | 331 void ManagePasswordsBubbleModel::OnNopeUpdateClicked() { |
| 264 update_password_submission_event_ = GetUpdateDismissalReason(NOPE_CLICKED); | 332 interaction_keeper_->set_update_password_submission_event( |
| 333 GetUpdateDismissalReason(NOPE_CLICKED)); | |
| 265 PasswordsModelDelegateFromWebContents(web_contents())->OnNopeUpdateClicked(); | 334 PasswordsModelDelegateFromWebContents(web_contents())->OnNopeUpdateClicked(); |
| 266 } | 335 } |
| 267 | 336 |
| 268 void ManagePasswordsBubbleModel::OnUpdateClicked( | 337 void ManagePasswordsBubbleModel::OnUpdateClicked( |
| 269 const autofill::PasswordForm& password_form) { | 338 const autofill::PasswordForm& password_form) { |
| 270 update_password_submission_event_ = GetUpdateDismissalReason(UPDATE_CLICKED); | 339 interaction_keeper_->set_update_password_submission_event( |
| 340 GetUpdateDismissalReason(UPDATE_CLICKED)); | |
| 271 PasswordsModelDelegateFromWebContents(web_contents())->UpdatePassword( | 341 PasswordsModelDelegateFromWebContents(web_contents())->UpdatePassword( |
| 272 password_form); | 342 password_form); |
| 273 } | 343 } |
| 274 | 344 |
| 275 void ManagePasswordsBubbleModel::OnDoneClicked() { | 345 void ManagePasswordsBubbleModel::OnDoneClicked() { |
| 276 dismissal_reason_ = metrics_util::CLICKED_DONE; | 346 interaction_keeper_->set_dismissal_reason(metrics_util::CLICKED_DONE); |
| 277 } | 347 } |
| 278 | 348 |
| 279 // TODO(gcasto): Is it worth having this be separate from OnDoneClicked()? | 349 // TODO(gcasto): Is it worth having this be separate from OnDoneClicked()? |
| 280 // User intent is pretty similar in both cases. | 350 // User intent is pretty similar in both cases. |
| 281 void ManagePasswordsBubbleModel::OnOKClicked() { | 351 void ManagePasswordsBubbleModel::OnOKClicked() { |
| 282 dismissal_reason_ = metrics_util::CLICKED_OK; | 352 interaction_keeper_->set_dismissal_reason(metrics_util::CLICKED_OK); |
| 283 } | 353 } |
| 284 | 354 |
| 285 void ManagePasswordsBubbleModel::OnManageLinkClicked() { | 355 void ManagePasswordsBubbleModel::OnManageLinkClicked() { |
| 286 dismissal_reason_ = metrics_util::CLICKED_MANAGE; | 356 interaction_keeper_->set_dismissal_reason(metrics_util::CLICKED_MANAGE); |
| 287 if (GetSmartLockBrandingState(GetProfile()) == | 357 if (GetSmartLockBrandingState(GetProfile()) == |
| 288 password_bubble_experiment::SmartLockBranding::FULL) { | 358 password_bubble_experiment::SmartLockBranding::FULL) { |
| 289 PasswordsModelDelegateFromWebContents(web_contents()) | 359 PasswordsModelDelegateFromWebContents(web_contents()) |
| 290 ->NavigateToExternalPasswordManager(); | 360 ->NavigateToExternalPasswordManager(); |
| 291 } else { | 361 } else { |
| 292 PasswordsModelDelegateFromWebContents(web_contents()) | 362 PasswordsModelDelegateFromWebContents(web_contents()) |
| 293 ->NavigateToPasswordManagerSettingsPage(); | 363 ->NavigateToPasswordManagerSettingsPage(); |
| 294 } | 364 } |
| 295 } | 365 } |
| 296 | 366 |
| 297 void ManagePasswordsBubbleModel::OnBrandLinkClicked() { | 367 void ManagePasswordsBubbleModel::OnBrandLinkClicked() { |
| 298 dismissal_reason_ = metrics_util::CLICKED_BRAND_NAME; | 368 interaction_keeper_->set_dismissal_reason(metrics_util::CLICKED_BRAND_NAME); |
| 299 PasswordsModelDelegateFromWebContents(web_contents()) | 369 PasswordsModelDelegateFromWebContents(web_contents()) |
| 300 ->NavigateToSmartLockHelpPage(); | 370 ->NavigateToSmartLockHelpPage(); |
| 301 } | 371 } |
| 302 | 372 |
| 303 void ManagePasswordsBubbleModel::OnAutoSignInToastTimeout() { | 373 void ManagePasswordsBubbleModel::OnAutoSignInToastTimeout() { |
| 304 dismissal_reason_ = metrics_util::AUTO_SIGNIN_TOAST_TIMEOUT; | 374 interaction_keeper_->set_dismissal_reason( |
| 375 metrics_util::AUTO_SIGNIN_TOAST_TIMEOUT); | |
| 305 } | 376 } |
| 306 | 377 |
| 307 void ManagePasswordsBubbleModel::OnPasswordAction( | 378 void ManagePasswordsBubbleModel::OnPasswordAction( |
| 308 const autofill::PasswordForm& password_form, | 379 const autofill::PasswordForm& password_form, |
| 309 PasswordAction action) { | 380 PasswordAction action) { |
| 310 if (!web_contents()) | 381 Profile* profile = GetProfile(); |
| 382 if (!profile) | |
| 311 return; | 383 return; |
| 312 Profile* profile = | |
| 313 Profile::FromBrowserContext(web_contents()->GetBrowserContext()); | |
| 314 password_manager::PasswordStore* password_store = | 384 password_manager::PasswordStore* password_store = |
| 315 PasswordStoreFactory::GetForProfile( | 385 PasswordStoreFactory::GetForProfile( |
| 316 profile, ServiceAccessType::EXPLICIT_ACCESS).get(); | 386 profile, ServiceAccessType::EXPLICIT_ACCESS).get(); |
| 317 DCHECK(password_store); | 387 DCHECK(password_store); |
| 318 if (action == REMOVE_PASSWORD) | 388 if (action == REMOVE_PASSWORD) |
| 319 password_store->RemoveLogin(password_form); | 389 password_store->RemoveLogin(password_form); |
| 320 else | 390 else |
| 321 password_store->AddLogin(password_form); | 391 password_store->AddLogin(password_form); |
| 322 } | 392 } |
| 323 | 393 |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 334 Profile* profile = GetProfile(); | 404 Profile* profile = GetProfile(); |
| 335 if (GetSmartLockBrandingState(profile) == | 405 if (GetSmartLockBrandingState(profile) == |
| 336 password_bubble_experiment::SmartLockBranding::FULL) { | 406 password_bubble_experiment::SmartLockBranding::FULL) { |
| 337 PrefService* prefs = profile->GetPrefs(); | 407 PrefService* prefs = profile->GetPrefs(); |
| 338 return !prefs->GetBoolean( | 408 return !prefs->GetBoolean( |
| 339 password_manager::prefs::kWasSavePrompFirstRunExperienceShown); | 409 password_manager::prefs::kWasSavePrompFirstRunExperienceShown); |
| 340 } | 410 } |
| 341 return false; | 411 return false; |
| 342 } | 412 } |
| 343 | 413 |
| 414 void ManagePasswordsBubbleModel::SetClockForTesting( | |
| 415 std::unique_ptr<base::Clock> clock) { | |
| 416 interaction_keeper_->SetClockForTesting(std::move(clock)); | |
| 417 } | |
| 418 | |
| 344 void ManagePasswordsBubbleModel::UpdatePendingStateTitle() { | 419 void ManagePasswordsBubbleModel::UpdatePendingStateTitle() { |
| 345 title_brand_link_range_ = gfx::Range(); | 420 title_brand_link_range_ = gfx::Range(); |
| 346 PasswordTittleType type = | 421 PasswordTittleType type = |
| 347 state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE | 422 state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE |
| 348 ? PasswordTittleType::UPDATE_PASSWORD | 423 ? PasswordTittleType::UPDATE_PASSWORD |
| 349 : (pending_password_.federation_origin.unique() | 424 : (pending_password_.federation_origin.unique() |
| 350 ? PasswordTittleType::SAVE_PASSWORD | 425 ? PasswordTittleType::SAVE_PASSWORD |
| 351 : PasswordTittleType::SAVE_ACCOUNT); | 426 : PasswordTittleType::SAVE_ACCOUNT); |
| 352 GetSavePasswordDialogTitleTextAndLinkRange( | 427 GetSavePasswordDialogTitleTextAndLinkRange( |
| 353 web_contents()->GetVisibleURL(), origin_, | 428 web_contents()->GetVisibleURL(), origin_, |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 384 return metrics_util::NO_UPDATE_SUBMISSION; | 459 return metrics_util::NO_UPDATE_SUBMISSION; |
| 385 } | 460 } |
| 386 if (state_ != password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) | 461 if (state_ != password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) |
| 387 return metrics_util::NO_UPDATE_SUBMISSION; | 462 return metrics_util::NO_UPDATE_SUBMISSION; |
| 388 if (password_overridden_) | 463 if (password_overridden_) |
| 389 return update_events[3][behavior]; | 464 return update_events[3][behavior]; |
| 390 if (ShouldShowMultipleAccountUpdateUI()) | 465 if (ShouldShowMultipleAccountUpdateUI()) |
| 391 return update_events[2][behavior]; | 466 return update_events[2][behavior]; |
| 392 return update_events[1][behavior]; | 467 return update_events[1][behavior]; |
| 393 } | 468 } |
| OLD | NEW |