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 "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 Loading... | |
| 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 Loading... | |
| 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 NOTREACHED(); | |
| 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 NOTREACHED(); | |
| 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 Loading... | |
| 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 Loading... | |
| 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 } | |
|
vasilii
2015/08/21 16:30:46
DCHECK_EQ(UPDATE, state);
| |
| 390 if (password_overridden_) | |
| 391 return update_events[3][behavior]; | |
| 392 if (ShouldShowMultipleAccountUpdateUI()) | |
| 393 return update_events[2][behavior]; | |
| 394 return update_events[1][behavior]; | |
| 395 } | |
| OLD | NEW |