| Index: chrome/browser/history/history_types.cc
|
| diff --git a/chrome/browser/history/history_types.cc b/chrome/browser/history/history_types.cc
|
| index 97145ecbad8eaf3056e23c79ea0256f8aa6eb69f..97d860dde08b4da7f954e959d981daefd78c4491 100644
|
| --- a/chrome/browser/history/history_types.cc
|
| +++ b/chrome/browser/history/history_types.cc
|
| @@ -8,6 +8,7 @@
|
|
|
| #include "base/logging.h"
|
| #include "base/stl_util.h"
|
| +#include "chrome/browser/history/page_usage_data.h"
|
|
|
| namespace history {
|
|
|
| @@ -37,6 +38,145 @@
|
| VisitRow::~VisitRow() {
|
| }
|
|
|
| +// QueryResults ----------------------------------------------------------------
|
| +
|
| +QueryResults::QueryResults() : reached_beginning_(false) {
|
| +}
|
| +
|
| +QueryResults::~QueryResults() {}
|
| +
|
| +const size_t* QueryResults::MatchesForURL(const GURL& url,
|
| + size_t* num_matches) const {
|
| + URLToResultIndices::const_iterator found = url_to_results_.find(url);
|
| + if (found == url_to_results_.end()) {
|
| + if (num_matches)
|
| + *num_matches = 0;
|
| + return NULL;
|
| + }
|
| +
|
| + // All entries in the map should have at least one index, otherwise it
|
| + // shouldn't be in the map.
|
| + DCHECK(!found->second->empty());
|
| + if (num_matches)
|
| + *num_matches = found->second->size();
|
| + return &found->second->front();
|
| +}
|
| +
|
| +void QueryResults::Swap(QueryResults* other) {
|
| + std::swap(first_time_searched_, other->first_time_searched_);
|
| + std::swap(reached_beginning_, other->reached_beginning_);
|
| + results_.swap(other->results_);
|
| + url_to_results_.swap(other->url_to_results_);
|
| +}
|
| +
|
| +void QueryResults::AppendURLBySwapping(URLResult* result) {
|
| + URLResult* new_result = new URLResult;
|
| + new_result->SwapResult(result);
|
| +
|
| + results_.push_back(new_result);
|
| + AddURLUsageAtIndex(new_result->url(), results_.size() - 1);
|
| +}
|
| +
|
| +void QueryResults::DeleteURL(const GURL& url) {
|
| + // Delete all instances of this URL. We re-query each time since each
|
| + // mutation will cause the indices to change.
|
| + while (const size_t* match_indices = MatchesForURL(url, NULL))
|
| + DeleteRange(*match_indices, *match_indices);
|
| +}
|
| +
|
| +void QueryResults::DeleteRange(size_t begin, size_t end) {
|
| + DCHECK(begin <= end && begin < size() && end < size());
|
| +
|
| + // First delete the pointers in the given range and store all the URLs that
|
| + // were modified. We will delete references to these later.
|
| + std::set<GURL> urls_modified;
|
| + for (size_t i = begin; i <= end; i++) {
|
| + urls_modified.insert(results_[i]->url());
|
| + }
|
| +
|
| + // Now just delete that range in the vector en masse (the STL ending is
|
| + // exclusive, while ours is inclusive, hence the +1).
|
| + results_.erase(results_.begin() + begin, results_.begin() + end + 1);
|
| +
|
| + // Delete the indicies referencing the deleted entries.
|
| + for (std::set<GURL>::const_iterator url = urls_modified.begin();
|
| + url != urls_modified.end(); ++url) {
|
| + URLToResultIndices::iterator found = url_to_results_.find(*url);
|
| + if (found == url_to_results_.end()) {
|
| + NOTREACHED();
|
| + continue;
|
| + }
|
| +
|
| + // Need a signed loop type since we do -- which may take us to -1.
|
| + for (int match = 0; match < static_cast<int>(found->second->size());
|
| + match++) {
|
| + if (found->second[match] >= begin && found->second[match] <= end) {
|
| + // Remove this referece from the list.
|
| + found->second->erase(found->second->begin() + match);
|
| + match--;
|
| + }
|
| + }
|
| +
|
| + // Clear out an empty lists if we just made one.
|
| + if (found->second->empty())
|
| + url_to_results_.erase(found);
|
| + }
|
| +
|
| + // Shift all other indices over to account for the removed ones.
|
| + AdjustResultMap(end + 1, std::numeric_limits<size_t>::max(),
|
| + -static_cast<ptrdiff_t>(end - begin + 1));
|
| +}
|
| +
|
| +void QueryResults::AddURLUsageAtIndex(const GURL& url, size_t index) {
|
| + URLToResultIndices::iterator found = url_to_results_.find(url);
|
| + if (found != url_to_results_.end()) {
|
| + // The URL is already in the list, so we can just append the new index.
|
| + found->second->push_back(index);
|
| + return;
|
| + }
|
| +
|
| + // Need to add a new entry for this URL.
|
| + base::StackVector<size_t, 4> new_list;
|
| + new_list->push_back(index);
|
| + url_to_results_[url] = new_list;
|
| +}
|
| +
|
| +void QueryResults::AdjustResultMap(size_t begin, size_t end, ptrdiff_t delta) {
|
| + for (URLToResultIndices::iterator i = url_to_results_.begin();
|
| + i != url_to_results_.end(); ++i) {
|
| + for (size_t match = 0; match < i->second->size(); match++) {
|
| + size_t match_index = i->second[match];
|
| + if (match_index >= begin && match_index <= end)
|
| + i->second[match] += delta;
|
| + }
|
| + }
|
| +}
|
| +
|
| +// QueryOptions ----------------------------------------------------------------
|
| +
|
| +QueryOptions::QueryOptions()
|
| + : max_count(0),
|
| + duplicate_policy(QueryOptions::REMOVE_ALL_DUPLICATES) {
|
| +}
|
| +
|
| +void QueryOptions::SetRecentDayRange(int days_ago) {
|
| + end_time = base::Time::Now();
|
| + begin_time = end_time - base::TimeDelta::FromDays(days_ago);
|
| +}
|
| +
|
| +int64 QueryOptions::EffectiveBeginTime() const {
|
| + return begin_time.ToInternalValue();
|
| +}
|
| +
|
| +int64 QueryOptions::EffectiveEndTime() const {
|
| + return end_time.is_null() ?
|
| + std::numeric_limits<int64>::max() : end_time.ToInternalValue();
|
| +}
|
| +
|
| +int QueryOptions::EffectiveMaxCount() const {
|
| + return max_count ? max_count : std::numeric_limits<int>::max();
|
| +}
|
| +
|
| // QueryURLResult -------------------------------------------------------------
|
|
|
| QueryURLResult::QueryURLResult() : success(false) {
|
| @@ -44,6 +184,58 @@
|
|
|
| QueryURLResult::~QueryURLResult() {
|
| }
|
| +
|
| +// MostVisitedURL --------------------------------------------------------------
|
| +
|
| +MostVisitedURL::MostVisitedURL() {}
|
| +
|
| +MostVisitedURL::MostVisitedURL(const GURL& url,
|
| + const base::string16& title)
|
| + : url(url),
|
| + title(title) {
|
| +}
|
| +
|
| +MostVisitedURL::MostVisitedURL(const GURL& url,
|
| + const base::string16& title,
|
| + const base::Time& last_forced_time)
|
| + : url(url),
|
| + title(title),
|
| + last_forced_time(last_forced_time) {
|
| +}
|
| +
|
| +MostVisitedURL::~MostVisitedURL() {}
|
| +
|
| +// FilteredURL -----------------------------------------------------------------
|
| +
|
| +FilteredURL::FilteredURL() : score(0.0) {}
|
| +
|
| +FilteredURL::FilteredURL(const PageUsageData& page_data)
|
| + : url(page_data.GetURL()),
|
| + title(page_data.GetTitle()),
|
| + score(page_data.GetScore()) {
|
| +}
|
| +
|
| +FilteredURL::~FilteredURL() {}
|
| +
|
| +// FilteredURL::ExtendedInfo ---------------------------------------------------
|
| +
|
| +FilteredURL::ExtendedInfo::ExtendedInfo()
|
| + : total_visits(0),
|
| + visits(0),
|
| + duration_opened(0) {
|
| +}
|
| +
|
| +// Images ---------------------------------------------------------------------
|
| +
|
| +Images::Images() {}
|
| +
|
| +Images::~Images() {}
|
| +
|
| +// TopSitesDelta --------------------------------------------------------------
|
| +
|
| +TopSitesDelta::TopSitesDelta() {}
|
| +
|
| +TopSitesDelta::~TopSitesDelta() {}
|
|
|
| // HistoryAddPageArgs ---------------------------------------------------------
|
|
|
| @@ -77,8 +269,56 @@
|
|
|
| HistoryAddPageArgs::~HistoryAddPageArgs() {}
|
|
|
| +ThumbnailMigration::ThumbnailMigration() {}
|
| +
|
| +ThumbnailMigration::~ThumbnailMigration() {}
|
| +
|
| +MostVisitedThumbnails::MostVisitedThumbnails() {}
|
| +
|
| +MostVisitedThumbnails::~MostVisitedThumbnails() {}
|
| +
|
| +// IconMapping ----------------------------------------------------------------
|
| +
|
| +IconMapping::IconMapping()
|
| + : mapping_id(0), icon_id(0), icon_type(favicon_base::INVALID_ICON) {}
|
| +
|
| +IconMapping::~IconMapping() {}
|
| +
|
| +// FaviconBitmapIDSize ---------------------------------------------------------
|
| +
|
| +FaviconBitmapIDSize::FaviconBitmapIDSize()
|
| + : bitmap_id(0) {
|
| +}
|
| +
|
| +FaviconBitmapIDSize::~FaviconBitmapIDSize() {
|
| +}
|
| +
|
| +// FaviconBitmap --------------------------------------------------------------
|
| +
|
| +FaviconBitmap::FaviconBitmap()
|
| + : bitmap_id(0),
|
| + icon_id(0) {
|
| +}
|
| +
|
| +FaviconBitmap::~FaviconBitmap() {
|
| +}
|
| +
|
| // VisitDatabaseObserver -------------------------------------------------------
|
|
|
| VisitDatabaseObserver::~VisitDatabaseObserver() {}
|
|
|
| +ExpireHistoryArgs::ExpireHistoryArgs() {
|
| +}
|
| +
|
| +ExpireHistoryArgs::~ExpireHistoryArgs() {
|
| +}
|
| +
|
| +void ExpireHistoryArgs::SetTimeRangeForOneDay(base::Time time) {
|
| + begin_time = time.LocalMidnight();
|
| +
|
| + // Due to DST, leap seconds, etc., the next day at midnight may be more than
|
| + // 24 hours away, so add 36 hours and round back down to midnight.
|
| + end_time = (begin_time + base::TimeDelta::FromHours(36)).LocalMidnight();
|
| +}
|
| +
|
| } // namespace history
|
|
|