Home | History | Annotate | Download | only in passwords
      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