password_manager.h revision dc0f95d653279beabeb9817299e2902918ba123e
1// Copyright (c) 2010 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#ifndef CHROME_BROWSER_PASSWORD_MANAGER_PASSWORD_MANAGER_H_
6#define CHROME_BROWSER_PASSWORD_MANAGER_PASSWORD_MANAGER_H_
7#pragma once
8
9#include "base/scoped_ptr.h"
10#include "base/stl_util-inl.h"
11#include "chrome/browser/password_manager/password_form_manager.h"
12#include "chrome/browser/prefs/pref_member.h"
13#include "chrome/browser/ui/login/login_model.h"
14#include "content/browser/tab_contents/tab_contents_observer.h"
15#include "webkit/glue/password_form.h"
16#include "webkit/glue/password_form_dom_manager.h"
17
18class PasswordManagerDelegate;
19class PasswordManagerTest;
20class PasswordFormManager;
21class PrefService;
22
23// Per-tab password manager. Handles creation and management of UI elements,
24// receiving password form data from the renderer and managing the password
25// database through the WebDataService. The PasswordManager is a LoginModel
26// for purposes of supporting HTTP authentication dialogs.
27class PasswordManager : public LoginModel,
28                        public TabContentsObserver {
29 public:
30  static void RegisterUserPrefs(PrefService* prefs);
31
32  // The delegate passed in is required to outlive the PasswordManager.
33  PasswordManager(TabContents* tab_contents,
34                  PasswordManagerDelegate* delegate);
35  virtual ~PasswordManager();
36
37  // Called by a PasswordFormManager when it decides a form can be autofilled
38  // on the page.
39  void Autofill(const webkit_glue::PasswordForm& form_for_autofill,
40                const webkit_glue::PasswordFormMap& best_matches,
41                const webkit_glue::PasswordForm* const preferred_match,
42                bool wait_for_username) const;
43
44  // LoginModel implementation.
45  virtual void SetObserver(LoginModelObserver* observer);
46
47  // When a form is submitted, we prepare to save the password but wait
48  // until we decide the user has successfully logged in. This is step 1
49  // of 2 (see SavePassword).
50  void ProvisionallySavePassword(webkit_glue::PasswordForm form);
51
52  // TabContentsObserver overrides.
53  virtual void DidStopLoading();
54  virtual void DidNavigateAnyFramePostCommit(
55      const NavigationController::LoadCommittedDetails& details,
56      const ViewHostMsg_FrameNavigate_Params& params);
57  virtual bool OnMessageReceived(const IPC::Message& message);
58
59  void OnPasswordFormsFound(
60      const std::vector<webkit_glue::PasswordForm>& forms);
61  void OnPasswordFormsVisible(
62      const std::vector<webkit_glue::PasswordForm>& visible_forms);
63
64 private:
65  FRIEND_TEST_ALL_PREFIXES(PasswordManagerTest, FormSeenThenLeftPage);
66
67  // Note about how a PasswordFormManager can transition from
68  // pending_login_managers_ to provisional_save_manager_ and the infobar.
69  //
70  // 1. form "seen"
71  //       |                                             new
72  //       |                                               ___ Infobar
73  // pending_login -- form submit --> provisional_save ___/
74  //             ^                            |           \___ (update DB)
75  //             |                           fail
76  //             |-----------<------<---------|          !new
77  //
78  // When a form is "seen" on a page, a PasswordFormManager is created
79  // and stored in this collection until user navigates away from page.
80
81  // Clear any pending saves
82  void ClearProvisionalSave();
83
84  // Notification that the user navigated away from the current page.
85  // Unless this is a password form submission, for our purposes this
86  // means we're done with the current page, so we can clean-up.
87  void DidNavigate();
88
89  typedef std::vector<PasswordFormManager*> LoginManagers;
90  LoginManagers pending_login_managers_;
91
92  // Deleter for pending_login_managers_ when PasswordManager is deleted (e.g
93  // tab closes) on a page with a password form, thus containing login managers.
94  STLElementDeleter<LoginManagers> login_managers_deleter_;
95
96  // When the user submits a password/credential, this contains the
97  // PasswordFormManager for the form in question until we deem the login
98  // attempt to have succeeded (as in valid credentials). If it fails, we
99  // send the PasswordFormManager back to the pending_login_managers_ set.
100  // Scoped in case PasswordManager gets deleted (e.g tab closes) between the
101  // time a user submits a login form and gets to the next page.
102  scoped_ptr<PasswordFormManager> provisional_save_manager_;
103
104  // Our delegate for carrying out external operations.  This is typically the
105  // containing TabContents.
106  PasswordManagerDelegate* delegate_;
107
108  // The LoginModelObserver (i.e LoginView) requiring autofill.
109  LoginModelObserver* observer_;
110
111  // Set to false to disable the password manager (will no longer fill
112  // passwords or ask you if you want to save passwords).
113  BooleanPrefMember password_manager_enabled_;
114
115  DISALLOW_COPY_AND_ASSIGN(PasswordManager);
116};
117
118#endif  // CHROME_BROWSER_PASSWORD_MANAGER_PASSWORD_MANAGER_H_
119