// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "components/omnibox/browser/answers_cache.h" #include "base/i18n/case_conversion.h" #include "base/strings/string_util.h" AnswersQueryData::AnswersQueryData() { } AnswersQueryData::AnswersQueryData(const base::string16& text, const base::string16& type) : full_query_text(text), query_type(type) { } AnswersCache::AnswersCache(size_t max_entries) : max_entries_(max_entries) { } AnswersCache::~AnswersCache() { } AnswersQueryData AnswersCache::GetTopAnswerEntry(const base::string16& query) { base::string16 collapsed_query = base::i18n::ToLower( base::CollapseWhitespace(query, false)); for (Cache::iterator it = cache_.begin(); it != cache_.end(); ++it) { // If the query text starts with trimmed input, this is valid prefetch data. if (base::StartsWith(base::i18n::ToLower(it->full_query_text), collapsed_query, base::CompareCase::SENSITIVE)) { // Move the touched item to the front of the list. cache_.splice(cache_.begin(), cache_, it); return cache_.front(); } } return AnswersQueryData(); } void AnswersCache::UpdateRecentAnswers(const base::string16& full_query_text, const base::string16& query_type) { // If this entry is already part of the cache, just update recency. for (Cache::iterator it = cache_.begin(); it != cache_.end(); ++it) { if (full_query_text == it->full_query_text && query_type == it->query_type) { cache_.splice(cache_.begin(), cache_, it); return; } } // Evict if cache size is exceeded. if (cache_.size() >= max_entries_) cache_.pop_back(); cache_.push_front(AnswersQueryData(full_query_text, query_type)); }