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

Side by Side Diff: chrome/renderer/autofill_helper.cc

Issue 4591001: Display a warning when autofill is disabled for a website. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Now with unit tests! Created 10 years, 1 month 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 (c) 2010 The Chromium Authors. All rights reserved. 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 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 #include "chrome/renderer/autofill_helper.h" 5 #include "chrome/renderer/autofill_helper.h"
6 6
7 #include "app/l10n_util.h" 7 #include "app/l10n_util.h"
8 #include "base/utf_string_conversions.h" 8 #include "base/utf_string_conversions.h"
9 #include "chrome/common/chrome_constants.h" 9 #include "chrome/common/chrome_constants.h"
10 #include "chrome/renderer/form_manager.h" 10 #include "chrome/renderer/form_manager.h"
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 } // namespace 47 } // namespace
48 48
49 AutoFillHelper::AutoFillHelper(RenderView* render_view) 49 AutoFillHelper::AutoFillHelper(RenderView* render_view)
50 : render_view_(render_view), 50 : render_view_(render_view),
51 autofill_query_id_(0), 51 autofill_query_id_(0),
52 autofill_action_(AUTOFILL_NONE), 52 autofill_action_(AUTOFILL_NONE),
53 suggestions_clear_index_(-1), 53 suggestions_clear_index_(-1),
54 suggestions_options_index_(-1) { 54 suggestions_options_index_(-1) {
55 } 55 }
56 56
57 void AutoFillHelper::QueryAutoFillSuggestions(const WebNode& node) { 57 void AutoFillHelper::QueryAutoFillSuggestions(const WebNode& node,
58 bool autofill_disabled) {
58 static int query_counter = 0; 59 static int query_counter = 0;
59 autofill_query_id_ = query_counter++; 60 autofill_query_id_ = query_counter++;
60 autofill_query_node_ = node; 61 autofill_query_node_ = node;
61 62
62 const WebFormControlElement& element = node.toConst<WebFormControlElement>(); 63 const WebFormControlElement& element = node.toConst<WebFormControlElement>();
63 webkit_glue::FormField field; 64 webkit_glue::FormField field;
64 FormManager::WebFormControlElementToFormField( 65 FormManager::WebFormControlElementToFormField(
65 element, FormManager::EXTRACT_VALUE, &field); 66 element, FormManager::EXTRACT_VALUE, &field);
66 67
67 // WebFormControlElementToFormField does not scrape the DOM for the field 68 // WebFormControlElementToFormField does not scrape the DOM for the field
68 // label, so find the label here. 69 // label, so find the label here.
69 // TODO(jhawkins): Add form and field identities so we can use the cached form 70 // TODO(jhawkins): Add form and field identities so we can use the cached form
70 // data in FormManager. 71 // data in FormManager.
71 field.set_label(FormManager::LabelForElement(element)); 72 field.set_label(FormManager::LabelForElement(element));
72 73
73 bool field_autofilled = NodeIsAutoFilled(node); 74 bool field_autofilled = NodeIsAutoFilled(node);
74 render_view_->Send(new ViewHostMsg_QueryFormFieldAutoFill( 75 render_view_->Send(new ViewHostMsg_QueryFormFieldAutoFill(
75 render_view_->routing_id(), autofill_query_id_, field_autofilled, field)); 76 render_view_->routing_id(), autofill_query_id_, field_autofilled, field,
77 autofill_disabled));
76 } 78 }
77 79
78 void AutoFillHelper::RemoveAutocompleteSuggestion( 80 void AutoFillHelper::RemoveAutocompleteSuggestion(
79 const WebKit::WebString& name, const WebKit::WebString& value) { 81 const WebKit::WebString& name, const WebKit::WebString& value) {
80 // The index of clear & options will have shifted down. 82 // The index of clear & options will have shifted down.
81 if (suggestions_clear_index_ != -1) 83 if (suggestions_clear_index_ != -1)
82 suggestions_clear_index_--; 84 suggestions_clear_index_--;
83 if (suggestions_options_index_ != -1) 85 if (suggestions_options_index_ != -1)
84 suggestions_options_index_--; 86 suggestions_options_index_--;
85 87
(...skipping 30 matching lines...) Expand all
116 i.push_back(string16()); 118 i.push_back(string16());
117 ids.push_back(0); 119 ids.push_back(0);
118 suggestions_clear_index_ = v.size() - 1; 120 suggestions_clear_index_ = v.size() - 1;
119 separator_index = values.size(); 121 separator_index = values.size();
120 } 122 }
121 123
122 // Only include "AutoFill Options" special menu item if we have AutoFill 124 // Only include "AutoFill Options" special menu item if we have AutoFill
123 // items, identified by |unique_ids| having at least one valid value. 125 // items, identified by |unique_ids| having at least one valid value.
124 bool show_options = false; 126 bool show_options = false;
125 for (size_t i = 0; i < ids.size(); ++i) { 127 for (size_t i = 0; i < ids.size(); ++i) {
126 if (ids[i] != 0) { 128 if (ids[i] > 0) {
127 show_options = true; 129 show_options = true;
128 break; 130 break;
129 } 131 }
130 } 132 }
131 if (show_options) { 133 if (show_options) {
132 // Append the 'Chrome Autofill options' menu item; 134 // Append the 'Chrome Autofill options' menu item;
133 v.push_back(l10n_util::GetStringFUTF16(IDS_AUTOFILL_OPTIONS_POPUP, 135 v.push_back(l10n_util::GetStringFUTF16(IDS_AUTOFILL_OPTIONS_POPUP,
134 WideToUTF16(chrome::kBrowserAppName))); 136 WideToUTF16(chrome::kBrowserAppName)));
135 l.push_back(string16()); 137 l.push_back(string16());
136 i.push_back(string16()); 138 i.push_back(string16());
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
219 221
220 void AutoFillHelper::FrameWillClose(WebFrame* frame) { 222 void AutoFillHelper::FrameWillClose(WebFrame* frame) {
221 form_manager_.ResetFrame(frame); 223 form_manager_.ResetFrame(frame);
222 } 224 }
223 225
224 void AutoFillHelper::FrameDetached(WebFrame* frame) { 226 void AutoFillHelper::FrameDetached(WebFrame* frame) {
225 form_manager_.ResetFrame(frame); 227 form_manager_.ResetFrame(frame);
226 } 228 }
227 229
228 void AutoFillHelper::TextDidChangeInTextField(const WebInputElement& element) { 230 void AutoFillHelper::TextDidChangeInTextField(const WebInputElement& element) {
229 ShowSuggestions(element, false, true); 231 ShowSuggestions(element, false, true, false);
230 } 232 }
231 233
232 bool AutoFillHelper::InputElementClicked(const WebInputElement& element, 234 bool AutoFillHelper::InputElementClicked(const WebInputElement& element,
233 bool was_focused, 235 bool was_focused,
234 bool is_focused) { 236 bool is_focused) {
235 if (was_focused) 237 if (was_focused)
236 ShowSuggestions(element, true, false); 238 ShowSuggestions(element, true, false, true);
237 return false; 239 return false;
238 } 240 }
239 241
242 void AutoFillHelper::ShowSuggestions(const WebInputElement& element,
243 bool autofill_on_empty_values,
244 bool requires_caret_at_end,
245 bool display_warning_if_disabled) {
246 bool autofill_disabled = !element.isEnabledFormControl() ||
247 !element.isText() || element.isPasswordField() ||
248 !element.autoComplete() || element.isReadOnly();
249 if (autofill_disabled && !display_warning_if_disabled)
250 return;
240 251
241 void AutoFillHelper::ShowSuggestions( 252 // If the field has no name, then we won't have values.
242 const WebInputElement& const_element, 253 if (element.nameForAutofill().isEmpty())
243 bool autofill_on_empty_values,
244 bool requires_caret_at_end) {
245 // We need to call non-const methods.
246 WebInputElement element(const_element);
247 if (!element.isEnabledFormControl() ||
248 !element.isText() ||
249 element.isPasswordField() ||
250 !element.autoComplete() || element.isReadOnly()) {
251 return;
252 }
253
254 WebString name = element.nameForAutofill();
255 if (name.isEmpty()) // If the field has no name, then we won't have values.
256 return; 254 return;
257 255
258 // Don't attempt to autofill with values that are too large. 256 // Don't attempt to autofill with values that are too large.
259 WebString value = element.value(); 257 WebString value = element.value();
260 if (value.length() > kMaximumTextSizeForAutoFill) 258 if (value.length() > kMaximumTextSizeForAutoFill)
261 return; 259 return;
262 260
263 if (!autofill_on_empty_values && value.isEmpty()) 261 if (!autofill_on_empty_values && value.isEmpty())
264 return; 262 return;
265 263
266 if (requires_caret_at_end && 264 if (requires_caret_at_end &&
267 (element.selectionStart() != element.selectionEnd() || 265 (element.selectionStart() != element.selectionEnd() ||
268 element.selectionEnd() != static_cast<int>(value.length()))) { 266 element.selectionEnd() != static_cast<int>(value.length())))
269 return; 267 return;
270 }
271 268
272 QueryAutoFillSuggestions(element); 269 QueryAutoFillSuggestions(element, autofill_disabled);
dhollowa 2010/11/12 01:52:03 Could we avoid the IPC call here in the case that
Ilya Sherman 2010/11/12 05:15:38 The thing is, we don't want to show a warning if t
273 } 270 }
274 271
275 void AutoFillHelper::QueryAutoFillFormData(const WebNode& node, 272 void AutoFillHelper::QueryAutoFillFormData(const WebNode& node,
276 int unique_id, 273 int unique_id,
277 AutoFillAction action) { 274 AutoFillAction action) {
278 static int query_counter = 0; 275 static int query_counter = 0;
279 autofill_query_id_ = query_counter++; 276 autofill_query_id_ = query_counter++;
280 277
281 webkit_glue::FormData form; 278 webkit_glue::FormData form;
282 const WebInputElement element = node.toConst<WebInputElement>(); 279 const WebInputElement element = node.toConst<WebInputElement>();
(...skipping 22 matching lines...) Expand all
305 FormManager::EXTRACT_NONE, &form)) { 302 FormManager::EXTRACT_NONE, &form)) {
306 forms.push_back(form); 303 forms.push_back(form);
307 } 304 }
308 } 305 }
309 306
310 if (!forms.empty()) { 307 if (!forms.empty()) {
311 render_view_->Send(new ViewHostMsg_FormsSeen(render_view_->routing_id(), 308 render_view_->Send(new ViewHostMsg_FormsSeen(render_view_->routing_id(),
312 forms)); 309 forms));
313 } 310 }
314 } 311 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698