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 5 #include "components/history/core/browser/history_types.h" 6 7 #include <limits> 8 9 #include "base/logging.h" 10 #include "base/stl_util.h" 11 #include "components/history/core/browser/page_usage_data.h" 12 13 namespace history { 14 15 // VisitRow -------------------------------------------------------------------- 16 17 VisitRow::VisitRow() 18 : visit_id(0), 19 url_id(0), 20 referring_visit(0), 21 transition(ui::PAGE_TRANSITION_LINK), 22 segment_id(0) { 23 } 24 25 VisitRow::VisitRow(URLID arg_url_id, 26 base::Time arg_visit_time, 27 VisitID arg_referring_visit, 28 ui::PageTransition arg_transition, 29 SegmentID arg_segment_id) 30 : visit_id(0), 31 url_id(arg_url_id), 32 visit_time(arg_visit_time), 33 referring_visit(arg_referring_visit), 34 transition(arg_transition), 35 segment_id(arg_segment_id) { 36 } 37 38 VisitRow::~VisitRow() { 39 } 40 41 // QueryResults ---------------------------------------------------------------- 42 43 QueryResults::QueryResults() : reached_beginning_(false) { 44 } 45 46 QueryResults::~QueryResults() {} 47 48 const size_t* QueryResults::MatchesForURL(const GURL& url, 49 size_t* num_matches) const { 50 URLToResultIndices::const_iterator found = url_to_results_.find(url); 51 if (found == url_to_results_.end()) { 52 if (num_matches) 53 *num_matches = 0; 54 return NULL; 55 } 56 57 // All entries in the map should have at least one index, otherwise it 58 // shouldn't be in the map. 59 DCHECK(!found->second->empty()); 60 if (num_matches) 61 *num_matches = found->second->size(); 62 return &found->second->front(); 63 } 64 65 void QueryResults::Swap(QueryResults* other) { 66 std::swap(first_time_searched_, other->first_time_searched_); 67 std::swap(reached_beginning_, other->reached_beginning_); 68 results_.swap(other->results_); 69 url_to_results_.swap(other->url_to_results_); 70 } 71 72 void QueryResults::AppendURLBySwapping(URLResult* result) { 73 URLResult* new_result = new URLResult; 74 new_result->SwapResult(result); 75 76 results_.push_back(new_result); 77 AddURLUsageAtIndex(new_result->url(), results_.size() - 1); 78 } 79 80 void QueryResults::DeleteURL(const GURL& url) { 81 // Delete all instances of this URL. We re-query each time since each 82 // mutation will cause the indices to change. 83 while (const size_t* match_indices = MatchesForURL(url, NULL)) 84 DeleteRange(*match_indices, *match_indices); 85 } 86 87 void QueryResults::DeleteRange(size_t begin, size_t end) { 88 DCHECK(begin <= end && begin < size() && end < size()); 89 90 // First delete the pointers in the given range and store all the URLs that 91 // were modified. We will delete references to these later. 92 std::set<GURL> urls_modified; 93 for (size_t i = begin; i <= end; i++) { 94 urls_modified.insert(results_[i]->url()); 95 } 96 97 // Now just delete that range in the vector en masse (the STL ending is 98 // exclusive, while ours is inclusive, hence the +1). 99 results_.erase(results_.begin() + begin, results_.begin() + end + 1); 100 101 // Delete the indicies referencing the deleted entries. 102 for (std::set<GURL>::const_iterator url = urls_modified.begin(); 103 url != urls_modified.end(); ++url) { 104 URLToResultIndices::iterator found = url_to_results_.find(*url); 105 if (found == url_to_results_.end()) { 106 NOTREACHED(); 107 continue; 108 } 109 110 // Need a signed loop type since we do -- which may take us to -1. 111 for (int match = 0; match < static_cast<int>(found->second->size()); 112 match++) { 113 if (found->second[match] >= begin && found->second[match] <= end) { 114 // Remove this referece from the list. 115 found->second->erase(found->second->begin() + match); 116 match--; 117 } 118 } 119 120 // Clear out an empty lists if we just made one. 121 if (found->second->empty()) 122 url_to_results_.erase(found); 123 } 124 125 // Shift all other indices over to account for the removed ones. 126 AdjustResultMap(end + 1, std::numeric_limits<size_t>::max(), 127 -static_cast<ptrdiff_t>(end - begin + 1)); 128 } 129 130 void QueryResults::AddURLUsageAtIndex(const GURL& url, size_t index) { 131 URLToResultIndices::iterator found = url_to_results_.find(url); 132 if (found != url_to_results_.end()) { 133 // The URL is already in the list, so we can just append the new index. 134 found->second->push_back(index); 135 return; 136 } 137 138 // Need to add a new entry for this URL. 139 base::StackVector<size_t, 4> new_list; 140 new_list->push_back(index); 141 url_to_results_[url] = new_list; 142 } 143 144 void QueryResults::AdjustResultMap(size_t begin, size_t end, ptrdiff_t delta) { 145 for (URLToResultIndices::iterator i = url_to_results_.begin(); 146 i != url_to_results_.end(); ++i) { 147 for (size_t match = 0; match < i->second->size(); match++) { 148 size_t match_index = i->second[match]; 149 if (match_index >= begin && match_index <= end) 150 i->second[match] += delta; 151 } 152 } 153 } 154 155 // QueryOptions ---------------------------------------------------------------- 156 157 QueryOptions::QueryOptions() 158 : max_count(0), 159 duplicate_policy(QueryOptions::REMOVE_ALL_DUPLICATES) { 160 } 161 162 void QueryOptions::SetRecentDayRange(int days_ago) { 163 end_time = base::Time::Now(); 164 begin_time = end_time - base::TimeDelta::FromDays(days_ago); 165 } 166 167 int64 QueryOptions::EffectiveBeginTime() const { 168 return begin_time.ToInternalValue(); 169 } 170 171 int64 QueryOptions::EffectiveEndTime() const { 172 return end_time.is_null() ? 173 std::numeric_limits<int64>::max() : end_time.ToInternalValue(); 174 } 175 176 int QueryOptions::EffectiveMaxCount() const { 177 return max_count ? max_count : std::numeric_limits<int>::max(); 178 } 179 180 // QueryURLResult ------------------------------------------------------------- 181 182 QueryURLResult::QueryURLResult() : success(false) { 183 } 184 185 QueryURLResult::~QueryURLResult() { 186 } 187 188 // MostVisitedURL -------------------------------------------------------------- 189 190 MostVisitedURL::MostVisitedURL() {} 191 192 MostVisitedURL::MostVisitedURL(const GURL& url, 193 const base::string16& title) 194 : url(url), 195 title(title) { 196 } 197 198 MostVisitedURL::MostVisitedURL(const GURL& url, 199 const base::string16& title, 200 const base::Time& last_forced_time) 201 : url(url), 202 title(title), 203 last_forced_time(last_forced_time) { 204 } 205 206 MostVisitedURL::~MostVisitedURL() {} 207 208 // FilteredURL ----------------------------------------------------------------- 209 210 FilteredURL::FilteredURL() : score(0.0) {} 211 212 FilteredURL::FilteredURL(const PageUsageData& page_data) 213 : url(page_data.GetURL()), 214 title(page_data.GetTitle()), 215 score(page_data.GetScore()) { 216 } 217 218 FilteredURL::~FilteredURL() {} 219 220 // FilteredURL::ExtendedInfo --------------------------------------------------- 221 222 FilteredURL::ExtendedInfo::ExtendedInfo() 223 : total_visits(0), 224 visits(0), 225 duration_opened(0) { 226 } 227 228 // Images --------------------------------------------------------------------- 229 230 Images::Images() {} 231 232 Images::~Images() {} 233 234 // TopSitesDelta -------------------------------------------------------------- 235 236 TopSitesDelta::TopSitesDelta() {} 237 238 TopSitesDelta::~TopSitesDelta() {} 239 240 // HistoryAddPageArgs --------------------------------------------------------- 241 242 HistoryAddPageArgs::HistoryAddPageArgs() 243 : context_id(NULL), 244 page_id(0), 245 transition(ui::PAGE_TRANSITION_LINK), 246 visit_source(SOURCE_BROWSED), 247 did_replace_entry(false) {} 248 249 HistoryAddPageArgs::HistoryAddPageArgs( 250 const GURL& url, 251 base::Time time, 252 ContextID context_id, 253 int32 page_id, 254 const GURL& referrer, 255 const history::RedirectList& redirects, 256 ui::PageTransition transition, 257 VisitSource source, 258 bool did_replace_entry) 259 : url(url), 260 time(time), 261 context_id(context_id), 262 page_id(page_id), 263 referrer(referrer), 264 redirects(redirects), 265 transition(transition), 266 visit_source(source), 267 did_replace_entry(did_replace_entry) { 268 } 269 270 HistoryAddPageArgs::~HistoryAddPageArgs() {} 271 272 // ThumbnailMigration --------------------------------------------------------- 273 274 ThumbnailMigration::ThumbnailMigration() {} 275 276 ThumbnailMigration::~ThumbnailMigration() {} 277 278 // MostVisitedThumbnails ------------------------------------------------------ 279 280 MostVisitedThumbnails::MostVisitedThumbnails() {} 281 282 MostVisitedThumbnails::~MostVisitedThumbnails() {} 283 284 // IconMapping ---------------------------------------------------------------- 285 286 IconMapping::IconMapping() 287 : mapping_id(0), icon_id(0), icon_type(favicon_base::INVALID_ICON) {} 288 289 IconMapping::~IconMapping() {} 290 291 // FaviconBitmapIDSize --------------------------------------------------------- 292 293 FaviconBitmapIDSize::FaviconBitmapIDSize() 294 : bitmap_id(0) { 295 } 296 297 FaviconBitmapIDSize::~FaviconBitmapIDSize() { 298 } 299 300 // FaviconBitmap -------------------------------------------------------------- 301 302 FaviconBitmap::FaviconBitmap() 303 : bitmap_id(0), 304 icon_id(0) { 305 } 306 307 FaviconBitmap::~FaviconBitmap() { 308 } 309 310 // VisitDatabaseObserver ------------------------------------------------------- 311 312 VisitDatabaseObserver::~VisitDatabaseObserver() {} 313 314 // ExpireHistoryArgs ---------------------------------------------------------- 315 316 ExpireHistoryArgs::ExpireHistoryArgs() { 317 } 318 319 ExpireHistoryArgs::~ExpireHistoryArgs() { 320 } 321 322 void ExpireHistoryArgs::SetTimeRangeForOneDay(base::Time time) { 323 begin_time = time.LocalMidnight(); 324 325 // Due to DST, leap seconds, etc., the next day at midnight may be more than 326 // 24 hours away, so add 36 hours and round back down to midnight. 327 end_time = (begin_time + base::TimeDelta::FromHours(36)).LocalMidnight(); 328 } 329 330 } // namespace history 331