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

Side by Side Diff: components/autofill/core/browser/autofill_external_delegate.cc

Issue 772253003: Create an autofill Suggestion class (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: self review 2 Created 6 years 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
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 #include "components/autofill/core/browser/autofill_external_delegate.h" 5 #include "components/autofill/core/browser/autofill_external_delegate.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/message_loop/message_loop.h" 9 #include "base/message_loop/message_loop.h"
10 #include "base/metrics/histogram.h" 10 #include "base/metrics/histogram.h"
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 80
81 query_form_ = form; 81 query_form_ = form;
82 query_field_ = field; 82 query_field_ = field;
83 display_warning_if_disabled_ = display_warning_if_disabled; 83 display_warning_if_disabled_ = display_warning_if_disabled;
84 query_id_ = query_id; 84 query_id_ = query_id;
85 element_bounds_ = element_bounds; 85 element_bounds_ = element_bounds;
86 } 86 }
87 87
88 void AutofillExternalDelegate::OnSuggestionsReturned( 88 void AutofillExternalDelegate::OnSuggestionsReturned(
89 int query_id, 89 int query_id,
90 const std::vector<base::string16>& suggested_values, 90 const std::vector<Suggestion>& input_suggestions) {
91 const std::vector<base::string16>& suggested_labels,
92 const std::vector<base::string16>& suggested_icons,
93 const std::vector<int>& suggested_unique_ids) {
94 if (query_id != query_id_) 91 if (query_id != query_id_)
95 return; 92 return;
96 93
97 std::vector<base::string16> values(suggested_values); 94 std::vector<Suggestion> suggestions(input_suggestions);
98 std::vector<base::string16> labels(suggested_labels);
99 std::vector<base::string16> icons(suggested_icons);
100 std::vector<int> ids(suggested_unique_ids);
101 95
102 // Add or hide warnings as appropriate. 96 // Add or hide warnings as appropriate.
103 ApplyAutofillWarnings(&values, &labels, &icons, &ids); 97 ApplyAutofillWarnings(&suggestions);
104 98
105 // Add a separator to go between the values and menu items. 99 // Add a separator to go between the values and menu items.
106 values.push_back(base::string16()); 100 suggestions.push_back(Suggestion());
107 labels.push_back(base::string16()); 101 suggestions.back().frontend_id = POPUP_ITEM_ID_SEPARATOR;
108 icons.push_back(base::string16());
109 ids.push_back(POPUP_ITEM_ID_SEPARATOR);
110 102
111 if (manager_->ShouldShowScanCreditCard(query_form_, query_field_)) { 103 if (manager_->ShouldShowScanCreditCard(query_form_, query_field_)) {
112 values.push_back(l10n_util::GetStringUTF16(IDS_AUTOFILL_SCAN_CREDIT_CARD)); 104 Suggestion scan_credit_card(
113 labels.push_back(base::string16()); 105 l10n_util::GetStringUTF16(IDS_AUTOFILL_SCAN_CREDIT_CARD));
114 icons.push_back(base::string16()); 106 scan_credit_card.frontend_id = POPUP_ITEM_ID_SCAN_CREDIT_CARD;
115 ids.push_back(POPUP_ITEM_ID_SCAN_CREDIT_CARD); 107 suggestions.push_back(scan_credit_card);
116 } 108 }
117 109
118 // Only include "Autofill Options" special menu item if we have Autofill 110 // Only include "Autofill Options" special menu item if we have Autofill
119 // suggestions. 111 // suggestions.
120 has_suggestion_ = false; 112 has_suggestion_ = false;
121 for (size_t i = 0; i < ids.size(); ++i) { 113 for (size_t i = 0; i < suggestions.size(); ++i) {
122 if (ids[i] > 0) { 114 if (suggestions[i].frontend_id > 0) {
123 has_suggestion_ = true; 115 has_suggestion_ = true;
124 break; 116 break;
125 } 117 }
126 } 118 }
127 119
128 if (has_suggestion_) 120 if (has_suggestion_)
129 ApplyAutofillOptions(&values, &labels, &icons, &ids); 121 ApplyAutofillOptions(&suggestions);
130 122
131 // Remove the separator if it is the last element. 123 // Remove the separator if it is the last element.
132 DCHECK_GT(ids.size(), 0U); 124 DCHECK_GT(suggestions.size(), 0U);
133 if (ids.back() == POPUP_ITEM_ID_SEPARATOR) { 125 if (suggestions.back().frontend_id == POPUP_ITEM_ID_SEPARATOR)
134 values.pop_back(); 126 suggestions.pop_back();
135 labels.pop_back();
136 icons.pop_back();
137 ids.pop_back();
138 }
139 127
140 // If anything else is added to modify the values after inserting the data 128 // If anything else is added to modify the values after inserting the data
141 // list, AutofillPopupControllerImpl::UpdateDataListValues will need to be 129 // list, AutofillPopupControllerImpl::UpdateDataListValues will need to be
142 // updated to match. 130 // updated to match.
143 InsertDataListValues(&values, &labels, &icons, &ids); 131 InsertDataListValues(&suggestions);
144 132
145 #if defined(OS_MACOSX) && !defined(OS_IOS) 133 #if defined(OS_MACOSX) && !defined(OS_IOS)
146 if (values.empty() && 134 if (values.empty() &&
147 manager_->ShouldShowAccessAddressBookSuggestion(query_form_, 135 manager_->ShouldShowAccessAddressBookSuggestion(query_form_,
148 query_field_)) { 136 query_field_)) {
149 values.push_back( 137 Suggestion mac_contacts(
150 l10n_util::GetStringUTF16(IDS_AUTOFILL_ACCESS_MAC_CONTACTS)); 138 l10n_util::GetStringUTF16(IDS_AUTOFILL_ACCESS_MAC_CONTACTS);
151 labels.push_back(base::string16()); 139 mac_contacts.icon = base::ASCIIToUTF16("macContactsIcon");
152 icons.push_back(base::ASCIIToUTF16("macContactsIcon")); 140 mac_contacts.frontend_id = POPUP_ITEM_ID_MAC_ACCESS_CONTACTS;
153 ids.push_back(POPUP_ITEM_ID_MAC_ACCESS_CONTACTS);
154 141
155 if (!has_shown_address_book_prompt) { 142 if (!has_shown_address_book_prompt) {
156 has_shown_address_book_prompt = true; 143 has_shown_address_book_prompt = true;
157 EmitHistogram(SHOWED_ACCESS_ADDRESS_BOOK_ENTRY); 144 EmitHistogram(SHOWED_ACCESS_ADDRESS_BOOK_ENTRY);
158 manager_->ShowedAccessAddressBookPrompt(); 145 manager_->ShowedAccessAddressBookPrompt();
159 } 146 }
160 } 147 }
161 #endif // defined(OS_MACOSX) && !defined(OS_IOS) 148 #endif // defined(OS_MACOSX) && !defined(OS_IOS)
162 149
163 if (values.empty()) { 150 if (suggestions.empty()) {
164 // No suggestions, any popup currently showing is obsolete. 151 // No suggestions, any popup currently showing is obsolete.
165 manager_->client()->HideAutofillPopup(); 152 manager_->client()->HideAutofillPopup();
166 return; 153 return;
167 } 154 }
168 155
169 // Send to display. 156 // Send to display.
170 if (query_field_.is_focusable) { 157 if (query_field_.is_focusable) {
171 manager_->client()->ShowAutofillPopup(element_bounds_, 158 manager_->client()->ShowAutofillPopup(element_bounds_,
172 query_field_.text_direction, 159 query_field_.text_direction,
173 values, 160 suggestions,
174 labels,
175 icons,
176 ids,
177 GetWeakPtr()); 161 GetWeakPtr());
178 } 162 }
179 } 163 }
180 164
181 void AutofillExternalDelegate::SetCurrentDataListValues( 165 void AutofillExternalDelegate::SetCurrentDataListValues(
182 const std::vector<base::string16>& data_list_values, 166 const std::vector<base::string16>& data_list_values,
183 const std::vector<base::string16>& data_list_labels) { 167 const std::vector<base::string16>& data_list_labels) {
184 data_list_values_ = data_list_values; 168 data_list_values_ = data_list_values;
185 data_list_labels_ = data_list_labels; 169 data_list_labels_ = data_list_labels;
186 170
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
328 DCHECK(driver_->RendererIsAvailable()); 312 DCHECK(driver_->RendererIsAvailable());
329 // Fill the values for the whole form. 313 // Fill the values for the whole form.
330 manager_->FillOrPreviewForm(renderer_action, 314 manager_->FillOrPreviewForm(renderer_action,
331 query_id_, 315 query_id_,
332 query_form_, 316 query_form_,
333 query_field_, 317 query_field_,
334 unique_id); 318 unique_id);
335 } 319 }
336 320
337 void AutofillExternalDelegate::ApplyAutofillWarnings( 321 void AutofillExternalDelegate::ApplyAutofillWarnings(
338 std::vector<base::string16>* values, 322 std::vector<Suggestion>* suggestions) {
339 std::vector<base::string16>* labels,
340 std::vector<base::string16>* icons,
341 std::vector<int>* unique_ids) {
342 if (!ShouldAutofill(query_field_)) { 323 if (!ShouldAutofill(query_field_)) {
343 // Autofill is disabled. If there were some profile or credit card 324 // Autofill is disabled. If there were some profile or credit card
344 // suggestions to show, show a warning instead. Otherwise, clear out the 325 // suggestions to show, show a warning instead. Otherwise, clear out the
345 // list of suggestions. 326 // list of suggestions.
346 if (!unique_ids->empty() && (*unique_ids)[0] > 0) { 327 if (!suggestions->empty() && (*suggestions)[0].frontend_id > 0) {
347 // If Autofill is disabled and we had suggestions, show a warning instead. 328 // If Autofill is disabled and we had suggestions, show a warning instead.
348 values->assign( 329 suggestions->assign(1, Suggestion(
349 1, l10n_util::GetStringUTF16(IDS_AUTOFILL_WARNING_FORM_DISABLED)); 330 l10n_util::GetStringUTF16(IDS_AUTOFILL_WARNING_FORM_DISABLED)));
350 labels->assign(1, base::string16()); 331 (*suggestions)[0].frontend_id = POPUP_ITEM_ID_WARNING_MESSAGE;
351 icons->assign(1, base::string16());
352 unique_ids->assign(1, POPUP_ITEM_ID_WARNING_MESSAGE);
353 } else { 332 } else {
354 values->clear(); 333 suggestions->clear();
355 labels->clear();
356 icons->clear();
357 unique_ids->clear();
358 } 334 }
359 } else if (unique_ids->size() > 1 && 335 } else if (suggestions->size() > 1 &&
360 (*unique_ids)[0] == POPUP_ITEM_ID_WARNING_MESSAGE) { 336 (*suggestions)[0].frontend_id == POPUP_ITEM_ID_WARNING_MESSAGE) {
361 // If we received a warning instead of suggestions from Autofill but regular 337 // If we received a warning instead of suggestions from Autofill but regular
362 // suggestions from autocomplete, don't show the Autofill warning. 338 // suggestions from autocomplete, don't show the Autofill warning.
363 values->erase(values->begin()); 339 suggestions->erase(suggestions->begin());
364 labels->erase(labels->begin());
365 icons->erase(icons->begin());
366 unique_ids->erase(unique_ids->begin());
367 } 340 }
368 341
369 // If we were about to show a warning and we shouldn't, don't. 342 // If we were about to show a warning and we shouldn't, don't.
370 if (!unique_ids->empty() && 343 if (!suggestions->empty() &&
371 (*unique_ids)[0] == POPUP_ITEM_ID_WARNING_MESSAGE && 344 (*suggestions)[0].frontend_id == POPUP_ITEM_ID_WARNING_MESSAGE &&
372 !display_warning_if_disabled_) { 345 !display_warning_if_disabled_) {
373 values->clear(); 346 suggestions->clear();
374 labels->clear();
375 icons->clear();
376 unique_ids->clear();
377 } 347 }
378 } 348 }
379 349
380 void AutofillExternalDelegate::ApplyAutofillOptions( 350 void AutofillExternalDelegate::ApplyAutofillOptions(
381 std::vector<base::string16>* values, 351 std::vector<Suggestion>* suggestions) {
382 std::vector<base::string16>* labels,
383 std::vector<base::string16>* icons,
384 std::vector<int>* unique_ids) {
385 // The form has been auto-filled, so give the user the chance to clear the 352 // The form has been auto-filled, so give the user the chance to clear the
386 // form. Append the 'Clear form' menu item. 353 // form. Append the 'Clear form' menu item.
387 if (query_field_.is_autofilled) { 354 if (query_field_.is_autofilled) {
388 values->push_back( 355 suggestions->push_back(Suggestion(
389 l10n_util::GetStringUTF16(IDS_AUTOFILL_CLEAR_FORM_MENU_ITEM)); 356 l10n_util::GetStringUTF16(IDS_AUTOFILL_CLEAR_FORM_MENU_ITEM)));
390 labels->push_back(base::string16()); 357 suggestions->back().frontend_id = POPUP_ITEM_ID_CLEAR_FORM;
391 icons->push_back(base::string16());
392 unique_ids->push_back(POPUP_ITEM_ID_CLEAR_FORM);
393 } 358 }
394 359
395 // Append the 'Chrome Autofill options' menu item; 360 // Append the 'Chrome Autofill options' menu item;
396 values->push_back(l10n_util::GetStringUTF16(IDS_AUTOFILL_OPTIONS_POPUP)); 361 suggestions->push_back(Suggestion(
397 labels->push_back(base::string16()); 362 l10n_util::GetStringUTF16(IDS_AUTOFILL_OPTIONS_POPUP)));
398 icons->push_back(base::string16()); 363 suggestions->back().frontend_id = POPUP_ITEM_ID_AUTOFILL_OPTIONS;
399 unique_ids->push_back(POPUP_ITEM_ID_AUTOFILL_OPTIONS);
400 } 364 }
401 365
402 void AutofillExternalDelegate::InsertDataListValues( 366 void AutofillExternalDelegate::InsertDataListValues(
403 std::vector<base::string16>* values, 367 std::vector<Suggestion>* suggestions) {
404 std::vector<base::string16>* labels,
405 std::vector<base::string16>* icons,
406 std::vector<int>* unique_ids) {
407 if (data_list_values_.empty()) 368 if (data_list_values_.empty())
408 return; 369 return;
409 370
410 // Insert the separator between the datalist and Autofill values (if there 371 // Insert the separator between the datalist and Autofill values (if there
411 // are any). 372 // are any).
412 if (!values->empty()) { 373 if (!suggestions->empty()) {
413 values->insert(values->begin(), base::string16()); 374 suggestions->insert(suggestions->begin(), Suggestion());
414 labels->insert(labels->begin(), base::string16()); 375 (*suggestions)[0].frontend_id = POPUP_ITEM_ID_SEPARATOR;
415 icons->insert(icons->begin(), base::string16());
416 unique_ids->insert(unique_ids->begin(), POPUP_ITEM_ID_SEPARATOR);
417 } 376 }
418 377
419 // Insert the datalist elements. 378 // Insert the datalist elements at the beginning.
420 values->insert(values->begin(), 379 suggestions->insert(suggestions->begin(), data_list_values_.size(),
421 data_list_values_.begin(), 380 Suggestion());
422 data_list_values_.end()); 381 for (size_t i = 0; i < data_list_values_.size(); i++) {
423 labels->insert(labels->begin(), 382 (*suggestions)[i].value = data_list_values_[i];
424 data_list_labels_.begin(), 383 (*suggestions)[i].label = data_list_labels_[i];
425 data_list_labels_.end()); 384 (*suggestions)[i].frontend_id = POPUP_ITEM_ID_DATALIST_ENTRY;
426 385 }
427 // Set the values that all datalist elements share.
428 icons->insert(icons->begin(),
429 data_list_values_.size(),
430 base::string16());
431 unique_ids->insert(unique_ids->begin(),
432 data_list_values_.size(),
433 POPUP_ITEM_ID_DATALIST_ENTRY);
434 } 386 }
435 387
436 #if defined(OS_MACOSX) && !defined(OS_IOS) 388 #if defined(OS_MACOSX) && !defined(OS_IOS)
437 void AutofillExternalDelegate::PingRenderer() { 389 void AutofillExternalDelegate::PingRenderer() {
438 driver_->PingRenderer(); 390 driver_->PingRenderer();
439 } 391 }
440 #endif // defined(OS_MACOSX) && !defined(OS_IOS) 392 #endif // defined(OS_MACOSX) && !defined(OS_IOS)
441 393
442 } // namespace autofill 394 } // namespace autofill
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698