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

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: fix 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 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 display_disposition_(metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING), 88 display_disposition_(metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING),
89 dismissal_reason_(metrics_util::NOT_DISPLAYED) { 89 dismissal_reason_(metrics_util::NOT_DISPLAYED),
90 update_password_submission_event_(metrics_util::NO_UPDATE_SUBMISSION) {
90 ManagePasswordsUIController* controller = 91 ManagePasswordsUIController* controller =
91 ManagePasswordsUIController::FromWebContents(web_contents); 92 ManagePasswordsUIController::FromWebContents(web_contents);
92 93
93 origin_ = controller->origin(); 94 origin_ = controller->origin();
94 state_ = controller->state(); 95 state_ = controller->state();
95 password_overridden_ = controller->PasswordOverridden(); 96 password_overridden_ = controller->PasswordOverridden();
96 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE || 97 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE ||
97 state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) { 98 state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) {
98 pending_password_ = controller->PendingPassword(); 99 pending_password_ = controller->PendingPassword();
99 local_credentials_ = DeepCopyForms(controller->GetCurrentForms()); 100 local_credentials_ = DeepCopyForms(controller->GetCurrentForms());
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 148
148 manage_link_ = 149 manage_link_ =
149 l10n_util::GetStringUTF16(IDS_OPTIONS_PASSWORDS_MANAGE_PASSWORDS_LINK); 150 l10n_util::GetStringUTF16(IDS_OPTIONS_PASSWORDS_MANAGE_PASSWORDS_LINK);
150 } 151 }
151 152
152 ManagePasswordsBubbleModel::~ManagePasswordsBubbleModel() {} 153 ManagePasswordsBubbleModel::~ManagePasswordsBubbleModel() {}
153 154
154 void ManagePasswordsBubbleModel::OnBubbleShown( 155 void ManagePasswordsBubbleModel::OnBubbleShown(
155 ManagePasswordsBubble::DisplayReason reason) { 156 ManagePasswordsBubble::DisplayReason reason) {
156 if (reason == ManagePasswordsBubble::USER_ACTION) { 157 if (reason == ManagePasswordsBubble::USER_ACTION) {
157 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE) { 158 switch (state_) {
158 display_disposition_ = metrics_util::MANUAL_WITH_PASSWORD_PENDING; 159 case password_manager::ui::PENDING_PASSWORD_STATE:
159 } else { 160 display_disposition_ = metrics_util::MANUAL_WITH_PASSWORD_PENDING;
160 display_disposition_ = metrics_util::MANUAL_MANAGE_PASSWORDS; 161 break;
162 case password_manager::ui::PENDING_PASSWORD_UPDATE_STATE:
163 display_disposition_ =
164 metrics_util::MANUAL_WITH_PASSWORD_PENDING_UPDATE;
165 break;
166 case password_manager::ui::MANAGE_STATE:
167 display_disposition_ = metrics_util::MANUAL_MANAGE_PASSWORDS;
168 break;
169 default:
170 break;
161 } 171 }
162 } else { 172 } else {
163 if (state_ == password_manager::ui::CONFIRMATION_STATE) { 173 switch (state_) {
164 display_disposition_ = 174 case password_manager::ui::PENDING_PASSWORD_STATE:
165 metrics_util::AUTOMATIC_GENERATED_PASSWORD_CONFIRMATION; 175 display_disposition_ = metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING;
166 } else if (state_ == password_manager::ui::CREDENTIAL_REQUEST_STATE) { 176 break;
167 display_disposition_ = metrics_util::AUTOMATIC_CREDENTIAL_REQUEST; 177 case password_manager::ui::PENDING_PASSWORD_UPDATE_STATE:
168 } else if (state_ == password_manager::ui::AUTO_SIGNIN_STATE) { 178 display_disposition_ =
169 display_disposition_ = metrics_util::AUTOMATIC_SIGNIN_TOAST; 179 metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING_UPDATE;
170 } else { 180 break;
171 display_disposition_ = metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING; 181 case password_manager::ui::CONFIRMATION_STATE:
182 display_disposition_ =
183 metrics_util::AUTOMATIC_GENERATED_PASSWORD_CONFIRMATION;
184 break;
185 case password_manager::ui::CREDENTIAL_REQUEST_STATE:
186 display_disposition_ = metrics_util::AUTOMATIC_CREDENTIAL_REQUEST;
187 break;
188 case password_manager::ui::AUTO_SIGNIN_STATE:
189 display_disposition_ = metrics_util::AUTOMATIC_SIGNIN_TOAST;
190 break;
191 default:
192 break;
172 } 193 }
173 } 194 }
174 metrics_util::LogUIDisplayDisposition(display_disposition_); 195 metrics_util::LogUIDisplayDisposition(display_disposition_);
175 196
176 // Default to a dismissal reason of "no interaction". If the user interacts 197 // 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 198 // with the button in such a way that it closes, we'll reset this value
178 // accordingly. 199 // accordingly.
179 dismissal_reason_ = metrics_util::NO_DIRECT_INTERACTION; 200 dismissal_reason_ = metrics_util::NO_DIRECT_INTERACTION;
180 201
181 ManagePasswordsUIController* controller = 202 ManagePasswordsUIController* controller =
182 ManagePasswordsUIController::FromWebContents(web_contents()); 203 ManagePasswordsUIController::FromWebContents(web_contents());
183 controller->OnBubbleShown(); 204 controller->OnBubbleShown();
184 } 205 }
185 206
186 void ManagePasswordsBubbleModel::OnBubbleHidden() { 207 void ManagePasswordsBubbleModel::OnBubbleHidden() {
187 ManagePasswordsUIController* manage_passwords_ui_controller = 208 ManagePasswordsUIController* manage_passwords_ui_controller =
188 web_contents() ? 209 web_contents() ?
189 ManagePasswordsUIController::FromWebContents(web_contents()) 210 ManagePasswordsUIController::FromWebContents(web_contents())
190 : nullptr; 211 : nullptr;
191 if (manage_passwords_ui_controller) 212 if (manage_passwords_ui_controller)
192 manage_passwords_ui_controller->OnBubbleHidden(); 213 manage_passwords_ui_controller->OnBubbleHidden();
193 if (dismissal_reason_ == metrics_util::NOT_DISPLAYED) 214 if (dismissal_reason_ == metrics_util::NOT_DISPLAYED)
194 return; 215 return;
195 216
196 metrics_util::LogUIDismissalReason(dismissal_reason_); 217 if (state_ != password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) {
218 // We have separate metrics for the Update bubble so do not record dismissal
219 // reason for it.
220 metrics_util::LogUIDismissalReason(dismissal_reason_);
221 }
197 // Other use cases have been reported in the callbacks like OnSaveClicked(). 222 // Other use cases have been reported in the callbacks like OnSaveClicked().
198 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE && 223 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE &&
199 dismissal_reason_ == metrics_util::NO_DIRECT_INTERACTION) 224 dismissal_reason_ == metrics_util::NO_DIRECT_INTERACTION)
200 RecordExperimentStatistics(web_contents(), dismissal_reason_); 225 RecordExperimentStatistics(web_contents(), dismissal_reason_);
226 // Check if this was update password and record update statistics.
227 if (update_password_submission_event_ == metrics_util::NO_UPDATE_SUBMISSION &&
228 (state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE ||
229 state_ == password_manager::ui::PENDING_PASSWORD_STATE)) {
230 update_password_submission_event_ =
231 GetUpdateDismissalReason(NO_INTERACTION);
232 }
233 if (update_password_submission_event_ != metrics_util::NO_UPDATE_SUBMISSION)
234 LogUpdatePasswordSubmissionEvent(update_password_submission_event_);
201 } 235 }
202 236
203 void ManagePasswordsBubbleModel::OnCancelClicked() { 237 void ManagePasswordsBubbleModel::OnCancelClicked() {
204 DCHECK_EQ(password_manager::ui::CREDENTIAL_REQUEST_STATE, state_); 238 DCHECK_EQ(password_manager::ui::CREDENTIAL_REQUEST_STATE, state_);
205 dismissal_reason_ = metrics_util::CLICKED_CANCEL; 239 dismissal_reason_ = metrics_util::CLICKED_CANCEL;
206 } 240 }
207 241
208 void ManagePasswordsBubbleModel::OnNeverForThisSiteClicked() { 242 void ManagePasswordsBubbleModel::OnNeverForThisSiteClicked() {
209 dismissal_reason_ = metrics_util::CLICKED_NEVER; 243 dismissal_reason_ = metrics_util::CLICKED_NEVER;
244 update_password_submission_event_ = GetUpdateDismissalReason(NOPE_CLICKED);
210 RecordExperimentStatistics(web_contents(), dismissal_reason_); 245 RecordExperimentStatistics(web_contents(), dismissal_reason_);
211 ManagePasswordsUIController* manage_passwords_ui_controller = 246 ManagePasswordsUIController* manage_passwords_ui_controller =
212 ManagePasswordsUIController::FromWebContents(web_contents()); 247 ManagePasswordsUIController::FromWebContents(web_contents());
213 manage_passwords_ui_controller->NeverSavePassword(); 248 manage_passwords_ui_controller->NeverSavePassword();
214 } 249 }
215 250
216 void ManagePasswordsBubbleModel::OnSaveClicked() { 251 void ManagePasswordsBubbleModel::OnSaveClicked() {
217 dismissal_reason_ = metrics_util::CLICKED_SAVE; 252 dismissal_reason_ = metrics_util::CLICKED_SAVE;
218 RecordExperimentStatistics(web_contents(), dismissal_reason_); 253 RecordExperimentStatistics(web_contents(), dismissal_reason_);
254 update_password_submission_event_ = GetUpdateDismissalReason(UPDATE_CLICKED);
219 ManagePasswordsUIController* manage_passwords_ui_controller = 255 ManagePasswordsUIController* manage_passwords_ui_controller =
220 ManagePasswordsUIController::FromWebContents(web_contents()); 256 ManagePasswordsUIController::FromWebContents(web_contents());
221 manage_passwords_ui_controller->SavePassword(); 257 manage_passwords_ui_controller->SavePassword();
222 state_ = password_manager::ui::MANAGE_STATE; 258 }
259
260 void ManagePasswordsBubbleModel::OnNopeUpdateClicked() {
261 update_password_submission_event_ = GetUpdateDismissalReason(NOPE_CLICKED);
223 } 262 }
224 263
225 void ManagePasswordsBubbleModel::OnUpdateClicked( 264 void ManagePasswordsBubbleModel::OnUpdateClicked(
226 const autofill::PasswordForm& password_form) { 265 const autofill::PasswordForm& password_form) {
266 update_password_submission_event_ = GetUpdateDismissalReason(UPDATE_CLICKED);
227 ManagePasswordsUIController* manage_passwords_ui_controller = 267 ManagePasswordsUIController* manage_passwords_ui_controller =
228 ManagePasswordsUIController::FromWebContents(web_contents()); 268 ManagePasswordsUIController::FromWebContents(web_contents());
229 manage_passwords_ui_controller->UpdatePassword(password_form); 269 manage_passwords_ui_controller->UpdatePassword(password_form);
230 state_ = password_manager::ui::MANAGE_STATE;
231 } 270 }
232 271
233 void ManagePasswordsBubbleModel::OnDoneClicked() { 272 void ManagePasswordsBubbleModel::OnDoneClicked() {
234 dismissal_reason_ = metrics_util::CLICKED_DONE; 273 dismissal_reason_ = metrics_util::CLICKED_DONE;
235 } 274 }
236 275
237 // TODO(gcasto): Is it worth having this be separate from OnDoneClicked()? 276 // TODO(gcasto): Is it worth having this be separate from OnDoneClicked()?
238 // User intent is pretty similar in both cases. 277 // User intent is pretty similar in both cases.
239 void ManagePasswordsBubbleModel::OnOKClicked() { 278 void ManagePasswordsBubbleModel::OnOKClicked() {
240 dismissal_reason_ = metrics_util::CLICKED_OK; 279 dismissal_reason_ = metrics_util::CLICKED_OK;
(...skipping 18 matching lines...) Expand all
259 298
260 void ManagePasswordsBubbleModel::OnAutoSignInToastTimeout() { 299 void ManagePasswordsBubbleModel::OnAutoSignInToastTimeout() {
261 dismissal_reason_ = metrics_util::AUTO_SIGNIN_TOAST_TIMEOUT; 300 dismissal_reason_ = metrics_util::AUTO_SIGNIN_TOAST_TIMEOUT;
262 } 301 }
263 302
264 void ManagePasswordsBubbleModel::OnAutoSignInClicked() { 303 void ManagePasswordsBubbleModel::OnAutoSignInClicked() {
265 dismissal_reason_ = metrics_util::AUTO_SIGNIN_TOAST_CLICKED; 304 dismissal_reason_ = metrics_util::AUTO_SIGNIN_TOAST_CLICKED;
266 ManagePasswordsUIController* manage_passwords_ui_controller = 305 ManagePasswordsUIController* manage_passwords_ui_controller =
267 ManagePasswordsUIController::FromWebContents(web_contents()); 306 ManagePasswordsUIController::FromWebContents(web_contents());
268 manage_passwords_ui_controller->ManageAccounts(); 307 manage_passwords_ui_controller->ManageAccounts();
269 state_ = password_manager::ui::MANAGE_STATE;
270 } 308 }
271 309
272 void ManagePasswordsBubbleModel::OnPasswordAction( 310 void ManagePasswordsBubbleModel::OnPasswordAction(
273 const autofill::PasswordForm& password_form, 311 const autofill::PasswordForm& password_form,
274 PasswordAction action) { 312 PasswordAction action) {
275 if (!web_contents()) 313 if (!web_contents())
276 return; 314 return;
277 Profile* profile = 315 Profile* profile =
278 Profile::FromBrowserContext(web_contents()->GetBrowserContext()); 316 Profile::FromBrowserContext(web_contents()->GetBrowserContext());
279 password_manager::PasswordStore* password_store = 317 password_manager::PasswordStore* password_store =
280 PasswordStoreFactory::GetForProfile( 318 PasswordStoreFactory::GetForProfile(
281 profile, ServiceAccessType::EXPLICIT_ACCESS).get(); 319 profile, ServiceAccessType::EXPLICIT_ACCESS).get();
282 DCHECK(password_store); 320 DCHECK(password_store);
283 if (action == REMOVE_PASSWORD) 321 if (action == REMOVE_PASSWORD)
284 password_store->RemoveLogin(password_form); 322 password_store->RemoveLogin(password_form);
285 else 323 else
286 password_store->AddLogin(password_form); 324 password_store->AddLogin(password_form);
287 } 325 }
288 326
289 void ManagePasswordsBubbleModel::OnChooseCredentials( 327 void ManagePasswordsBubbleModel::OnChooseCredentials(
290 const autofill::PasswordForm& password_form, 328 const autofill::PasswordForm& password_form,
291 password_manager::CredentialType credential_type) { 329 password_manager::CredentialType credential_type) {
292 dismissal_reason_ = metrics_util::CLICKED_CREDENTIAL; 330 dismissal_reason_ = metrics_util::CLICKED_CREDENTIAL;
293 ManagePasswordsUIController* manage_passwords_ui_controller = 331 ManagePasswordsUIController* manage_passwords_ui_controller =
294 ManagePasswordsUIController::FromWebContents(web_contents()); 332 ManagePasswordsUIController::FromWebContents(web_contents());
295 manage_passwords_ui_controller->ChooseCredential(password_form, 333 manage_passwords_ui_controller->ChooseCredential(password_form,
296 credential_type); 334 credential_type);
297 state_ = password_manager::ui::INACTIVE_STATE;
298 } 335 }
299 336
300 Profile* ManagePasswordsBubbleModel::GetProfile() const { 337 Profile* ManagePasswordsBubbleModel::GetProfile() const {
301 return GetProfileFromWebContents(web_contents()); 338 return GetProfileFromWebContents(web_contents());
302 } 339 }
303 340
304 bool ManagePasswordsBubbleModel::IsNewUIActive() const { 341 bool ManagePasswordsBubbleModel::IsNewUIActive() const {
305 return base::CommandLine::ForCurrentProcess()->HasSwitch( 342 return base::CommandLine::ForCurrentProcess()->HasSwitch(
306 switches::kEnableCredentialManagerAPI); 343 switches::kEnableCredentialManagerAPI);
307 } 344 }
(...skipping 14 matching lines...) Expand all
322 } 359 }
323 360
324 void ManagePasswordsBubbleModel::UpdatePendingStateTitle() { 361 void ManagePasswordsBubbleModel::UpdatePendingStateTitle() {
325 title_brand_link_range_ = gfx::Range(); 362 title_brand_link_range_ = gfx::Range();
326 GetSavePasswordDialogTitleTextAndLinkRange( 363 GetSavePasswordDialogTitleTextAndLinkRange(
327 web_contents()->GetVisibleURL(), origin(), 364 web_contents()->GetVisibleURL(), origin(),
328 IsSmartLockBrandingEnabled(GetProfile()), 365 IsSmartLockBrandingEnabled(GetProfile()),
329 state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE, &title_, 366 state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE, &title_,
330 &title_brand_link_range_); 367 &title_brand_link_range_);
331 } 368 }
369
370 password_manager::metrics_util::UpdatePasswordSubmissionEvent
371 ManagePasswordsBubbleModel::GetUpdateDismissalReason(
372 UserBehaviorOnUpdateBubble behavior) const {
373 using namespace password_manager::metrics_util;
374 static const password_manager::metrics_util::UpdatePasswordSubmissionEvent
375 update_events[4][3] = {
376 {NO_ACCOUNTS_CLICKED_UPDATE, NO_ACCOUNTS_CLICKED_NOPE,
377 NO_ACCOUNTS_NO_INTERACTION},
378 {ONE_ACCOUNT_CLICKED_UPDATE, ONE_ACCOUNT_CLICKED_NOPE,
379 ONE_ACCOUNT_NO_INTERACTION},
380 {MULTIPLE_ACCOUNTS_CLICKED_UPDATE, MULTIPLE_ACCOUNTS_CLICKED_NOPE,
381 MULTIPLE_ACCOUNTS_NO_INTERACTION},
382 {PASSWORD_OVERRIDDEN_CLICKED_UPDATE, PASSWORD_OVERRIDDEN_CLICKED_NOPE,
383 PASSWORD_OVERRIDDEN_NO_INTERACTION}};
384
385 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE) {
386 if (pending_password_.IsPossibleChangePasswordFormWithoutUsername())
387 return update_events[0][behavior];
388 return NO_UPDATE_SUBMISSION;
389 }
390 if (state_ != password_manager::ui::PENDING_PASSWORD_UPDATE_STATE)
391 return NO_UPDATE_SUBMISSION;
392 if (password_overridden_)
393 return update_events[3][behavior];
394 if (ShouldShowMultipleAccountUpdateUI())
395 return update_events[2][behavior];
396 return update_events[1][behavior];
397 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698