autocomplete_classifier.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/autocomplete/autocomplete_classifier.h"
6
7#include "base/auto_reset.h"
8#include "chrome/browser/autocomplete/autocomplete_controller.h"
9#include "chrome/browser/autocomplete/autocomplete_input.h"
10#include "chrome/browser/autocomplete/autocomplete_match.h"
11#include "chrome/browser/autocomplete/autocomplete_provider.h"
12#include "url/gurl.h"
13
14// static
15const int AutocompleteClassifier::kDefaultOmniboxProviders =
16    AutocompleteProvider::TYPE_BOOKMARK |
17    AutocompleteProvider::TYPE_BUILTIN |
18    AutocompleteProvider::TYPE_HISTORY_QUICK |
19    AutocompleteProvider::TYPE_HISTORY_URL |
20    AutocompleteProvider::TYPE_KEYWORD |
21    AutocompleteProvider::TYPE_SEARCH |
22    AutocompleteProvider::TYPE_SHORTCUTS |
23    AutocompleteProvider::TYPE_ZERO_SUGGEST;
24
25// static
26const int AutocompleteClassifier::kInstantExtendedOmniboxProviders =
27    AutocompleteProvider::TYPE_BOOKMARK |
28    AutocompleteProvider::TYPE_BUILTIN |
29    AutocompleteProvider::TYPE_HISTORY_QUICK |
30    AutocompleteProvider::TYPE_HISTORY_URL |
31    AutocompleteProvider::TYPE_KEYWORD |
32    // TODO: remove TYPE_SEARCH once it's no longer needed to pass
33    // the Instant suggestion through via FinalizeInstantQuery.
34    AutocompleteProvider::TYPE_SEARCH |
35    AutocompleteProvider::TYPE_SHORTCUTS |
36    AutocompleteProvider::TYPE_ZERO_SUGGEST;
37
38AutocompleteClassifier::AutocompleteClassifier(Profile* profile)
39    : controller_(new AutocompleteController(profile, NULL,
40                                             kDefaultOmniboxProviders)),
41      inside_classify_(false) {
42}
43
44AutocompleteClassifier::~AutocompleteClassifier() {
45  // We should only reach here after Shutdown() has been called.
46  DCHECK(!controller_.get());
47}
48
49void AutocompleteClassifier::Classify(const string16& text,
50                                      bool prefer_keyword,
51                                      bool allow_exact_keyword_match,
52                                      AutocompleteMatch* match,
53                                      GURL* alternate_nav_url) {
54  DCHECK(!inside_classify_);
55  base::AutoReset<bool> reset(&inside_classify_, true);
56  controller_->Start(AutocompleteInput(
57      text, string16::npos, string16(), GURL(), true, prefer_keyword,
58      allow_exact_keyword_match, AutocompleteInput::BEST_MATCH));
59  DCHECK(controller_->done());
60  const AutocompleteResult& result = controller_->result();
61  if (result.empty()) {
62    if (alternate_nav_url)
63      *alternate_nav_url = GURL();
64    return;
65  }
66
67  DCHECK(result.default_match() != result.end());
68  *match = *result.default_match();
69  if (alternate_nav_url)
70    *alternate_nav_url = result.alternate_nav_url();
71}
72
73void AutocompleteClassifier::Shutdown() {
74  controller_.reset();
75}
76