OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef CHROME_BROWSER_UI_PASSWORDS_MANAGE_PASSWORDS_UI_CONTROLLER_H_ | 5 #ifndef CHROME_BROWSER_UI_PASSWORDS_MANAGE_PASSWORDS_UI_CONTROLLER_H_ |
6 #define CHROME_BROWSER_UI_PASSWORDS_MANAGE_PASSWORDS_UI_CONTROLLER_H_ | 6 #define CHROME_BROWSER_UI_PASSWORDS_MANAGE_PASSWORDS_UI_CONTROLLER_H_ |
7 | 7 |
8 #include "base/memory/scoped_vector.h" | 8 #include "base/memory/scoped_vector.h" |
9 #include "base/timer/elapsed_timer.h" | 9 #include "base/timer/elapsed_timer.h" |
10 #include "components/autofill/core/common/password_form.h" | 10 #include "components/autofill/core/common/password_form.h" |
11 #include "components/password_manager/core/browser/password_store.h" | 11 #include "components/password_manager/core/browser/password_store.h" |
12 #include "components/password_manager/core/common/password_manager_ui.h" | 12 #include "components/password_manager/core/common/password_manager_ui.h" |
13 #include "content/public/browser/web_contents_observer.h" | 13 #include "content/public/browser/web_contents_observer.h" |
14 #include "content/public/browser/web_contents_user_data.h" | 14 #include "content/public/browser/web_contents_user_data.h" |
15 | 15 |
16 namespace content { | 16 namespace content { |
17 class WebContents; | 17 class WebContents; |
18 } | 18 } |
19 | 19 |
20 namespace password_manager { | 20 namespace password_manager { |
| 21 struct CredentialInfo; |
21 class PasswordFormManager; | 22 class PasswordFormManager; |
22 } | 23 } |
23 | 24 |
24 class ManagePasswordsIcon; | 25 class ManagePasswordsIcon; |
25 | 26 |
26 // Per-tab class to control the Omnibox password icon and bubble. | 27 // Per-tab class to control the Omnibox password icon and bubble. |
27 class ManagePasswordsUIController | 28 class ManagePasswordsUIController |
28 : public content::WebContentsObserver, | 29 : public content::WebContentsObserver, |
29 public content::WebContentsUserData<ManagePasswordsUIController>, | 30 public content::WebContentsUserData<ManagePasswordsUIController>, |
30 public password_manager::PasswordStore::Observer { | 31 public password_manager::PasswordStore::Observer { |
31 public: | 32 public: |
32 ~ManagePasswordsUIController() override; | 33 ~ManagePasswordsUIController() override; |
33 | 34 |
34 // Called when the user submits a form containing login information, so we | 35 // Called when the user submits a form containing login information, so we |
35 // can handle later requests to save or blacklist that login information. | 36 // can handle later requests to save or blacklist that login information. |
36 // This stores the provided object in form_manager_ and triggers the UI to | 37 // This stores the provided object in form_manager_ and triggers the UI to |
37 // prompt the user about whether they would like to save the password. | 38 // prompt the user about whether they would like to save the password. |
38 void OnPasswordSubmitted( | 39 void OnPasswordSubmitted( |
39 scoped_ptr<password_manager::PasswordFormManager> form_manager); | 40 scoped_ptr<password_manager::PasswordFormManager> form_manager); |
40 | 41 |
| 42 // Called when the site asks user to choose from credentials. This triggers |
| 43 // the UI to prompt the user. |credentials| shouldn't be empty. |
| 44 bool OnChooseCredentials( |
| 45 ScopedVector<autofill::PasswordForm> credentials, |
| 46 base::Callback<void(const password_manager::CredentialInfo&)> callback); |
| 47 |
41 // Called when the password will be saved automatically, but we still wish to | 48 // Called when the password will be saved automatically, but we still wish to |
42 // visually inform the user that the save has occured. | 49 // visually inform the user that the save has occured. |
43 void OnAutomaticPasswordSave( | 50 void OnAutomaticPasswordSave( |
44 scoped_ptr<password_manager::PasswordFormManager> form_manager); | 51 scoped_ptr<password_manager::PasswordFormManager> form_manager); |
45 | 52 |
46 // Called when a form is autofilled with login information, so we can manage | 53 // Called when a form is autofilled with login information, so we can manage |
47 // password credentials for the current site which are stored in | 54 // password credentials for the current site which are stored in |
48 // |password_form_map|. This stores a copy of |password_form_map| and shows | 55 // |password_form_map|. This stores a copy of |password_form_map| and shows |
49 // the manage password icon. | 56 // the manage password icon. |
50 void OnPasswordAutofilled(const autofill::PasswordFormMap& password_form_map); | 57 void OnPasswordAutofilled(const autofill::PasswordFormMap& password_form_map); |
51 | 58 |
52 // Called when a form is _not_ autofilled due to user blacklisting. This | 59 // Called when a form is _not_ autofilled due to user blacklisting. This |
53 // stores a copy of |password_form_map| so that we can offer the user the | 60 // stores a copy of |password_form_map| so that we can offer the user the |
54 // ability to reenable the manager for this form. | 61 // ability to reenable the manager for this form. |
55 void OnBlacklistBlockedAutofill( | 62 void OnBlacklistBlockedAutofill( |
56 const autofill::PasswordFormMap& password_form_map); | 63 const autofill::PasswordFormMap& password_form_map); |
57 | 64 |
58 // PasswordStore::Observer implementation. | 65 // PasswordStore::Observer implementation. |
59 void OnLoginsChanged( | 66 void OnLoginsChanged( |
60 const password_manager::PasswordStoreChangeList& changes) override; | 67 const password_manager::PasswordStoreChangeList& changes) override; |
61 | 68 |
62 // Called from the model when the user chooses to save a password; passes the | 69 // Called from the model when the user chooses to save a password; passes the |
63 // action off to the FormManager. The controller MUST be in a pending state, | 70 // action off to the FormManager. The controller MUST be in a pending state, |
64 // and WILL be in MANAGE_STATE after this method executes. | 71 // and WILL be in MANAGE_STATE after this method executes. |
65 virtual void SavePassword(); | 72 virtual void SavePassword(); |
66 | 73 |
| 74 // Called from the model when the user chooses a credential. |
| 75 // The controller MUST be in a pending credentials state. |
| 76 virtual void ChooseCredential(bool was_chosen, |
| 77 const autofill::PasswordForm& form); |
| 78 |
67 // Called from the model when the user chooses to never save passwords; passes | 79 // Called from the model when the user chooses to never save passwords; passes |
68 // the action off to the FormManager. The controller MUST be in a pending | 80 // the action off to the FormManager. The controller MUST be in a pending |
69 // state, and WILL be in BLACKLIST_STATE after this method executes. | 81 // state, and WILL be in BLACKLIST_STATE after this method executes. |
70 virtual void NeverSavePassword(); | 82 virtual void NeverSavePassword(); |
71 | 83 |
72 // Called from the model when the user chooses to unblacklist the site. The | 84 // Called from the model when the user chooses to unblacklist the site. The |
73 // controller MUST be in BLACKLIST_STATE, and WILL be in MANAGE_STATE after | 85 // controller MUST be in BLACKLIST_STATE, and WILL be in MANAGE_STATE after |
74 // this method executes. | 86 // this method executes. |
75 virtual void UnblacklistSite(); | 87 virtual void UnblacklistSite(); |
76 | 88 |
77 // Open a new tab, pointing to the password manager settings page. | 89 // Open a new tab, pointing to the password manager settings page. |
78 virtual void NavigateToPasswordManagerSettingsPage(); | 90 virtual void NavigateToPasswordManagerSettingsPage(); |
79 | 91 |
80 virtual const autofill::PasswordForm& PendingCredentials() const; | 92 virtual const autofill::PasswordForm& PendingPassword() const; |
81 | 93 |
82 // Set the state of the Omnibox icon, and possibly show the associated bubble | 94 // Set the state of the Omnibox icon, and possibly show the associated bubble |
83 // without user interaction. | 95 // without user interaction. |
84 virtual void UpdateIconAndBubbleState(ManagePasswordsIcon* icon); | 96 virtual void UpdateIconAndBubbleState(ManagePasswordsIcon* icon); |
85 | 97 |
| 98 // Called from the model when the bubble is displayed. |
| 99 void OnBubbleShown(); |
| 100 |
86 password_manager::ui::State state() const { return state_; } | 101 password_manager::ui::State state() const { return state_; } |
87 | 102 |
| 103 ScopedVector<autofill::PasswordForm>& new_password_forms() { |
| 104 return new_password_forms_; |
| 105 } |
| 106 |
88 // True if a password is sitting around, waiting for a user to decide whether | 107 // True if a password is sitting around, waiting for a user to decide whether |
89 // or not to save it. | 108 // or not to save it. |
90 bool PasswordPendingUserDecision() const; | 109 bool PasswordPendingUserDecision() const; |
91 | 110 |
92 const autofill::ConstPasswordFormMap& best_matches() const { | 111 const autofill::ConstPasswordFormMap& best_matches() const { |
93 return password_form_map_; | 112 return password_form_map_; |
94 } | 113 } |
95 | 114 |
96 const GURL& origin() const { return origin_; } | 115 const GURL& origin() const { return origin_; } |
97 | 116 |
98 protected: | 117 protected: |
99 explicit ManagePasswordsUIController( | 118 explicit ManagePasswordsUIController( |
100 content::WebContents* web_contents); | 119 content::WebContents* web_contents); |
101 | 120 |
102 // The pieces of saving and blacklisting passwords that interact with | 121 // The pieces of saving and blacklisting passwords that interact with |
103 // FormManager, split off into internal functions for testing/mocking. | 122 // FormManager, split off into internal functions for testing/mocking. |
104 virtual void SavePasswordInternal(); | 123 virtual void SavePasswordInternal(); |
105 virtual void NeverSavePasswordInternal(); | 124 virtual void NeverSavePasswordInternal(); |
106 | 125 |
| 126 // Called when a passwordform is autofilled, when a new passwordform is |
| 127 // submitted, or when a navigation occurs to update the visibility of the |
| 128 // manage passwords icon and bubble. |
| 129 virtual void UpdateBubbleAndIconVisibility(); |
| 130 |
107 // content::WebContentsObserver: | 131 // content::WebContentsObserver: |
108 void DidNavigateMainFrame( | 132 void DidNavigateMainFrame( |
109 const content::LoadCommittedDetails& details, | 133 const content::LoadCommittedDetails& details, |
110 const content::FrameNavigateParams& params) override; | 134 const content::FrameNavigateParams& params) override; |
111 void WasHidden() override; | 135 void WasHidden() override; |
112 | 136 |
113 // We create copies of PasswordForm objects that come in with unclear lifetime | 137 // We create copies of PasswordForm objects that come in with unclear lifetime |
114 // and store them in this vector as well as in |password_form_map_| to ensure | 138 // and store them in this vector as well as in |password_form_map_| to ensure |
115 // that we destroy them correctly. If |new_password_forms_| gets cleared then | 139 // that we destroy them correctly. If |new_password_forms_| gets cleared then |
116 // |password_form_map_| is to be cleared too. | 140 // |password_form_map_| is to be cleared too. |
(...skipping 13 matching lines...) Expand all Loading... |
130 // (and destroy) the timer in DidNavigateMainFrame. | 154 // (and destroy) the timer in DidNavigateMainFrame. |
131 scoped_ptr<base::ElapsedTimer> timer_; | 155 scoped_ptr<base::ElapsedTimer> timer_; |
132 | 156 |
133 private: | 157 private: |
134 friend class content::WebContentsUserData<ManagePasswordsUIController>; | 158 friend class content::WebContentsUserData<ManagePasswordsUIController>; |
135 | 159 |
136 // Shows the password bubble without user interaction. The controller MUST | 160 // Shows the password bubble without user interaction. The controller MUST |
137 // be in PENDING_PASSWORD_AND_BUBBLE_STATE. | 161 // be in PENDING_PASSWORD_AND_BUBBLE_STATE. |
138 void ShowBubbleWithoutUserInteraction(); | 162 void ShowBubbleWithoutUserInteraction(); |
139 | 163 |
140 // Called when a passwordform is autofilled, when a new passwordform is | |
141 // submitted, or when a navigation occurs to update the visibility of the | |
142 // manage passwords icon and bubble. | |
143 void UpdateBubbleAndIconVisibility(); | |
144 | |
145 // content::WebContentsObserver: | 164 // content::WebContentsObserver: |
146 void WebContentsDestroyed() override; | 165 void WebContentsDestroyed() override; |
147 | 166 |
148 // Set by OnPasswordSubmitted() when the user submits a form containing login | 167 // Set by OnPasswordSubmitted() when the user submits a form containing login |
149 // information. If the user responds to a subsequent "Do you want to save | 168 // information. If the user responds to a subsequent "Do you want to save |
150 // this password?" prompt, we ask this object to save or blacklist the | 169 // this password?" prompt, we ask this object to save or blacklist the |
151 // associated login information in Chrome's password store. | 170 // associated login information in Chrome's password store. |
152 scoped_ptr<password_manager::PasswordFormManager> form_manager_; | 171 scoped_ptr<password_manager::PasswordFormManager> form_manager_; |
153 | 172 |
154 // Stores whether autofill was blocked due to a user's decision to blacklist | 173 // A callback to be invoked when user selects a credential. |
155 // the current site ("Never save passwords for this site"). | 174 base::Callback<void(const password_manager::CredentialInfo&)> |
156 bool autofill_blocked_; | 175 credentials_callback_; |
| 176 |
| 177 // Contains true is the bubble's appeared during the last call to |
| 178 // UpdateBubbleAndIconVisibility(). |
| 179 bool bubble_shown_; |
157 | 180 |
158 // The origin of the form we're currently dealing with; we'll use this to | 181 // The origin of the form we're currently dealing with; we'll use this to |
159 // determine which PasswordStore changes we should care about when updating | 182 // determine which PasswordStore changes we should care about when updating |
160 // |password_form_map_|. | 183 // |password_form_map_|. |
161 GURL origin_; | 184 GURL origin_; |
162 | 185 |
163 DISALLOW_COPY_AND_ASSIGN(ManagePasswordsUIController); | 186 DISALLOW_COPY_AND_ASSIGN(ManagePasswordsUIController); |
164 }; | 187 }; |
165 | 188 |
166 #endif // CHROME_BROWSER_UI_PASSWORDS_MANAGE_PASSWORDS_UI_CONTROLLER_H_ | 189 #endif // CHROME_BROWSER_UI_PASSWORDS_MANAGE_PASSWORDS_UI_CONTROLLER_H_ |
OLD | NEW |