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 3 // found in the LICENSE file. 4 5 #include "chrome/browser/ui/passwords/manage_passwords_bubble_model.h" 6 7 #include "chrome/browser/password_manager/password_store_factory.h" 8 #include "chrome/browser/ui/browser.h" 9 #include "chrome/browser/ui/browser_finder.h" 10 #include "chrome/browser/ui/passwords/manage_passwords_ui_controller.h" 11 #include "components/password_manager/core/browser/password_store.h" 12 #include "components/password_manager/core/common/password_manager_ui.h" 13 #include "grit/generated_resources.h" 14 #include "ui/base/l10n/l10n_util.h" 15 16 using autofill::PasswordFormMap; 17 using content::WebContents; 18 19 ManagePasswordsBubbleModel::ManagePasswordsBubbleModel( 20 content::WebContents* web_contents) 21 : content::WebContentsObserver(web_contents), 22 display_disposition_( 23 password_manager::metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING), 24 dismissal_reason_(password_manager::metrics_util::NOT_DISPLAYED) { 25 ManagePasswordsUIController* controller = 26 ManagePasswordsUIController::FromWebContents(web_contents); 27 28 // TODO(mkwst): Reverse this logic. The controller should populate the model 29 // directly rather than the model pulling from the controller. Perhaps like 30 // `controller->PopulateModel(this)`. 31 state_ = controller->state(); 32 if (password_manager::ui::IsPendingState(state_)) 33 pending_credentials_ = controller->PendingCredentials(); 34 best_matches_ = controller->best_matches(); 35 36 if (password_manager::ui::IsPendingState(state_)) 37 title_ = l10n_util::GetStringUTF16(IDS_SAVE_PASSWORD); 38 else if (state_ == password_manager::ui::BLACKLIST_STATE) 39 title_ = l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_BLACKLISTED_TITLE); 40 else 41 title_ = l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_TITLE); 42 43 manage_link_ = 44 l10n_util::GetStringUTF16(IDS_OPTIONS_PASSWORDS_MANAGE_PASSWORDS_LINK); 45 } 46 47 ManagePasswordsBubbleModel::~ManagePasswordsBubbleModel() {} 48 49 void ManagePasswordsBubbleModel::OnBubbleShown( 50 ManagePasswordsBubble::DisplayReason reason) { 51 if (reason == ManagePasswordsBubble::USER_ACTION) { 52 if (password_manager::ui::IsPendingState(state_)) { 53 display_disposition_ = 54 password_manager::metrics_util::MANUAL_WITH_PASSWORD_PENDING; 55 } else if (state_ == password_manager::ui::BLACKLIST_STATE) { 56 display_disposition_ = password_manager::metrics_util::MANUAL_BLACKLISTED; 57 } else { 58 display_disposition_ = 59 password_manager::metrics_util::MANUAL_MANAGE_PASSWORDS; 60 } 61 } else { 62 DCHECK(password_manager::ui::IsPendingState(state_)); 63 display_disposition_ = 64 password_manager::metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING; 65 } 66 password_manager::metrics_util::LogUIDisplayDisposition(display_disposition_); 67 68 // Default to a dismissal reason of "no interaction". If the user interacts 69 // with the button in such a way that it closes, we'll reset this value 70 // accordingly. 71 dismissal_reason_ = password_manager::metrics_util::NO_DIRECT_INTERACTION; 72 } 73 74 void ManagePasswordsBubbleModel::OnBubbleHidden() { 75 if (dismissal_reason_ == password_manager::metrics_util::NOT_DISPLAYED) 76 return; 77 78 password_manager::metrics_util::LogUIDismissalReason(dismissal_reason_); 79 } 80 81 void ManagePasswordsBubbleModel::OnNopeClicked() { 82 dismissal_reason_ = password_manager::metrics_util::CLICKED_NOPE; 83 state_ = password_manager::ui::PENDING_PASSWORD_STATE; 84 } 85 86 void ManagePasswordsBubbleModel::OnNeverForThisSiteClicked() { 87 dismissal_reason_ = password_manager::metrics_util::CLICKED_NEVER; 88 ManagePasswordsUIController* manage_passwords_ui_controller = 89 ManagePasswordsUIController::FromWebContents(web_contents()); 90 manage_passwords_ui_controller->NeverSavePassword(); 91 state_ = password_manager::ui::BLACKLIST_STATE; 92 } 93 94 void ManagePasswordsBubbleModel::OnUnblacklistClicked() { 95 dismissal_reason_ = password_manager::metrics_util::CLICKED_UNBLACKLIST; 96 ManagePasswordsUIController* manage_passwords_ui_controller = 97 ManagePasswordsUIController::FromWebContents(web_contents()); 98 manage_passwords_ui_controller->UnblacklistSite(); 99 state_ = password_manager::ui::MANAGE_STATE; 100 } 101 102 void ManagePasswordsBubbleModel::OnSaveClicked() { 103 dismissal_reason_ = password_manager::metrics_util::CLICKED_SAVE; 104 ManagePasswordsUIController* manage_passwords_ui_controller = 105 ManagePasswordsUIController::FromWebContents(web_contents()); 106 manage_passwords_ui_controller->SavePassword(); 107 state_ = password_manager::ui::MANAGE_STATE; 108 } 109 110 void ManagePasswordsBubbleModel::OnDoneClicked() { 111 dismissal_reason_ = password_manager::metrics_util::CLICKED_DONE; 112 } 113 114 void ManagePasswordsBubbleModel::OnManageLinkClicked() { 115 dismissal_reason_ = password_manager::metrics_util::CLICKED_MANAGE; 116 ManagePasswordsUIController::FromWebContents(web_contents()) 117 ->NavigateToPasswordManagerSettingsPage(); 118 } 119 120 void ManagePasswordsBubbleModel::OnPasswordAction( 121 const autofill::PasswordForm& password_form, 122 PasswordAction action) { 123 if (!web_contents()) 124 return; 125 Profile* profile = 126 Profile::FromBrowserContext(web_contents()->GetBrowserContext()); 127 password_manager::PasswordStore* password_store = 128 PasswordStoreFactory::GetForProfile(profile, Profile::EXPLICIT_ACCESS) 129 .get(); 130 DCHECK(password_store); 131 if (action == REMOVE_PASSWORD) 132 password_store->RemoveLogin(password_form); 133 else 134 password_store->AddLogin(password_form); 135 } 136