1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autocomplete_history_manager.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector> 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string16.h" 103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_number_conversions.h" 113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autofill/credit_card.h" 133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/prefs/pref_service.h" 1421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h" 1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/common/autofill_messages.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/pref_names.h" 17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host.h" 18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h" 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "webkit/glue/form_data.h" 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing webkit_glue::FormData; 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace { 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Limit on the number of suggestions to appear in the pop-up menu under an 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// text input element in a form. 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kMaxAutocompleteMenuItems = 6; 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The separator characters for SSNs. 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst string16 kSSNSeparators = ASCIIToUTF16(" -"); 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool IsSSN(const string16& text) { 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 number_string; 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RemoveChars(text, kSSNSeparators.c_str(), &number_string); 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // A SSN is of the form AAA-GG-SSSS (A = area number, G = group number, S = 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // serial number). The validation we do here is simply checking if the area, 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // group, and serial numbers are valid. It is possible to check if the group 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // number is valid for the given area, but that data changes all the time. 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // See: http://www.socialsecurity.gov/history/ssn/geocard.html 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // http://www.socialsecurity.gov/employer/stateweb.htm 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // http://www.socialsecurity.gov/employer/ssnvhighgroup.htm 44513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch if (number_string.length() != 9 || !IsStringASCII(number_string)) 45513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return false; 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int area; 48513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch if (!base::StringToInt(number_string.begin(), 49513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch number_string.begin() + 3, 50513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch &area)) 513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return false; 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (area < 1 || 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch area == 666 || 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch (area > 733 && area < 750) || 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch area > 772) 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int group; 59513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch if (!base::StringToInt(number_string.begin() + 3, 60513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch number_string.begin() + 5, 61513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch &group) || group == 0) 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int serial; 65513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch if (!base::StringToInt(number_string.begin() + 5, 66513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch number_string.begin() + 9, 67513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch &serial) || serial == 0) 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochAutocompleteHistoryManager::AutocompleteHistoryManager( 7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TabContents* tab_contents) 77dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen : TabContentsObserver(tab_contents), 7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen pending_query_handle_(0), 7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen query_id_(0) { 80dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen profile_ = tab_contents->profile(); 8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // May be NULL in unit tests. 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch web_data_service_ = profile_->GetWebDataService(Profile::EXPLICIT_ACCESS); 83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen autofill_enabled_.Init(prefs::kAutofillEnabled, profile_->GetPrefs(), NULL); 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochAutocompleteHistoryManager::~AutocompleteHistoryManager() { 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CancelPendingQuery(); 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool AutocompleteHistoryManager::OnMessageReceived( 9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const IPC::Message& message) { 9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool handled = true; 9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen IPC_BEGIN_MESSAGE_MAP(AutocompleteHistoryManager, message) 94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IPC_MESSAGE_HANDLER(AutofillHostMsg_RemoveAutocompleteEntry, 9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen OnRemoveAutocompleteEntry) 9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen IPC_MESSAGE_UNHANDLED(handled = false) 9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen IPC_END_MESSAGE_MAP() 9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return handled; 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid AutocompleteHistoryManager::OnFormSubmitted(const FormData& form) { 10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!*autofill_enabled_) 1034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch return; 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (profile_->IsOffTheRecord()) 10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return; 10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Don't save data that was submitted through JavaScript. 10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!form.user_submitted) 11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return; 11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // We put the following restriction on stored FormFields: 11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // - non-empty name 11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // - non-empty value 11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // - text field 11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // - value is not a credit card number 11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // - value is not a SSN 11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::vector<webkit_glue::FormField> values; 11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen for (std::vector<webkit_glue::FormField>::const_iterator iter = 12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen form.fields.begin(); 12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen iter != form.fields.end(); ++iter) { 122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!iter->value.empty() && 123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen !iter->name.empty() && 124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen iter->form_control_type == ASCIIToUTF16("text") && 125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen !CreditCard::IsValidCreditCardNumber(iter->value) && 126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen !IsSSN(iter->value)) { 12772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen values.push_back(*iter); 128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 12972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!values.empty() && web_data_service_.get()) 13272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen web_data_service_->AddFormFields(values); 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid AutocompleteHistoryManager::OnRemoveAutocompleteEntry( 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const string16& name, const string16& value) { 13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (web_data_service_.get()) 13872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen web_data_service_->RemoveFormValueForElementName(name, value); 13972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 14072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 14172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid AutocompleteHistoryManager::OnGetAutocompleteSuggestions( 14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int query_id, 14372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const string16& name, 14472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const string16& prefix, 14572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const std::vector<string16>& autofill_values, 14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const std::vector<string16>& autofill_labels, 14772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const std::vector<string16>& autofill_icons, 14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const std::vector<int>& autofill_unique_ids) { 14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen CancelPendingQuery(); 15072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen query_id_ = query_id; 15272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen autofill_values_ = autofill_values; 15372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen autofill_labels_ = autofill_labels; 15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen autofill_icons_ = autofill_icons; 15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen autofill_unique_ids_ = autofill_unique_ids; 15672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!*autofill_enabled_) { 15772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SendSuggestions(NULL); 15872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return; 15972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 16072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 16172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (web_data_service_.get()) { 16272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen pending_query_handle_ = web_data_service_->GetFormValuesForElementName( 16372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen name, prefix, kMaxAutocompleteMenuItems, this); 16472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AutocompleteHistoryManager::OnWebDataServiceRequestDone( 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebDataService::Handle h, 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const WDTypedResult* result) { 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(pending_query_handle_); 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pending_query_handle_ = 0; 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 17372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!*autofill_enabled_) { 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SendSuggestions(NULL); 17572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return; 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 17772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 17872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK(result); 17972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Returning early here if |result| is NULL. We've seen this happen on 18072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Linux due to NFS dismounting and causing sql failures. 18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // See http://crbug.com/68783. 18272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!result) { 18372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SendSuggestions(NULL); 18472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return; 18572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 18672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 187dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK_EQ(AUTOFILL_VALUE_RESULT, result->GetType()); 18872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const WDResult<std::vector<string16> >* autofill_result = 18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static_cast<const WDResult<std::vector<string16> >*>(result); 19072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::vector<string16> suggestions = autofill_result->GetValue(); 19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SendSuggestions(&suggestions); 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochAutocompleteHistoryManager::AutocompleteHistoryManager( 195dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen TabContents* tab_contents, 196dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Profile* profile, 197dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen WebDataService* wds) 198dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen : TabContentsObserver(tab_contents), 199dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen profile_(profile), 200dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen web_data_service_(wds), 201dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen pending_query_handle_(0), 202dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen query_id_(0) { 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch autofill_enabled_.Init( 204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen prefs::kAutofillEnabled, profile_->GetPrefs(), NULL); 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AutocompleteHistoryManager::CancelPendingQuery() { 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (pending_query_handle_) { 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SendSuggestions(NULL); 21072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (web_data_service_.get()) 21172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen web_data_service_->CancelRequest(pending_query_handle_); 21272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen pending_query_handle_ = 0; 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 21672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid AutocompleteHistoryManager::SendSuggestions( 21772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const std::vector<string16>* suggestions) { 21872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (suggestions) { 219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Combine Autofill and Autocomplete values into values and labels. 22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen for (size_t i = 0; i < suggestions->size(); ++i) { 22172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool unique = true; 22272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen for (size_t j = 0; j < autofill_values_.size(); ++j) { 22372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Don't add duplicate values. 22472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (autofill_values_[j] == (*suggestions)[i]) { 22572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen unique = false; 22672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen break; 22772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 22872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 22972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 23072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (unique) { 23172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen autofill_values_.push_back((*suggestions)[i]); 23272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen autofill_labels_.push_back(string16()); 23372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen autofill_icons_.push_back(string16()); 23472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen autofill_unique_ids_.push_back(0); // 0 means no profile. 23572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 23672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 239ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Send(new AutofillMsg_SuggestionsReturned(routing_id(), 240dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen query_id_, 241dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen autofill_values_, 242dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen autofill_labels_, 243dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen autofill_icons_, 244dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen autofill_unique_ids_)); 24572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 24672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen query_id_ = 0; 24772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen autofill_values_.clear(); 24872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen autofill_labels_.clear(); 24972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen autofill_icons_.clear(); 25072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen autofill_unique_ids_.clear(); 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 252