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