OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "athena/main/url_search_provider.h" | 5 #include "athena/main/url_search_provider.h" |
6 | 6 |
7 #include "athena/activity/public/activity_factory.h" | 7 #include "athena/activity/public/activity_factory.h" |
8 #include "athena/activity/public/activity_manager.h" | 8 #include "athena/activity/public/activity_manager.h" |
| 9 #include "athena/content/public/scheme_classifier_factory.h" |
9 #include "base/strings/utf_string_conversions.h" | 10 #include "base/strings/utf_string_conversions.h" |
10 #include "base/values.h" | 11 #include "base/values.h" |
11 #include "components/metrics/proto/omnibox_event.pb.h" | 12 #include "components/metrics/proto/omnibox_event.pb.h" |
12 #include "components/metrics/proto/omnibox_input_type.pb.h" | 13 #include "components/metrics/proto/omnibox_input_type.pb.h" |
13 #include "components/omnibox/autocomplete_input.h" | 14 #include "components/omnibox/autocomplete_input.h" |
14 #include "components/omnibox/autocomplete_provider_client.h" | 15 #include "components/omnibox/autocomplete_provider_client.h" |
15 #include "components/omnibox/autocomplete_scheme_classifier.h" | |
16 #include "components/omnibox/search_provider.h" | 16 #include "components/omnibox/search_provider.h" |
17 #include "components/search_engines/search_terms_data.h" | 17 #include "components/search_engines/search_terms_data.h" |
18 #include "components/search_engines/template_url_service.h" | 18 #include "components/search_engines/template_url_service.h" |
19 #include "components/search_engines/template_url_service_client.h" | 19 #include "components/search_engines/template_url_service_client.h" |
20 #include "content/public/browser/browser_context.h" | 20 #include "content/public/browser/browser_context.h" |
21 #include "ui/app_list/search_result.h" | 21 #include "ui/app_list/search_result.h" |
22 #include "ui/base/resource/resource_bundle.h" | 22 #include "ui/base/resource/resource_bundle.h" |
23 #include "url/gurl.h" | 23 #include "url/gurl.h" |
24 | 24 |
25 namespace athena { | 25 namespace athena { |
26 | 26 |
27 namespace { | 27 namespace { |
28 | 28 |
29 // This constant was copied from HistoryURLProvider. | 29 // This constant was copied from HistoryURLProvider. |
30 // TODO(hashimoto): Componentize HistoryURLProvider and delete this. | 30 // TODO(hashimoto): Componentize HistoryURLProvider and delete this. |
31 const int kScoreForWhatYouTypedResult = 1203; | 31 const int kScoreForWhatYouTypedResult = 1203; |
32 | 32 |
33 // The SearchTermsData implementation for Athena. | 33 // The SearchTermsData implementation for Athena. |
34 class AthenaSearchTermsData : public SearchTermsData { | 34 class AthenaSearchTermsData : public SearchTermsData { |
35 public: | 35 public: |
36 // SearchTermsData: | 36 // SearchTermsData: |
37 virtual std::string GetSuggestClient() const OVERRIDE { | 37 virtual std::string GetSuggestClient() const OVERRIDE { |
38 return "chrome"; | 38 return "chrome"; |
39 } | 39 } |
40 }; | 40 }; |
41 | 41 |
42 // The AutocompleteSchemeClassifier implementation for Athena. | |
43 // TODO(mukai): Introduce supports of normal schemes like about: or blob: | |
44 class AthenaSchemeClassifier : public AutocompleteSchemeClassifier { | |
45 public: | |
46 AthenaSchemeClassifier() {} | |
47 | |
48 // AutocompleteSchemeClassifier: | |
49 virtual metrics::OmniboxInputType::Type GetInputTypeForScheme( | |
50 const std::string& scheme) const OVERRIDE { | |
51 if (net::URLRequest::IsHandledProtocol(scheme)) | |
52 return metrics::OmniboxInputType::URL; | |
53 return metrics::OmniboxInputType::INVALID; | |
54 } | |
55 }; | |
56 | |
57 // The templateURLServiceClient for Athena. Mainly for the interaction with | 42 // The templateURLServiceClient for Athena. Mainly for the interaction with |
58 // history module (see chrome/browser/search_engines for Chrome implementation). | 43 // history module (see chrome/browser/search_engines for Chrome implementation). |
59 // TODO(mukai): Implement the contents of this class when it's necessary. | 44 // TODO(mukai): Implement the contents of this class when it's necessary. |
60 class AthenaTemplateURLServiceClient : public TemplateURLServiceClient { | 45 class AthenaTemplateURLServiceClient : public TemplateURLServiceClient { |
61 public: | 46 public: |
62 AthenaTemplateURLServiceClient() {} | 47 AthenaTemplateURLServiceClient() {} |
63 virtual ~AthenaTemplateURLServiceClient() {} | 48 virtual ~AthenaTemplateURLServiceClient() {} |
64 | 49 |
65 private: | 50 private: |
66 // TemplateURLServiceClient: | 51 // TemplateURLServiceClient: |
67 virtual void SetOwner(TemplateURLService* owner) OVERRIDE {} | 52 virtual void SetOwner(TemplateURLService* owner) OVERRIDE {} |
68 virtual void DeleteAllSearchTermsForKeyword(TemplateURLID id) OVERRIDE {} | 53 virtual void DeleteAllSearchTermsForKeyword(TemplateURLID id) OVERRIDE {} |
69 virtual void SetKeywordSearchTermsForURL( | 54 virtual void SetKeywordSearchTermsForURL( |
70 const GURL& url, | 55 const GURL& url, |
71 TemplateURLID id, | 56 TemplateURLID id, |
72 const base::string16& term) OVERRIDE {} | 57 const base::string16& term) OVERRIDE {} |
73 virtual void AddKeywordGeneratedVisit(const GURL& url) OVERRIDE {} | 58 virtual void AddKeywordGeneratedVisit(const GURL& url) OVERRIDE {} |
74 virtual void RestoreExtensionInfoIfNecessary( | 59 virtual void RestoreExtensionInfoIfNecessary( |
75 TemplateURL* template_url) OVERRIDE {} | 60 TemplateURL* template_url) OVERRIDE {} |
76 | 61 |
77 DISALLOW_COPY_AND_ASSIGN(AthenaTemplateURLServiceClient); | 62 DISALLOW_COPY_AND_ASSIGN(AthenaTemplateURLServiceClient); |
78 }; | 63 }; |
79 | 64 |
80 // The AutocompleteProviderClient for Athena. | 65 // The AutocompleteProviderClient for Athena. |
81 class AthenaAutocompleteProviderClient : public AutocompleteProviderClient { | 66 class AthenaAutocompleteProviderClient : public AutocompleteProviderClient { |
82 public: | 67 public: |
83 explicit AthenaAutocompleteProviderClient( | 68 explicit AthenaAutocompleteProviderClient( |
84 content::BrowserContext* browser_context) | 69 content::BrowserContext* browser_context) |
85 : browser_context_(browser_context) {} | 70 : browser_context_(browser_context), |
| 71 scheme_classifier_(CreateSchemeClassifier(browser_context)) {} |
86 virtual ~AthenaAutocompleteProviderClient() {} | 72 virtual ~AthenaAutocompleteProviderClient() {} |
87 | 73 |
88 virtual net::URLRequestContextGetter* RequestContext() OVERRIDE { | 74 virtual net::URLRequestContextGetter* RequestContext() OVERRIDE { |
89 return browser_context_->GetRequestContext(); | 75 return browser_context_->GetRequestContext(); |
90 } | 76 } |
91 virtual bool IsOffTheRecord() OVERRIDE { | 77 virtual bool IsOffTheRecord() OVERRIDE { |
92 return browser_context_->IsOffTheRecord(); | 78 return browser_context_->IsOffTheRecord(); |
93 } | 79 } |
94 virtual std::string AcceptLanguages() OVERRIDE { | 80 virtual std::string AcceptLanguages() OVERRIDE { |
95 // TODO(hashimoto): Return the value stored in the prefs. | 81 // TODO(hashimoto): Return the value stored in the prefs. |
96 return "en-US"; | 82 return "en-US"; |
97 } | 83 } |
98 virtual bool SearchSuggestEnabled() OVERRIDE { return true; } | 84 virtual bool SearchSuggestEnabled() OVERRIDE { return true; } |
99 virtual bool ShowBookmarkBar() OVERRIDE { return false; } | 85 virtual bool ShowBookmarkBar() OVERRIDE { return false; } |
100 virtual const AutocompleteSchemeClassifier& SchemeClassifier() OVERRIDE { | 86 virtual const AutocompleteSchemeClassifier& SchemeClassifier() OVERRIDE { |
101 return scheme_classifier_; | 87 return *scheme_classifier_; |
102 } | 88 } |
103 virtual void Classify( | 89 virtual void Classify( |
104 const base::string16& text, | 90 const base::string16& text, |
105 bool prefer_keyword, | 91 bool prefer_keyword, |
106 bool allow_exact_keyword_match, | 92 bool allow_exact_keyword_match, |
107 metrics::OmniboxEventProto::PageClassification page_classification, | 93 metrics::OmniboxEventProto::PageClassification page_classification, |
108 AutocompleteMatch* match, | 94 AutocompleteMatch* match, |
109 GURL* alternate_nav_url) OVERRIDE {} | 95 GURL* alternate_nav_url) OVERRIDE {} |
110 virtual history::URLDatabase* InMemoryDatabase() OVERRIDE { return NULL; } | 96 virtual history::URLDatabase* InMemoryDatabase() OVERRIDE { return NULL; } |
111 virtual void DeleteMatchingURLsForKeywordFromHistory( | 97 virtual void DeleteMatchingURLsForKeywordFromHistory( |
112 history::KeywordID keyword_id, | 98 history::KeywordID keyword_id, |
113 const base::string16& term) OVERRIDE {} | 99 const base::string16& term) OVERRIDE {} |
114 virtual bool TabSyncEnabledAndUnencrypted() OVERRIDE { return false; } | 100 virtual bool TabSyncEnabledAndUnencrypted() OVERRIDE { return false; } |
115 virtual void PrefetchImage(const GURL& url) OVERRIDE {} | 101 virtual void PrefetchImage(const GURL& url) OVERRIDE {} |
116 | 102 |
117 private: | 103 private: |
118 content::BrowserContext* browser_context_; | 104 content::BrowserContext* browser_context_; |
119 AthenaSchemeClassifier scheme_classifier_; | 105 scoped_ptr<AutocompleteSchemeClassifier> scheme_classifier_; |
120 | 106 |
121 DISALLOW_COPY_AND_ASSIGN(AthenaAutocompleteProviderClient); | 107 DISALLOW_COPY_AND_ASSIGN(AthenaAutocompleteProviderClient); |
122 }; | 108 }; |
123 | 109 |
124 int ACMatchStyleToTagStyle(int styles) { | 110 int ACMatchStyleToTagStyle(int styles) { |
125 int tag_styles = 0; | 111 int tag_styles = 0; |
126 if (styles & ACMatchClassification::URL) | 112 if (styles & ACMatchClassification::URL) |
127 tag_styles |= app_list::SearchResult::Tag::URL; | 113 tag_styles |= app_list::SearchResult::Tag::URL; |
128 if (styles & ACMatchClassification::MATCH) | 114 if (styles & ACMatchClassification::MATCH) |
129 tag_styles |= app_list::SearchResult::Tag::MATCH; | 115 tag_styles |= app_list::SearchResult::Tag::MATCH; |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
239 scoped_ptr<AutocompleteProviderClient>( | 225 scoped_ptr<AutocompleteProviderClient>( |
240 new AthenaAutocompleteProviderClient(browser_context_)))) { | 226 new AthenaAutocompleteProviderClient(browser_context_)))) { |
241 template_url_service_->Load(); | 227 template_url_service_->Load(); |
242 } | 228 } |
243 | 229 |
244 UrlSearchProvider::~UrlSearchProvider() { | 230 UrlSearchProvider::~UrlSearchProvider() { |
245 } | 231 } |
246 | 232 |
247 void UrlSearchProvider::Start(const base::string16& query) { | 233 void UrlSearchProvider::Start(const base::string16& query) { |
248 const bool minimal_changes = query == input_.text(); | 234 const bool minimal_changes = query == input_.text(); |
| 235 scoped_ptr<AutocompleteSchemeClassifier> scheme_classifier( |
| 236 CreateSchemeClassifier(browser_context_)); |
249 input_ = AutocompleteInput(query, | 237 input_ = AutocompleteInput(query, |
250 base::string16::npos /* cursor_position */, | 238 base::string16::npos /* cursor_position */, |
251 base::string16() /* desired_tld */, | 239 base::string16() /* desired_tld */, |
252 GURL() /* current_url */, | 240 GURL() /* current_url */, |
253 metrics::OmniboxEventProto::INVALID_SPEC, | 241 metrics::OmniboxEventProto::INVALID_SPEC, |
254 false /* prevent_inline_autocomplete */, | 242 false /* prevent_inline_autocomplete */, |
255 false /* prefer_keyword */, | 243 false /* prefer_keyword */, |
256 true /* allow_extract_keyword_match */, | 244 true /* allow_extract_keyword_match */, |
257 true /* want_asynchronous_matches */, | 245 true /* want_asynchronous_matches */, |
258 AthenaSchemeClassifier()); | 246 *scheme_classifier); |
259 | 247 |
260 provider_->Start(input_, minimal_changes); | 248 // Clearing results here may cause unexpected results. |
261 } | 249 // TODO(mukai): fix this by fixing crbug.com/415500 |
262 | 250 if (!minimal_changes) |
263 void UrlSearchProvider::Stop() { | 251 ClearResults(); |
264 provider_->Stop(false); | |
265 } | |
266 | |
267 void UrlSearchProvider::OnProviderUpdate(bool updated_matches) { | |
268 if (!updated_matches) | |
269 return; | |
270 | |
271 ClearResults(); | |
272 | 252 |
273 if (input_.type() == metrics::OmniboxInputType::URL) { | 253 if (input_.type() == metrics::OmniboxInputType::URL) { |
274 // TODO(hashimoto): Componentize HistoryURLProvider and remove this code. | 254 // TODO(hashimoto): Componentize HistoryURLProvider and remove this code. |
275 AutocompleteMatch what_you_typed_match( | 255 AutocompleteMatch what_you_typed_match( |
276 NULL, 0, false, AutocompleteMatchType::URL_WHAT_YOU_TYPED); | 256 NULL, 0, false, AutocompleteMatchType::URL_WHAT_YOU_TYPED); |
277 what_you_typed_match.destination_url = input_.canonicalized_url(); | 257 what_you_typed_match.destination_url = input_.canonicalized_url(); |
278 what_you_typed_match.contents = input_.text(); | 258 what_you_typed_match.contents = input_.text(); |
279 what_you_typed_match.relevance = kScoreForWhatYouTypedResult; | 259 what_you_typed_match.relevance = kScoreForWhatYouTypedResult; |
280 Add(scoped_ptr<app_list::SearchResult>(new UrlSearchResult( | 260 Add(scoped_ptr<app_list::SearchResult>(new UrlSearchResult( |
281 browser_context_, what_you_typed_match))); | 261 browser_context_, what_you_typed_match))); |
282 } | 262 } |
283 | 263 |
| 264 provider_->Start(input_, minimal_changes); |
| 265 } |
| 266 |
| 267 void UrlSearchProvider::Stop() { |
| 268 provider_->Stop(false); |
| 269 } |
| 270 |
| 271 void UrlSearchProvider::OnProviderUpdate(bool updated_matches) { |
| 272 if (!updated_matches) |
| 273 return; |
| 274 |
284 const ACMatches& matches = provider_->matches(); | 275 const ACMatches& matches = provider_->matches(); |
285 for (ACMatches::const_iterator it = matches.begin(); it != matches.end(); | 276 for (ACMatches::const_iterator it = matches.begin(); it != matches.end(); |
286 ++it) { | 277 ++it) { |
287 if (!it->destination_url.is_valid()) | 278 if (!it->destination_url.is_valid()) |
288 continue; | 279 continue; |
289 | 280 |
290 Add(scoped_ptr<app_list::SearchResult>(new UrlSearchResult( | 281 Add(scoped_ptr<app_list::SearchResult>(new UrlSearchResult( |
291 browser_context_, *it))); | 282 browser_context_, *it))); |
292 } | 283 } |
293 } | 284 } |
294 | 285 |
295 } // namespace athena | 286 } // namespace athena |
OLD | NEW |