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 "components/autofill/core/browser/password_autofill_manager.h"
6#include "components/autofill/core/common/autofill_messages.h"
7#include "content/public/browser/render_view_host.h"
8#include "content/public/browser/web_contents.h"
9#include "ui/base/keycodes/keyboard_codes.h"
10
11namespace autofill {
12
13////////////////////////////////////////////////////////////////////////////////
14// PasswordAutofillManager, public:
15
16PasswordAutofillManager::PasswordAutofillManager(
17    content::WebContents* web_contents) : web_contents_(web_contents) {
18}
19
20PasswordAutofillManager::~PasswordAutofillManager() {
21}
22
23bool PasswordAutofillManager::DidAcceptAutofillSuggestion(
24    const FormFieldData& field,
25    const base::string16& value) {
26  PasswordFormFillData password;
27  if (!FindLoginInfo(field, &password))
28    return false;
29
30  if (WillFillUserNameAndPassword(value, password)) {
31    if (web_contents_) {
32      content::RenderViewHost* render_view_host =
33          web_contents_->GetRenderViewHost();
34      render_view_host->Send(new AutofillMsg_AcceptPasswordAutofillSuggestion(
35          render_view_host->GetRoutingID(),
36          value));
37    }
38    return true;
39  }
40
41  return false;
42}
43
44void PasswordAutofillManager::AddPasswordFormMapping(
45    const FormFieldData& username_element,
46    const PasswordFormFillData& password) {
47  login_to_password_info_[username_element] = password;
48}
49
50void PasswordAutofillManager::Reset() {
51  login_to_password_info_.clear();
52}
53
54////////////////////////////////////////////////////////////////////////////////
55// PasswordAutofillManager, private:
56
57bool PasswordAutofillManager::WillFillUserNameAndPassword(
58    const base::string16& current_username,
59    const PasswordFormFillData& fill_data) {
60  // Look for any suitable matches to current field text.
61  if (fill_data.basic_data.fields[0].value == current_username)
62    return true;
63
64  // Scan additional logins for a match.
65   for (PasswordFormFillData::LoginCollection::const_iterator iter =
66           fill_data.additional_logins.begin();
67       iter != fill_data.additional_logins.end(); ++iter) {
68    if (iter->first == current_username)
69      return true;
70  }
71
72  for (PasswordFormFillData::UsernamesCollection::const_iterator usernames_iter
73           = fill_data.other_possible_usernames.begin();
74       usernames_iter != fill_data.other_possible_usernames.end();
75       ++usernames_iter) {
76    for (size_t i = 0; i < usernames_iter->second.size(); ++i) {
77      if (usernames_iter->second[i] == current_username)
78        return true;
79    }
80  }
81
82  return false;
83}
84
85bool PasswordAutofillManager::FindLoginInfo(
86    const FormFieldData& field,
87    PasswordFormFillData* found_password) {
88  LoginToPasswordInfoMap::iterator iter = login_to_password_info_.find(field);
89  if (iter == login_to_password_info_.end())
90    return false;
91
92  *found_password = iter->second;
93  return true;
94}
95
96}  // namespace autofill
97