1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file.
4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "athena/main/url_search_provider.h"
6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "athena/activity/public/activity.h"
8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "athena/activity/public/activity_factory.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "athena/content/public/scheme_classifier_factory.h"
10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/values.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/metrics/proto/omnibox_event.pb.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/metrics/proto/omnibox_input_type.pb.h"
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/omnibox/autocomplete_input.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/omnibox/autocomplete_provider_client.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/omnibox/search_provider.h"
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/search_terms_data.h"
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url_service.h"
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url_service_client.h"
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/public/browser/browser_context.h"
21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/app_list/search_result.h"
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/base/resource/resource_bundle.h"
23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "url/gurl.h"
24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace athena {
26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace {
28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// This constant was copied from HistoryURLProvider.
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// TODO(hashimoto): Componentize HistoryURLProvider and delete this.
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst int kScoreForWhatYouTypedResult = 1203;
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// The SearchTermsData implementation for Athena.
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class AthenaSearchTermsData : public SearchTermsData {
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public:
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // SearchTermsData:
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual std::string GetSuggestClient() const OVERRIDE {
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return "chrome";
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// The templateURLServiceClient for Athena. Mainly for the interaction with
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// history module (see chrome/browser/search_engines for Chrome implementation).
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// TODO(mukai): Implement the contents of this class when it's necessary.
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass AthenaTemplateURLServiceClient : public TemplateURLServiceClient {
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AthenaTemplateURLServiceClient() {}
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~AthenaTemplateURLServiceClient() {}
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // TemplateURLServiceClient:
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void SetOwner(TemplateURLService* owner) OVERRIDE {}
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void DeleteAllSearchTermsForKeyword(TemplateURLID id) OVERRIDE {}
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void SetKeywordSearchTermsForURL(
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const GURL& url,
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      TemplateURLID id,
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const base::string16& term) OVERRIDE {}
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void AddKeywordGeneratedVisit(const GURL& url) OVERRIDE {}
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void RestoreExtensionInfoIfNecessary(
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      TemplateURL* template_url) OVERRIDE {}
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(AthenaTemplateURLServiceClient);
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// The AutocompleteProviderClient for Athena.
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass AthenaAutocompleteProviderClient : public AutocompleteProviderClient {
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  explicit AthenaAutocompleteProviderClient(
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::BrowserContext* browser_context)
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : browser_context_(browser_context),
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        scheme_classifier_(CreateSchemeClassifier(browser_context)) {}
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~AthenaAutocompleteProviderClient() {}
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual net::URLRequestContextGetter* RequestContext() OVERRIDE {
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return browser_context_->GetRequestContext();
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual bool IsOffTheRecord() OVERRIDE {
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return browser_context_->IsOffTheRecord();
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual std::string AcceptLanguages() OVERRIDE {
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // TODO(hashimoto): Return the value stored in the prefs.
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return "en-US";
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual bool SearchSuggestEnabled() OVERRIDE { return true; }
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual bool ShowBookmarkBar() OVERRIDE { return false; }
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual const AutocompleteSchemeClassifier& SchemeClassifier() OVERRIDE {
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return *scheme_classifier_;
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void Classify(
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const base::string16& text,
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      bool prefer_keyword,
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      bool allow_exact_keyword_match,
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      metrics::OmniboxEventProto::PageClassification page_classification,
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      AutocompleteMatch* match,
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      GURL* alternate_nav_url) OVERRIDE {}
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual history::URLDatabase* InMemoryDatabase() OVERRIDE { return NULL; }
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void DeleteMatchingURLsForKeywordFromHistory(
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      history::KeywordID keyword_id,
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const base::string16& term) OVERRIDE {}
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual bool TabSyncEnabledAndUnencrypted() OVERRIDE { return false; }
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void PrefetchImage(const GURL& url) OVERRIDE {}
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  content::BrowserContext* browser_context_;
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<AutocompleteSchemeClassifier> scheme_classifier_;
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(AthenaAutocompleteProviderClient);
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint ACMatchStyleToTagStyle(int styles) {
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int tag_styles = 0;
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (styles & ACMatchClassification::URL)
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    tag_styles |= app_list::SearchResult::Tag::URL;
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (styles & ACMatchClassification::MATCH)
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    tag_styles |= app_list::SearchResult::Tag::MATCH;
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (styles & ACMatchClassification::DIM)
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    tag_styles |= app_list::SearchResult::Tag::DIM;
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return tag_styles;
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Translates ACMatchClassifications into SearchResult tags.
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ACMatchClassificationsToTags(
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const base::string16& text,
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const ACMatchClassifications& text_classes,
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    app_list::SearchResult::Tags* tags) {
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int tag_styles = app_list::SearchResult::Tag::NONE;
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  size_t tag_start = 0;
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (size_t i = 0; i < text_classes.size(); ++i) {
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const ACMatchClassification& text_class = text_classes[i];
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Closes current tag.
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (tag_styles != app_list::SearchResult::Tag::NONE) {
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      tags->push_back(app_list::SearchResult::Tag(
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          tag_styles, tag_start, text_class.offset));
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      tag_styles = app_list::SearchResult::Tag::NONE;
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (text_class.style == ACMatchClassification::NONE)
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      continue;
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    tag_start = text_class.offset;
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    tag_styles = ACMatchStyleToTagStyle(text_class.style);
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (tag_styles != app_list::SearchResult::Tag::NONE) {
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    tags->push_back(app_list::SearchResult::Tag(
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        tag_styles, tag_start, text.length()));
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
153f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class UrlSearchResult : public app_list::SearchResult {
154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public:
155f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UrlSearchResult(content::BrowserContext* browser_context,
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                  const AutocompleteMatch& match)
157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      : browser_context_(browser_context),
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        match_(match) {
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    set_id(match_.destination_url.spec());
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Derive relevance from omnibox relevance and normalize it to [0, 1].
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // The magic number 1500 is the highest score of an omnibox result.
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // See comments in autocomplete_provider.h.
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    set_relevance(match_.relevance / 1500.0);
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    UpdateIcon();
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    UpdateTitleAndDetails();
168f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
169f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~UrlSearchResult() {}
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
172f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private:
173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Overriddenn from app_list::SearchResult:
174f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void Open(int event_flags) OVERRIDE {
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    Activity* activity = ActivityFactory::Get()->CreateWebActivity(
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        browser_context_, base::string16(), match_.destination_url);
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    Activity::Show(activity);
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void UpdateIcon() {
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    SetIcon(*ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        AutocompleteMatch::TypeToIcon(match_.type)));
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void UpdateTitleAndDetails() {
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    set_title(match_.contents);
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    SearchResult::Tags title_tags;
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ACMatchClassificationsToTags(match_.contents,
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 match_.contents_class,
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 &title_tags);
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    set_title_tags(title_tags);
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    set_details(match_.description);
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    SearchResult::Tags details_tags;
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ACMatchClassificationsToTags(match_.description,
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 match_.description_class,
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 &details_tags);
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    set_details_tags(details_tags);
199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
200f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
201f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  content::BrowserContext* browser_context_;
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AutocompleteMatch match_;
203f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(UrlSearchResult);
205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)};
206f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
207f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}  // namespace
208f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
209f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)UrlSearchProvider::UrlSearchProvider(content::BrowserContext* browser_context)
210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : browser_context_(browser_context),
211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      // TODO(mukai): introduce the real parameters when it's necessary.
212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      template_url_service_(
213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          new TemplateURLService(NULL /* prefs */,
2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                 scoped_ptr<SearchTermsData>(
2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     new AthenaSearchTermsData()),
216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                 NULL /* KeywordWebDataService */,
217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                 scoped_ptr<TemplateURLServiceClient>(
218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     new AthenaTemplateURLServiceClient()),
219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                 NULL /*GoogleURLTracker */,
220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                 NULL /* RapporService */,
2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                 base::Closure() /* dsp_change_callback */)),
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      provider_(new ::SearchProvider(
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          this,
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          template_url_service_.get(),
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          scoped_ptr<AutocompleteProviderClient>(
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              new AthenaAutocompleteProviderClient(browser_context_)))) {
227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  template_url_service_->Load();
228f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
229f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
230f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)UrlSearchProvider::~UrlSearchProvider() {
231f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
232f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
233f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void UrlSearchProvider::Start(const base::string16& query) {
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const bool minimal_changes = query == input_.text();
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<AutocompleteSchemeClassifier> scheme_classifier(
2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CreateSchemeClassifier(browser_context_));
2375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  input_ = AutocompleteInput(query,
2385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                             base::string16::npos /* cursor_position */,
2395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                             base::string16() /* desired_tld */,
2405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                             GURL() /* current_url */,
2415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                             metrics::OmniboxEventProto::INVALID_SPEC,
2425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                             false /* prevent_inline_autocomplete */,
2435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                             false /* prefer_keyword */,
2445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                             true /* allow_extract_keyword_match */,
2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                             true /* want_asynchronous_matches */,
2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             *scheme_classifier);
247f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Clearing results here may cause unexpected results.
2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(mukai): fix this by fixing crbug.com/415500
2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!minimal_changes)
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ClearResults();
2525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (input_.type() == metrics::OmniboxInputType::URL) {
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // TODO(hashimoto): Componentize HistoryURLProvider and remove this code.
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    AutocompleteMatch what_you_typed_match(
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        NULL, 0, false, AutocompleteMatchType::URL_WHAT_YOU_TYPED);
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    what_you_typed_match.destination_url = input_.canonicalized_url();
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    what_you_typed_match.contents = input_.text();
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    what_you_typed_match.relevance = kScoreForWhatYouTypedResult;
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    Add(scoped_ptr<app_list::SearchResult>(new UrlSearchResult(
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        browser_context_, what_you_typed_match)));
2625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  provider_->Start(input_, minimal_changes);
2655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid UrlSearchProvider::Stop() {
2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  provider_->Stop(false);
2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid UrlSearchProvider::OnProviderUpdate(bool updated_matches) {
2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!updated_matches)
2735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return;
2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const ACMatches& matches = provider_->matches();
2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (ACMatches::const_iterator it = matches.begin(); it != matches.end();
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       ++it) {
2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!it->destination_url.is_valid())
2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      continue;
2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    Add(scoped_ptr<app_list::SearchResult>(new UrlSearchResult(
2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        browser_context_, *it)));
2835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
284f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
285f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
286f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}  // namespace athena
287