[email protected] | ebbac63e | 2014-08-22 01:43:06 | [diff] [blame] | 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 |
| 3 | // found in the LICENSE file. |
| 4 | |
blundell | 2102f7c | 2015-07-09 10:00:53 | [diff] [blame] | 5 | #include "components/omnibox/browser/answers_cache.h" |
[email protected] | ebbac63e | 2014-08-22 01:43:06 | [diff] [blame] | 6 | |
brettw | 94a2cc2 | 2015-07-01 19:26:54 | [diff] [blame] | 7 | #include "base/i18n/case_conversion.h" |
[email protected] | ebbac63e | 2014-08-22 01:43:06 | [diff] [blame] | 8 | #include "base/strings/string_util.h" |
| 9 | |
| 10 | AnswersQueryData::AnswersQueryData() { |
| 11 | } |
| 12 | AnswersQueryData::AnswersQueryData(const base::string16& text, |
| 13 | const base::string16& type) |
| 14 | : full_query_text(text), query_type(type) { |
| 15 | } |
| 16 | |
| 17 | AnswersCache::AnswersCache(size_t max_entries) : max_entries_(max_entries) { |
| 18 | } |
| 19 | |
| 20 | AnswersCache::~AnswersCache() { |
| 21 | } |
| 22 | |
| 23 | AnswersQueryData AnswersCache::GetTopAnswerEntry(const base::string16& query) { |
brettw | 94a2cc2 | 2015-07-01 19:26:54 | [diff] [blame] | 24 | base::string16 collapsed_query = base::i18n::ToLower( |
| 25 | base::CollapseWhitespace(query, false)); |
jdoerrie | 2e6a651d | 2018-10-04 17:09:08 | [diff] [blame^] | 26 | for (auto it = cache_.begin(); it != cache_.end(); ++it) { |
[email protected] | ebbac63e | 2014-08-22 01:43:06 | [diff] [blame] | 27 | // If the query text starts with trimmed input, this is valid prefetch data. |
brettw | 94a2cc2 | 2015-07-01 19:26:54 | [diff] [blame] | 28 | if (base::StartsWith(base::i18n::ToLower(it->full_query_text), |
| 29 | collapsed_query, base::CompareCase::SENSITIVE)) { |
[email protected] | ebbac63e | 2014-08-22 01:43:06 | [diff] [blame] | 30 | // Move the touched item to the front of the list. |
| 31 | cache_.splice(cache_.begin(), cache_, it); |
| 32 | return cache_.front(); |
| 33 | } |
| 34 | } |
| 35 | return AnswersQueryData(); |
| 36 | } |
| 37 | |
| 38 | void AnswersCache::UpdateRecentAnswers(const base::string16& full_query_text, |
| 39 | const base::string16& query_type) { |
| 40 | // If this entry is already part of the cache, just update recency. |
jdoerrie | 2e6a651d | 2018-10-04 17:09:08 | [diff] [blame^] | 41 | for (auto it = cache_.begin(); it != cache_.end(); ++it) { |
[email protected] | ebbac63e | 2014-08-22 01:43:06 | [diff] [blame] | 42 | if (full_query_text == it->full_query_text && |
| 43 | query_type == it->query_type) { |
| 44 | cache_.splice(cache_.begin(), cache_, it); |
| 45 | return; |
| 46 | } |
| 47 | } |
| 48 | |
| 49 | // Evict if cache size is exceeded. |
| 50 | if (cache_.size() >= max_entries_) |
| 51 | cache_.pop_back(); |
| 52 | |
| 53 | cache_.push_front(AnswersQueryData(full_query_text, query_type)); |
| 54 | } |