Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / components / password_manager / core / browser / password_manager.h
1 // Copyright (c) 2012 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 COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_MANAGER_H_
6 #define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_MANAGER_H_
7
8 #include <string>
9 #include <vector>
10
11 #include "base/callback.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "base/memory/scoped_vector.h"
14 #include "base/observer_list.h"
15 #include "base/prefs/pref_member.h"
16 #include "base/stl_util.h"
17 #include "components/autofill/core/common/password_form.h"
18 #include "components/autofill/core/common/password_form_fill_data.h"
19 #include "components/password_manager/core/browser/login_model.h"
20 #include "components/password_manager/core/browser/password_form_manager.h"
21
22 class PrefRegistrySimple;
23
24 namespace content {
25 class WebContents;
26 }
27
28 namespace user_prefs {
29 class PrefRegistrySyncable;
30 }
31
32 namespace password_manager {
33
34 class BrowserSavePasswordProgressLogger;
35 class PasswordManagerClient;
36 class PasswordManagerDriver;
37 class PasswordManagerTest;
38 class PasswordFormManager;
39
40 // Per-tab password manager. Handles creation and management of UI elements,
41 // receiving password form data from the renderer and managing the password
42 // database through the PasswordStore. The PasswordManager is a LoginModel
43 // for purposes of supporting HTTP authentication dialogs.
44 class PasswordManager : public LoginModel {
45  public:
46   static const char kOtherPossibleUsernamesExperiment[];
47
48   static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
49 #if defined(OS_WIN)
50   static void RegisterLocalPrefs(PrefRegistrySimple* registry);
51 #endif
52   explicit PasswordManager(PasswordManagerClient* client);
53   ~PasswordManager() override;
54
55   typedef base::Callback<void(const autofill::PasswordForm&)>
56       PasswordSubmittedCallback;
57
58   // There is no corresponding remove function as currently all of the
59   // owners of these callbacks have sufficient lifetimes so that the callbacks
60   // should always be valid when called.
61   void AddSubmissionCallback(const PasswordSubmittedCallback& callback);
62
63   // Is saving new data for password autofill enabled for the current profile
64   // and page? For example, saving new data is disabled in Incognito mode,
65   // whereas filling data is not. Also, saving data is disabled in the presence
66   // of SSL errors on a page.
67   bool IsSavingEnabledForCurrentPage() const;
68
69   // Called by a PasswordFormManager when it decides a form can be autofilled
70   // on the page.
71   virtual void Autofill(const autofill::PasswordForm& form_for_autofill,
72                         const autofill::PasswordFormMap& best_matches,
73                         const autofill::PasswordForm& preferred_match,
74                         bool wait_for_username) const;
75
76   // LoginModel implementation.
77   void AddObserver(LoginModelObserver* observer) override;
78   void RemoveObserver(LoginModelObserver* observer) override;
79
80   // Mark this form as having a generated password.
81   void SetFormHasGeneratedPassword(const autofill::PasswordForm& form);
82
83   // TODO(isherman): This should not be public, but is currently being used by
84   // the LoginPrompt code.
85   // When a form is submitted, we prepare to save the password but wait
86   // until we decide the user has successfully logged in. This is step 1
87   // of 2 (see SavePassword).
88   void ProvisionallySavePassword(const autofill::PasswordForm& form);
89
90   // Should be called when the user navigates the main frame.
91   void DidNavigateMainFrame(bool is_in_page);
92
93   // Handles password forms being parsed.
94   void OnPasswordFormsParsed(
95       const std::vector<autofill::PasswordForm>& forms);
96
97   // Handles password forms being rendered.
98   void OnPasswordFormsRendered(
99       const std::vector<autofill::PasswordForm>& visible_forms,
100       bool did_stop_loading);
101
102   // Handles a password form being submitted.
103   virtual void OnPasswordFormSubmitted(
104       const autofill::PasswordForm& password_form);
105
106   PasswordManagerClient* client() { return client_; }
107
108  private:
109   enum ProvisionalSaveFailure {
110     SAVING_DISABLED,
111     EMPTY_PASSWORD,
112     NO_MATCHING_FORM,
113     MATCHING_NOT_COMPLETE,
114     FORM_BLACKLISTED,
115     INVALID_FORM,
116     SYNC_CREDENTIAL,
117     MAX_FAILURE_VALUE
118   };
119
120   // Returns if the password manager is enabled for this page. There are certain
121   // situations (e.g. bad SSL cert) where we disable the password manager
122   // temporarily.
123   bool IsEnabledForCurrentPage() const;
124
125   // Log failure for UMA. Logs additional metrics if the |form_origin|
126   // corresponds to one of the top, explicitly monitored websites. For some
127   // values of |failure| also sends logs to the internals page through |logger|,
128   // it |logger| is not NULL.
129   void RecordFailure(ProvisionalSaveFailure failure,
130                      const std::string& form_origin,
131                      BrowserSavePasswordProgressLogger* logger);
132
133   // Possibly set up FieldTrial for testing other possible usernames. This only
134   // happens if there are other_possible_usernames to be shown and the
135   // experiment hasn't already been initialized. We setup the experiment at
136   // such a late time because this experiment will only affect a small number
137   // of users so we want to include a larger fraction of these users than the
138   // normal 10%.
139   void PossiblyInitializeUsernamesExperiment(
140       const autofill::PasswordFormMap& matches) const;
141
142   // Returns true if we can show possible usernames to users in cases where
143   // the username for the form is ambigious.
144   bool OtherPossibleUsernamesEnabled() const;
145
146   // Returns true if the user needs to be prompted before a password can be
147   // saved (instead of automatically saving
148   // the password), based on inspecting the state of
149   // |provisional_save_manager_|.
150   bool ShouldPromptUserToSavePassword() const;
151
152   // Checks for every from in |forms| whether |pending_login_managers_| already
153   // contain a manager for that form. If not, adds a manager for each such form.
154   void CreatePendingLoginManagers(
155       const std::vector<autofill::PasswordForm>& forms);
156
157   // Note about how a PasswordFormManager can transition from
158   // pending_login_managers_ to provisional_save_manager_ and the infobar.
159   //
160   // 1. form "seen"
161   //       |                                             new
162   //       |                                               ___ Infobar
163   // pending_login -- form submit --> provisional_save ___/
164   //             ^                            |           \___ (update DB)
165   //             |                           fail
166   //             |-----------<------<---------|          !new
167   //
168   // When a form is "seen" on a page, a PasswordFormManager is created
169   // and stored in this collection until user navigates away from page.
170
171   ScopedVector<PasswordFormManager> pending_login_managers_;
172
173   // When the user submits a password/credential, this contains the
174   // PasswordFormManager for the form in question until we deem the login
175   // attempt to have succeeded (as in valid credentials). If it fails, we
176   // send the PasswordFormManager back to the pending_login_managers_ set.
177   // Scoped in case PasswordManager gets deleted (e.g tab closes) between the
178   // time a user submits a login form and gets to the next page.
179   scoped_ptr<PasswordFormManager> provisional_save_manager_;
180
181   // The embedder-level client. Must outlive this class.
182   PasswordManagerClient* const client_;
183
184   // The platform-level driver. Must outlive this class.
185   PasswordManagerDriver* const driver_;
186
187   // Set to false to disable password saving (will no longer ask if you
188   // want to save passwords but will continue to fill passwords).
189   BooleanPrefMember saving_passwords_enabled_;
190
191   // Observers to be notified of LoginModel events.  This is mutable to allow
192   // notification in const member functions.
193   mutable ObserverList<LoginModelObserver> observers_;
194
195   // Callbacks to be notified when a password form has been submitted.
196   std::vector<PasswordSubmittedCallback> submission_callbacks_;
197
198   // Records all visible forms seen during a page load, in all frames of the
199   // page. When the page stops loading, the password manager checks if one of
200   // the recorded forms matches the login form from the previous page
201   // (to see if the login was a failure), and clears the vector.
202   std::vector<autofill::PasswordForm> all_visible_forms_;
203
204   DISALLOW_COPY_AND_ASSIGN(PasswordManager);
205 };
206
207 }  // namespace password_manager
208
209 #endif  // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_MANAGER_H_