OLD | NEW |
---|---|
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/browser/autofill/autofill_manager.h" | 5 #include "chrome/browser/autofill/autofill_manager.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 #include <string> | 8 #include <set> |
9 | 9 |
10 #include "app/l10n_util.h" | 10 #include "app/l10n_util.h" |
11 #include "base/basictypes.h" | 11 #include "base/basictypes.h" |
12 #include "base/string16.h" | 12 #include "base/string16.h" |
13 #include "base/utf_string_conversions.h" | 13 #include "base/utf_string_conversions.h" |
14 #include "chrome/browser/autofill/autofill_cc_infobar_delegate.h" | 14 #include "chrome/browser/autofill/autofill_cc_infobar_delegate.h" |
15 #include "chrome/browser/autofill/autofill_dialog.h" | 15 #include "chrome/browser/autofill/autofill_dialog.h" |
16 #include "chrome/browser/autofill/autofill_metrics.h" | 16 #include "chrome/browser/autofill/autofill_metrics.h" |
17 #include "chrome/browser/autofill/form_structure.h" | 17 #include "chrome/browser/autofill/form_structure.h" |
18 #include "chrome/browser/autofill/phone_number.h" | 18 #include "chrome/browser/autofill/phone_number.h" |
(...skipping 16 matching lines...) Expand all Loading... | |
35 namespace { | 35 namespace { |
36 | 36 |
37 // We only send a fraction of the forms to upload server. | 37 // We only send a fraction of the forms to upload server. |
38 // The rate for positive/negative matches potentially could be different. | 38 // The rate for positive/negative matches potentially could be different. |
39 const double kAutoFillPositiveUploadRateDefaultValue = 0.01; | 39 const double kAutoFillPositiveUploadRateDefaultValue = 0.01; |
40 const double kAutoFillNegativeUploadRateDefaultValue = 0.01; | 40 const double kAutoFillNegativeUploadRateDefaultValue = 0.01; |
41 | 41 |
42 const string16::value_type kCreditCardPrefix[] = {'*',0}; | 42 const string16::value_type kCreditCardPrefix[] = {'*',0}; |
43 const string16::value_type kLabelSeparator[] = {';',' ','*',0}; | 43 const string16::value_type kLabelSeparator[] = {';',' ','*',0}; |
44 | 44 |
45 // Removes duplicate elements whilst preserving original order of |elements| and | 45 // Removes duplicate suggestions whilst preserving their original order. |
46 // |unique_ids|. | 46 void RemoveDuplicateSuggestions(std::vector<string16>* values, |
47 void RemoveDuplicateElements( | 47 std::vector<string16>* labels, |
48 std::vector<string16>* elements, std::vector<int>* unique_ids) { | 48 std::vector<string16>* icons, |
49 DCHECK_EQ(elements->size(), unique_ids->size()); | 49 std::vector<int>* unique_ids) { |
50 DCHECK_EQ(values->size(), labels->size()); | |
51 DCHECK_EQ(values->size(), icons->size()); | |
52 DCHECK_EQ(values->size(), unique_ids->size()); | |
50 | 53 |
51 std::vector<string16> elements_copy; | 54 std::set<std::pair<string16, string16> > seen_suggestions; |
55 std::vector<string16> values_copy; | |
56 std::vector<string16> labels_copy; | |
57 std::vector<string16> icons_copy; | |
52 std::vector<int> unique_ids_copy; | 58 std::vector<int> unique_ids_copy; |
53 for (size_t i = 0; i < elements->size(); ++i) { | |
54 const string16& element = (*elements)[i]; | |
55 | 59 |
56 bool unique = true; | 60 for (size_t i = 0; i < values->size(); ++i) { |
57 for (std::vector<string16>::const_iterator copy_iter | 61 const std::pair<string16, string16> suggestion((*values)[i], (*labels)[i]); |
58 = elements_copy.begin(); | 62 if (seen_suggestions.insert(suggestion).second) { |
59 copy_iter != elements_copy.end(); ++copy_iter) { | 63 values_copy.push_back((*values)[i]); |
60 if (element == *copy_iter) { | 64 labels_copy.push_back((*labels)[i]); |
61 unique = false; | 65 icons_copy.push_back((*icons)[i]); |
62 break; | |
63 } | |
64 } | |
65 | |
66 if (unique) { | |
67 elements_copy.push_back(element); | |
68 unique_ids_copy.push_back((*unique_ids)[i]); | 66 unique_ids_copy.push_back((*unique_ids)[i]); |
69 } | 67 } |
70 } | 68 } |
71 | 69 |
72 elements->assign(elements_copy.begin(), elements_copy.end()); | 70 values->swap(values_copy); |
73 unique_ids->assign(unique_ids_copy.begin(), unique_ids_copy.end()); | 71 labels->swap(labels_copy); |
72 icons->swap(icons_copy); | |
73 unique_ids->swap(unique_ids_copy); | |
74 } | 74 } |
75 | 75 |
76 // Precondition: |form_structure| and |form| should correspond to the same | 76 // Precondition: |form_structure| and |form| should correspond to the same |
77 // logical form. Returns true if the relevant portion of |form| is auto-filled. | 77 // logical form. Returns true if the relevant portion of |form| is auto-filled. |
78 // If |is_filling_credit_card|, the relevant portion is the credit card portion; | 78 // If |is_filling_credit_card|, the relevant portion is the credit card portion; |
79 // otherwise it is the address and contact info portion. | 79 // otherwise it is the address and contact info portion. |
80 bool FormIsAutoFilled(const FormStructure* form_structure, | 80 bool FormIsAutoFilled(const FormStructure* form_structure, |
81 const webkit_glue::FormData& form, | 81 const webkit_glue::FormData& form, |
82 bool is_filling_credit_card) { | 82 bool is_filling_credit_card) { |
83 // TODO(isherman): It would be nice to share most of this code with the loop | 83 // TODO(isherman): It would be nice to share most of this code with the loop |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
251 values.assign(1, l10n_util::GetStringUTF16(warning)); | 251 values.assign(1, l10n_util::GetStringUTF16(warning)); |
252 labels.assign(1, string16()); | 252 labels.assign(1, string16()); |
253 icons.assign(1, string16()); | 253 icons.assign(1, string16()); |
254 unique_ids.assign(1, -1); | 254 unique_ids.assign(1, -1); |
255 host->AutoFillSuggestionsReturned(values, labels, icons, unique_ids); | 255 host->AutoFillSuggestionsReturned(values, labels, icons, unique_ids); |
256 return true; | 256 return true; |
257 } | 257 } |
258 | 258 |
259 // If the form is auto-filled and the renderer is querying for suggestions, | 259 // If the form is auto-filled and the renderer is querying for suggestions, |
260 // then the user is editing the value of a field. In this case, mimick | 260 // then the user is editing the value of a field. In this case, mimick |
261 // autocomplete. In particular, don't display labels, as that information is | 261 // autocomplete: Don't display or icons, as that information is redundant. |
dhollowa
2010/12/16 03:57:12
"don't display labels or icons"
dhollowa
2010/12/16 15:58:27
Missed "labels".
| |
262 // redundant. In addition, remove duplicate values. | |
263 if (FormIsAutoFilled(form_structure, form, is_filling_credit_card)) { | 262 if (FormIsAutoFilled(form_structure, form, is_filling_credit_card)) { |
264 RemoveDuplicateElements(&values, &unique_ids); | 263 labels.assign(labels.size(), string16()); |
265 labels.assign(values.size(), string16()); | 264 icons.assign(icons.size(), string16()); |
266 icons.assign(values.size(), string16()); | |
267 } | 265 } |
268 | 266 |
267 RemoveDuplicateSuggestions(&values, &labels, &icons, &unique_ids); | |
269 host->AutoFillSuggestionsReturned(values, labels, icons, unique_ids); | 268 host->AutoFillSuggestionsReturned(values, labels, icons, unique_ids); |
270 return true; | 269 return true; |
271 } | 270 } |
272 | 271 |
273 bool AutoFillManager::FillAutoFillFormData(int query_id, | 272 bool AutoFillManager::FillAutoFillFormData(int query_id, |
274 const FormData& form, | 273 const FormData& form, |
275 const FormField& field, | 274 const FormField& field, |
276 int unique_id) { | 275 int unique_id) { |
277 const std::vector<AutoFillProfile*>& profiles = personal_data_->profiles(); | 276 const std::vector<AutoFillProfile*>& profiles = personal_data_->profiles(); |
278 const std::vector<CreditCard*>& credit_cards = personal_data_->credit_cards(); | 277 const std::vector<CreditCard*>& credit_cards = personal_data_->credit_cards(); |
(...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
810 return std::string(); | 809 return std::string(); |
811 | 810 |
812 std::map<int, std::string>::const_iterator iter = id_guid_map_.find(id); | 811 std::map<int, std::string>::const_iterator iter = id_guid_map_.find(id); |
813 if (iter == id_guid_map_.end()) { | 812 if (iter == id_guid_map_.end()) { |
814 NOTREACHED(); | 813 NOTREACHED(); |
815 return std::string(); | 814 return std::string(); |
816 } | 815 } |
817 | 816 |
818 return iter->second; | 817 return iter->second; |
819 } | 818 } |
OLD | NEW |