Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(900)

Side by Side Diff: components/autofill/content/renderer/password_autofill_agent.h

Issue 414013003: Password autofill should not override explicitly typed password (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Further corrections Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 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 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 COMPONENTS_AUTOFILL_CONTENT_RENDERER_PASSWORD_AUTOFILL_AGENT_H_ 5 #ifndef COMPONENTS_AUTOFILL_CONTENT_RENDERER_PASSWORD_AUTOFILL_AGENT_H_
6 #define COMPONENTS_AUTOFILL_CONTENT_RENDERER_PASSWORD_AUTOFILL_AGENT_H_ 6 #define COMPONENTS_AUTOFILL_CONTENT_RENDERER_PASSWORD_AUTOFILL_AGENT_H_
7 7
8 #include <map> 8 #include <map>
9 #include <set>
9 #include <vector> 10 #include <vector>
10 11
11 #include "base/memory/linked_ptr.h" 12 #include "base/memory/linked_ptr.h"
12 #include "base/memory/weak_ptr.h" 13 #include "base/memory/weak_ptr.h"
13 #include "components/autofill/core/common/password_form_fill_data.h" 14 #include "components/autofill/core/common/password_form_fill_data.h"
14 #include "content/public/renderer/render_view_observer.h" 15 #include "content/public/renderer/render_view_observer.h"
15 #include "third_party/WebKit/public/web/WebInputElement.h" 16 #include "third_party/WebKit/public/web/WebInputElement.h"
16 17
17 namespace blink { 18 namespace blink {
18 class WebInputElement; 19 class WebInputElement;
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 // Ways to restrict which passwords are saved in ProvisionallySavePassword. 88 // Ways to restrict which passwords are saved in ProvisionallySavePassword.
88 enum ProvisionallySaveRestriction { 89 enum ProvisionallySaveRestriction {
89 RESTRICTION_NONE, 90 RESTRICTION_NONE,
90 RESTRICTION_NON_EMPTY_PASSWORD 91 RESTRICTION_NON_EMPTY_PASSWORD
91 }; 92 };
92 93
93 struct PasswordInfo { 94 struct PasswordInfo {
94 blink::WebInputElement password_field; 95 blink::WebInputElement password_field;
95 PasswordFormFillData fill_data; 96 PasswordFormFillData fill_data;
96 bool backspace_pressed_last; 97 bool backspace_pressed_last;
97 PasswordInfo() : backspace_pressed_last(false) {} 98 // "Wait for username change" before overwriting the password value -- if
99 // set to true, this flag means that after selecting a username for password
100 // autofill, the user overwrote the autofileld password. The agent should
101 // not restore it back to the autofilled password, so it holds on with
102 // changing the password value until the flag is reset. The flag is reset
103 // when the user chooses another username for autofill.
104 bool wait_for_username_change;
105 PasswordInfo();
98 }; 106 };
99 typedef std::map<blink::WebElement, PasswordInfo> LoginToPasswordInfoMap; 107 // LoginToPasswordInfoMap contains pointers to instead of values of type
108 // PasswordInfo, because the addresses of the values are passed to a
109 // PasswordValueGatekeeper instance, and need therefore remain constant for
110 // the lifetime of the values.
111 typedef std::map<blink::WebElement, PasswordInfo*> LoginToPasswordInfoMap;
112 typedef std::map<blink::WebElement, blink::WebElement> PasswordToLoginMap;
100 typedef std::map<blink::WebFrame*, 113 typedef std::map<blink::WebFrame*,
101 linked_ptr<PasswordForm> > FrameToPasswordFormMap; 114 linked_ptr<PasswordForm> > FrameToPasswordFormMap;
102 115
103 // This class holds a vector of autofilled password input elements and makes 116 // This class keeps track of autofilled password input elements and makes sure
104 // sure the autofilled password value is not accessible to JavaScript code 117 // the autofilled password value is not accessible to JavaScript code until
105 // until the user interacts with the page. 118 // the user interacts with the page.
106 class PasswordValueGatekeeper { 119 class PasswordValueGatekeeper {
107 public: 120 public:
108 PasswordValueGatekeeper(); 121 PasswordValueGatekeeper();
109 ~PasswordValueGatekeeper(); 122 ~PasswordValueGatekeeper();
110 123
111 // Call this for every autofilled password field, so that the gatekeeper 124 // Register |element_info| for every autofilled password field, so that the
112 // protects the value accordingly. 125 // gatekeeper protects the value accordingly. Ownership of |element_info|
113 void RegisterElement(blink::WebInputElement* element); 126 // remains with the caller, and the caller must unregister it via
127 // UnregisterElementInfo or Reset prior to destruction of |element_info|.
128 // The caller also must ensure that the object pointed to by |element_info|
129 // does not change address.
130 void RegisterElementInfo(PasswordInfo* element_info);
131 // Remove |element_info| from the internal map. It is OK to call
132 // UnregisterElementInfo for pointers not contained in the internal map,
133 // because the gatekeeper may choose to not include, or later exclude,
134 // registered pointers at its own discretion.
135 void UnregisterElementInfo(PasswordInfo* element_info);
114 136
115 // Call this to notify the gatekeeper that the user interacted with the 137 // Call this to notify the gatekeeper that the user interacted with the
116 // page. 138 // page.
117 void OnUserGesture(); 139 void OnUserGesture();
118 140
119 // Call this to reset the gatekeeper on a new page navigation. 141 // Call this to reset the gatekeeper on a new page navigation.
120 void Reset(); 142 void Reset();
121 143
122 private: 144 private:
123 // Make the value of |element| accessible to JavaScript code. 145 // Make the value of |element| accessible to JavaScript code.
124 void ShowValue(blink::WebInputElement* element); 146 void ShowValue(blink::WebInputElement* element);
125 147
126 bool was_user_gesture_seen_; 148 bool was_user_gesture_seen_;
127 std::vector<blink::WebInputElement> elements_; 149 // Weak pointers to the PasswordInfo data associated with the guarded
150 // password elements. The Gatekeeper assumes those objects are alive until
151 // they are unregistered.
152 std::set<PasswordInfo*> elements_info_;
128 153
129 DISALLOW_COPY_AND_ASSIGN(PasswordValueGatekeeper); 154 DISALLOW_COPY_AND_ASSIGN(PasswordValueGatekeeper);
130 }; 155 };
131 156
132 // RenderViewObserver: 157 // RenderViewObserver:
133 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; 158 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
134 virtual void DidStartProvisionalLoad(blink::WebLocalFrame* frame) OVERRIDE; 159 virtual void DidStartProvisionalLoad(blink::WebLocalFrame* frame) OVERRIDE;
135 virtual void DidStartLoading() OVERRIDE; 160 virtual void DidStartLoading() OVERRIDE;
136 virtual void DidFinishDocumentLoad(blink::WebLocalFrame* frame) OVERRIDE; 161 virtual void DidFinishDocumentLoad(blink::WebLocalFrame* frame) OVERRIDE;
137 virtual void DidFinishLoad(blink::WebLocalFrame* frame) OVERRIDE; 162 virtual void DidFinishLoad(blink::WebLocalFrame* frame) OVERRIDE;
(...skipping 16 matching lines...) Expand all
154 void GetSuggestions(const PasswordFormFillData& fill_data, 179 void GetSuggestions(const PasswordFormFillData& fill_data,
155 const base::string16& input, 180 const base::string16& input,
156 std::vector<base::string16>* suggestions, 181 std::vector<base::string16>* suggestions,
157 std::vector<base::string16>* realms, 182 std::vector<base::string16>* realms,
158 bool show_all); 183 bool show_all);
159 184
160 bool ShowSuggestionPopup(const PasswordFormFillData& fill_data, 185 bool ShowSuggestionPopup(const PasswordFormFillData& fill_data,
161 const blink::WebInputElement& user_input, 186 const blink::WebInputElement& user_input,
162 bool show_all); 187 bool show_all);
163 188
164 // Attempts to fill |username_element| and |password_element| with the 189 // Attempts to fill |username_element| and the corresponding password field
165 // |fill_data|. Will use the data corresponding to the preferred username, 190 // with |password_info|. Will use the data corresponding to the preferred
166 // unless the |username_element| already has a value set. In that case, 191 // username, unless the username element already has a value set. In that
167 // attempts to fill the password matching the already filled username, if 192 // case, attempts to fill the password matching the already filled username,
168 // such a password exists. 193 // if such a password exists.
169 void FillFormOnPasswordRecieved(const PasswordFormFillData& fill_data, 194 void FillFormOnPasswordRecieved(blink::WebInputElement* username_element,
170 blink::WebInputElement username_element, 195 PasswordInfo* password_info);
171 blink::WebInputElement password_element);
172 196
173 bool FillUserNameAndPassword(blink::WebInputElement* username_element, 197 bool FillUserNameAndPassword(blink::WebInputElement* username_element,
174 blink::WebInputElement* password_element, 198 PasswordInfo* password_info,
175 const PasswordFormFillData& fill_data,
176 bool exact_username_match, 199 bool exact_username_match,
177 bool set_selection); 200 bool set_selection);
178 201
179 // Fills |login_input| and |password| with the most relevant suggestion from 202 // Fills |username| and corresponding password field with the most relevant
180 // |fill_data| and shows a popup with other suggestions. 203 // suggestion from |password_info| and shows a popup with other suggestions.
181 void PerformInlineAutocomplete( 204 void PerformInlineAutocomplete(blink::WebInputElement* username,
182 const blink::WebInputElement& username, 205 PasswordInfo* password_info);
183 const blink::WebInputElement& password,
184 const PasswordFormFillData& fill_data);
185 206
186 // Invoked when the passed frame is closing. Gives us a chance to clear any 207 // Invoked when the passed frame is closing. Gives us a chance to clear any
187 // reference we may have to elements in that frame. 208 // reference we may have to elements in that frame.
188 void FrameClosing(const blink::WebFrame* frame); 209 void FrameClosing(const blink::WebFrame* frame);
189 210
190 // Finds login information for a |node| that was previously filled. 211 // Finds login information for a |node| that was previously filled.
191 bool FindLoginInfo(const blink::WebNode& node, 212 bool FindLoginInfo(const blink::WebNode& node,
192 blink::WebInputElement* found_input, 213 blink::WebInputElement* found_input,
193 PasswordInfo* found_password); 214 PasswordInfo** found_password);
194 215
195 // Clears the preview for the username and password fields, restoring both to 216 // Clears the preview for the username and password fields, restoring both to
196 // their previous filled state. 217 // their previous filled state.
197 void ClearPreview(blink::WebInputElement* username, 218 void ClearPreview(blink::WebInputElement* username,
198 blink::WebInputElement* password); 219 blink::WebInputElement* password);
199 220
200 // If |provisionally_saved_forms_| contains a form for |current_frame| or its 221 // If |provisionally_saved_forms_| contains a form for |current_frame| or its
201 // children, return such frame. 222 // children, return such frame.
202 blink::WebFrame* CurrentOrChildFrameWithSavedForms( 223 blink::WebFrame* CurrentOrChildFrameWithSavedForms(
203 const blink::WebFrame* current_frame); 224 const blink::WebFrame* current_frame);
204 225
205 // Extracts a PasswordForm from |form| and saves it as 226 // Extracts a PasswordForm from |form| and saves it as
206 // |provisionally_saved_forms_[frame]|, as long as it satisfies |restriction|. 227 // |provisionally_saved_forms_[frame]|, as long as it satisfies |restriction|.
207 void ProvisionallySavePassword(blink::WebLocalFrame* frame, 228 void ProvisionallySavePassword(blink::WebLocalFrame* frame,
208 const blink::WebFormElement& form, 229 const blink::WebFormElement& form,
209 ProvisionallySaveRestriction restriction); 230 ProvisionallySaveRestriction restriction);
210 231
211 // The logins we have filled so far with their associated info. 232 // The logins we have filled so far with their associated info.
212 LoginToPasswordInfoMap login_to_password_info_; 233 LoginToPasswordInfoMap login_to_password_info_;
234 // Stores the PasswordInfo objects pointed to by |login_to_password_info_|,
235 // grouped by frames for easy deletion on frame destruction.
236 std::map<const blink::WebFrame*, std::vector<linked_ptr<PasswordInfo> > >
237 password_infos_;
238 // Maps password elements to the corresponding username elements, good for
239 // looking up PasswordInfo associated with a password element in
240 // |login_to_password_info_|.
241 PasswordToLoginMap password_to_username_;
213 242
214 // Used for UMA stats. 243 // Used for UMA stats.
215 OtherPossibleUsernamesUsage usernames_usage_; 244 OtherPossibleUsernamesUsage usernames_usage_;
216 245
217 // Pointer to the WebView. Used to access page scale factor. 246 // Pointer to the WebView. Used to access page scale factor.
218 blink::WebView* web_view_; 247 blink::WebView* web_view_;
219 248
220 // Set if the user might be submitting a password form on the current page, 249 // Set if the user might be submitting a password form on the current page,
221 // but the submit may still fail (i.e. doesn't pass JavaScript validation). 250 // but the submit may still fail (i.e. doesn't pass JavaScript validation).
222 FrameToPasswordFormMap provisionally_saved_forms_; 251 FrameToPasswordFormMap provisionally_saved_forms_;
(...skipping 16 matching lines...) Expand all
239 bool did_stop_loading_; 268 bool did_stop_loading_;
240 269
241 base::WeakPtrFactory<PasswordAutofillAgent> weak_ptr_factory_; 270 base::WeakPtrFactory<PasswordAutofillAgent> weak_ptr_factory_;
242 271
243 DISALLOW_COPY_AND_ASSIGN(PasswordAutofillAgent); 272 DISALLOW_COPY_AND_ASSIGN(PasswordAutofillAgent);
244 }; 273 };
245 274
246 } // namespace autofill 275 } // namespace autofill
247 276
248 #endif // COMPONENTS_AUTOFILL_CONTENT_RENDERER_PASSWORD_AUTOFILL_AGENT_H_ 277 #endif // COMPONENTS_AUTOFILL_CONTENT_RENDERER_PASSWORD_AUTOFILL_AGENT_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698