Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(422)

Side by Side Diff: chrome/browser/ui/passwords/manage_passwords_bubble_model.cc

Issue 1304573004: Added UMA statistics for change passwords in the Password Manager (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/strings/utf_string_conversions.h" 8 #include "base/strings/utf_string_conversions.h"
9 #include "chrome/browser/password_manager/password_store_factory.h" 9 #include "chrome/browser/password_manager/password_store_factory.h"
10 #include "chrome/browser/profiles/profile.h" 10 #include "chrome/browser/profiles/profile.h"
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
78 const ProfileSyncService* sync_service = 78 const ProfileSyncService* sync_service =
79 ProfileSyncServiceFactory::GetForProfile(profile); 79 ProfileSyncServiceFactory::GetForProfile(profile);
80 return password_bubble_experiment::IsSmartLockBrandingEnabled(sync_service); 80 return password_bubble_experiment::IsSmartLockBrandingEnabled(sync_service);
81 } 81 }
82 82
83 } // namespace 83 } // namespace
84 84
85 ManagePasswordsBubbleModel::ManagePasswordsBubbleModel( 85 ManagePasswordsBubbleModel::ManagePasswordsBubbleModel(
86 content::WebContents* web_contents) 86 content::WebContents* web_contents)
87 : content::WebContentsObserver(web_contents), 87 : content::WebContentsObserver(web_contents),
88 is_update_bubble_(false),
88 display_disposition_(metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING), 89 display_disposition_(metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING),
89 dismissal_reason_(metrics_util::NOT_DISPLAYED) { 90 dismissal_reason_(metrics_util::NOT_DISPLAYED),
91 update_password_submission_event_(metrics_util::NO_UPDATE_SUBMISSION) {
90 ManagePasswordsUIController* controller = 92 ManagePasswordsUIController* controller =
91 ManagePasswordsUIController::FromWebContents(web_contents); 93 ManagePasswordsUIController::FromWebContents(web_contents);
92 94
93 origin_ = controller->origin(); 95 origin_ = controller->origin();
94 state_ = controller->state(); 96 state_ = controller->state();
95 password_overridden_ = controller->PasswordOverridden(); 97 password_overridden_ = controller->PasswordOverridden();
96 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE || 98 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE ||
97 state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) { 99 state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) {
98 pending_password_ = controller->PendingPassword(); 100 pending_password_ = controller->PendingPassword();
99 local_credentials_ = DeepCopyForms(controller->GetCurrentForms()); 101 local_credentials_ = DeepCopyForms(controller->GetCurrentForms());
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
140 size_t offset; 142 size_t offset;
141 save_confirmation_text_ = 143 save_confirmation_text_ =
142 l10n_util::GetStringFUTF16( 144 l10n_util::GetStringFUTF16(
143 confirmation_text_id, save_confirmation_link, &offset); 145 confirmation_text_id, save_confirmation_link, &offset);
144 save_confirmation_link_range_ = 146 save_confirmation_link_range_ =
145 gfx::Range(offset, offset + save_confirmation_link.length()); 147 gfx::Range(offset, offset + save_confirmation_link.length());
146 } 148 }
147 149
148 manage_link_ = 150 manage_link_ =
149 l10n_util::GetStringUTF16(IDS_OPTIONS_PASSWORDS_MANAGE_PASSWORDS_LINK); 151 l10n_util::GetStringUTF16(IDS_OPTIONS_PASSWORDS_MANAGE_PASSWORDS_LINK);
152
153 is_update_bubble_ =
154 state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE;
150 } 155 }
151 156
152 ManagePasswordsBubbleModel::~ManagePasswordsBubbleModel() {} 157 ManagePasswordsBubbleModel::~ManagePasswordsBubbleModel() {}
153 158
154 void ManagePasswordsBubbleModel::OnBubbleShown( 159 void ManagePasswordsBubbleModel::OnBubbleShown(
155 ManagePasswordsBubble::DisplayReason reason) { 160 ManagePasswordsBubble::DisplayReason reason) {
156 if (reason == ManagePasswordsBubble::USER_ACTION) { 161 if (reason == ManagePasswordsBubble::USER_ACTION) {
157 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE) { 162 switch (state_) {
158 display_disposition_ = metrics_util::MANUAL_WITH_PASSWORD_PENDING; 163 case password_manager::ui::PENDING_PASSWORD_STATE:
159 } else { 164 display_disposition_ = metrics_util::MANUAL_WITH_PASSWORD_PENDING;
160 display_disposition_ = metrics_util::MANUAL_MANAGE_PASSWORDS; 165 break;
166 case password_manager::ui::PENDING_PASSWORD_UPDATE_STATE:
167 display_disposition_ =
168 metrics_util::MANUAL_WITH_PASSWORD_PENDING_UPDATE;
169 break;
170 case password_manager::ui::MANAGE_STATE:
171 display_disposition_ = metrics_util::MANUAL_MANAGE_PASSWORDS;
172 break;
173 default:
174 NOTREACHED();
161 } 175 }
162 } else { 176 } else {
163 if (state_ == password_manager::ui::CONFIRMATION_STATE) { 177 switch (state_) {
164 display_disposition_ = 178 case password_manager::ui::PENDING_PASSWORD_STATE:
165 metrics_util::AUTOMATIC_GENERATED_PASSWORD_CONFIRMATION; 179 display_disposition_ = metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING;
166 } else if (state_ == password_manager::ui::CREDENTIAL_REQUEST_STATE) { 180 break;
167 display_disposition_ = metrics_util::AUTOMATIC_CREDENTIAL_REQUEST; 181 case password_manager::ui::PENDING_PASSWORD_UPDATE_STATE:
168 } else if (state_ == password_manager::ui::AUTO_SIGNIN_STATE) { 182 display_disposition_ =
169 display_disposition_ = metrics_util::AUTOMATIC_SIGNIN_TOAST; 183 metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING_UPDATE;
170 } else { 184 break;
171 display_disposition_ = metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING; 185 case password_manager::ui::CONFIRMATION_STATE:
186 display_disposition_ =
187 metrics_util::AUTOMATIC_GENERATED_PASSWORD_CONFIRMATION;
188 break;
189 case password_manager::ui::CREDENTIAL_REQUEST_STATE:
190 display_disposition_ = metrics_util::AUTOMATIC_CREDENTIAL_REQUEST;
191 break;
192 case password_manager::ui::AUTO_SIGNIN_STATE:
193 display_disposition_ = metrics_util::AUTOMATIC_SIGNIN_TOAST;
194 break;
195 default:
196 NOTREACHED();
172 } 197 }
173 } 198 }
174 metrics_util::LogUIDisplayDisposition(display_disposition_); 199 metrics_util::LogUIDisplayDisposition(display_disposition_);
175 200
176 // Default to a dismissal reason of "no interaction". If the user interacts 201 // Default to a dismissal reason of "no interaction". If the user interacts
177 // with the button in such a way that it closes, we'll reset this value 202 // with the button in such a way that it closes, we'll reset this value
178 // accordingly. 203 // accordingly.
179 dismissal_reason_ = metrics_util::NO_DIRECT_INTERACTION; 204 dismissal_reason_ = metrics_util::NO_DIRECT_INTERACTION;
180 205
181 ManagePasswordsUIController* controller = 206 ManagePasswordsUIController* controller =
182 ManagePasswordsUIController::FromWebContents(web_contents()); 207 ManagePasswordsUIController::FromWebContents(web_contents());
183 controller->OnBubbleShown(); 208 controller->OnBubbleShown();
184 } 209 }
185 210
186 void ManagePasswordsBubbleModel::OnBubbleHidden() { 211 void ManagePasswordsBubbleModel::OnBubbleHidden() {
187 ManagePasswordsUIController* manage_passwords_ui_controller = 212 ManagePasswordsUIController* manage_passwords_ui_controller =
188 web_contents() ? 213 web_contents() ?
189 ManagePasswordsUIController::FromWebContents(web_contents()) 214 ManagePasswordsUIController::FromWebContents(web_contents())
190 : nullptr; 215 : nullptr;
191 if (manage_passwords_ui_controller) 216 if (manage_passwords_ui_controller)
192 manage_passwords_ui_controller->OnBubbleHidden(); 217 manage_passwords_ui_controller->OnBubbleHidden();
193 if (dismissal_reason_ == metrics_util::NOT_DISPLAYED) 218 if (dismissal_reason_ == metrics_util::NOT_DISPLAYED)
194 return; 219 return;
195 220
196 metrics_util::LogUIDismissalReason(dismissal_reason_); 221 if (!is_update_bubble_) {
222 // We have separate metrics for the Update bubble so do not record dismissal
223 // reason for it.
224 metrics_util::LogUIDismissalReason(dismissal_reason_);
225 }
197 // Other use cases have been reported in the callbacks like OnSaveClicked(). 226 // Other use cases have been reported in the callbacks like OnSaveClicked().
198 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE && 227 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE &&
199 dismissal_reason_ == metrics_util::NO_DIRECT_INTERACTION) 228 dismissal_reason_ == metrics_util::NO_DIRECT_INTERACTION)
200 RecordExperimentStatistics(web_contents(), dismissal_reason_); 229 RecordExperimentStatistics(web_contents(), dismissal_reason_);
230 // Check if this was update password and record update statistics.
231 if (update_password_submission_event_ == metrics_util::NO_UPDATE_SUBMISSION) {
232 if (state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE ||
233 state_ == password_manager::ui::PENDING_PASSWORD_STATE)
vasilii 2015/08/21 14:59:22 Make this 'if' the outer one.
dvadym 2015/08/21 15:31:13 Done.
234 update_password_submission_event_ =
235 GetUpdateDismissalReason(NO_INTERACTION);
236 }
237
238 if (update_password_submission_event_ != metrics_util::NO_UPDATE_SUBMISSION)
239 LogUpdatePasswordSubmissionEvent(update_password_submission_event_);
201 } 240 }
202 241
203 void ManagePasswordsBubbleModel::OnCancelClicked() { 242 void ManagePasswordsBubbleModel::OnCancelClicked() {
204 DCHECK_EQ(password_manager::ui::CREDENTIAL_REQUEST_STATE, state_); 243 DCHECK_EQ(password_manager::ui::CREDENTIAL_REQUEST_STATE, state_);
244 update_password_submission_event_ = GetUpdateDismissalReason(NOPE_CLICKED);
vasilii 2015/08/21 14:59:22 This is 100% error.
dvadym 2015/08/21 15:31:13 Thanks, moved to OnNeverForThisSiteClicked()
205 dismissal_reason_ = metrics_util::CLICKED_CANCEL; 245 dismissal_reason_ = metrics_util::CLICKED_CANCEL;
206 } 246 }
207 247
208 void ManagePasswordsBubbleModel::OnNeverForThisSiteClicked() { 248 void ManagePasswordsBubbleModel::OnNeverForThisSiteClicked() {
209 dismissal_reason_ = metrics_util::CLICKED_NEVER; 249 dismissal_reason_ = metrics_util::CLICKED_NEVER;
210 RecordExperimentStatistics(web_contents(), dismissal_reason_); 250 RecordExperimentStatistics(web_contents(), dismissal_reason_);
211 ManagePasswordsUIController* manage_passwords_ui_controller = 251 ManagePasswordsUIController* manage_passwords_ui_controller =
212 ManagePasswordsUIController::FromWebContents(web_contents()); 252 ManagePasswordsUIController::FromWebContents(web_contents());
213 manage_passwords_ui_controller->NeverSavePassword(); 253 manage_passwords_ui_controller->NeverSavePassword();
214 } 254 }
215 255
216 void ManagePasswordsBubbleModel::OnSaveClicked() { 256 void ManagePasswordsBubbleModel::OnSaveClicked() {
217 dismissal_reason_ = metrics_util::CLICKED_SAVE; 257 dismissal_reason_ = metrics_util::CLICKED_SAVE;
218 RecordExperimentStatistics(web_contents(), dismissal_reason_); 258 RecordExperimentStatistics(web_contents(), dismissal_reason_);
259 update_password_submission_event_ = GetUpdateDismissalReason(UPDATE_CLICKED);
219 ManagePasswordsUIController* manage_passwords_ui_controller = 260 ManagePasswordsUIController* manage_passwords_ui_controller =
220 ManagePasswordsUIController::FromWebContents(web_contents()); 261 ManagePasswordsUIController::FromWebContents(web_contents());
221 manage_passwords_ui_controller->SavePassword(); 262 manage_passwords_ui_controller->SavePassword();
222 state_ = password_manager::ui::MANAGE_STATE; 263 state_ = password_manager::ui::MANAGE_STATE;
223 } 264 }
224 265
225 void ManagePasswordsBubbleModel::OnUpdateClicked( 266 void ManagePasswordsBubbleModel::OnUpdateClicked(
226 const autofill::PasswordForm& password_form) { 267 const autofill::PasswordForm& password_form) {
268 update_password_submission_event_ = GetUpdateDismissalReason(UPDATE_CLICKED);
269
227 ManagePasswordsUIController* manage_passwords_ui_controller = 270 ManagePasswordsUIController* manage_passwords_ui_controller =
228 ManagePasswordsUIController::FromWebContents(web_contents()); 271 ManagePasswordsUIController::FromWebContents(web_contents());
229 manage_passwords_ui_controller->UpdatePassword(password_form); 272 manage_passwords_ui_controller->UpdatePassword(password_form);
230 state_ = password_manager::ui::MANAGE_STATE; 273 state_ = password_manager::ui::MANAGE_STATE;
231 } 274 }
232 275
233 void ManagePasswordsBubbleModel::OnDoneClicked() { 276 void ManagePasswordsBubbleModel::OnDoneClicked() {
234 dismissal_reason_ = metrics_util::CLICKED_DONE; 277 dismissal_reason_ = metrics_util::CLICKED_DONE;
235 } 278 }
236 279
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
322 } 365 }
323 366
324 void ManagePasswordsBubbleModel::UpdatePendingStateTitle() { 367 void ManagePasswordsBubbleModel::UpdatePendingStateTitle() {
325 title_brand_link_range_ = gfx::Range(); 368 title_brand_link_range_ = gfx::Range();
326 GetSavePasswordDialogTitleTextAndLinkRange( 369 GetSavePasswordDialogTitleTextAndLinkRange(
327 web_contents()->GetVisibleURL(), origin(), 370 web_contents()->GetVisibleURL(), origin(),
328 IsSmartLockBrandingEnabled(GetProfile()), 371 IsSmartLockBrandingEnabled(GetProfile()),
329 state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE, &title_, 372 state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE, &title_,
330 &title_brand_link_range_); 373 &title_brand_link_range_);
331 } 374 }
375
376 password_manager::metrics_util::UpdatePasswordSubmissionEvent
377 ManagePasswordsBubbleModel::GetUpdateDismissalReason(
378 UserBehaviorOnUpdateBubble behavior) {
379 using namespace password_manager::metrics_util;
380 static const password_manager::metrics_util::UpdatePasswordSubmissionEvent
381 update_events[4][3] = {
382 {NO_ACCOUNTS_CLICKED_UPDATE, NO_ACCOUNTS_CLICKED_NOPE,
383 NO_ACCOUNTS_NO_INTERACTION},
384 {ONE_ACCOUNT_CLICKED_UPDATE, ONE_ACCOUNT_CLICKED_NOPE,
385 ONE_ACCOUNT_NO_INTERACTION},
386 {MULTIPLE_ACCOUNTS_CLICKED_UPDATE, MULTIPLE_ACCOUNTS_CLICKED_NOPE,
387 MULTIPLE_ACCOUNTS_NO_INTERACTION},
388 {PASSWORD_OVERRIDDEN_CLICKED_UPDATE, PASSWORD_OVERRIDDEN_CLICKED_NOPE,
389 PASSWORD_OVERRIDDEN_NO_INTERACTION}};
390
391 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE) {
392 if (pending_password_.IsPossibleChangePasswordFormWithoutUsername())
393 return update_events[0][behavior];
394 return NO_UPDATE_SUBMISSION;
395 }
396 if (password_overridden_)
397 return update_events[3][behavior];
398 if (ShouldShowMultipleAccountUpdateUI())
399 return update_events[2][behavior];
400 return update_events[1][behavior];
401 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698