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 #ifndef COMPONENTS_HISTORY_CORE_BROWSER_URL_ROW_H_ 6 #define COMPONENTS_HISTORY_CORE_BROWSER_URL_ROW_H_ 7 8 #include "base/basictypes.h" 9 #include "base/strings/string16.h" 10 #include "base/time/time.h" 11 #include "components/query_parser/snippet.h" 12 #include "url/gurl.h" 13 14 namespace history { 15 16 typedef int64 URLID; 17 18 // Holds all information globally associated with one URL (one row in the 19 // URL table). 20 // 21 // This keeps track of dirty bits, which are currently unused: 22 // 23 // TODO(brettw) the dirty bits are broken in a number of respects. First, the 24 // database will want to update them on a const object, so they need to be 25 // mutable. 26 // 27 // Second, there is a problem copying. If you make a copy of this structure 28 // (as we allow since we put this into vectors in various places) then the 29 // dirty bits will not be in sync for these copies. 30 class URLRow { 31 public: 32 URLRow(); 33 34 explicit URLRow(const GURL& url); 35 36 // We need to be able to set the id of a URLRow that's being passed through 37 // an IPC message. This constructor should probably not be used otherwise. 38 URLRow(const GURL& url, URLID id); 39 40 virtual ~URLRow(); 41 URLRow& operator=(const URLRow& other); 42 id()43 URLID id() const { return id_; } 44 45 // Sets the id of the row. The id should only be manually set when a row has 46 // been retrieved from the history database or other dataset based on criteria 47 // other than its id (i.e. by URL) and when the id has not yet been set in the 48 // row. set_id(URLID id)49 void set_id(URLID id) { id_ = id; } 50 url()51 const GURL& url() const { return url_; } 52 title()53 const base::string16& title() const { 54 return title_; 55 } set_title(const base::string16 & title)56 void set_title(const base::string16& title) { 57 // The title is frequently set to the same thing, so we don't bother 58 // updating unless the string has changed. 59 if (title != title_) { 60 title_ = title; 61 } 62 } 63 64 // The number of times this URL has been visited. This will often match the 65 // number of entries in the visit table for this URL, but won't always. It's 66 // really designed for autocomplete ranking, so some "useless" transitions 67 // from the visit table aren't counted in this tally. visit_count()68 int visit_count() const { 69 return visit_count_; 70 } set_visit_count(int visit_count)71 void set_visit_count(int visit_count) { 72 visit_count_ = visit_count; 73 } 74 75 // Number of times the URL was typed in the Omnibox. This "should" match 76 // the number of TYPED transitions in the visit table. It's used primarily 77 // for faster autocomplete ranking. If you need to know the actual number of 78 // TYPED transitions, you should query the visit table since there could be 79 // something out of sync. typed_count()80 int typed_count() const { 81 return typed_count_; 82 } set_typed_count(int typed_count)83 void set_typed_count(int typed_count) { 84 typed_count_ = typed_count; 85 } 86 last_visit()87 base::Time last_visit() const { 88 return last_visit_; 89 } set_last_visit(base::Time last_visit)90 void set_last_visit(base::Time last_visit) { 91 last_visit_ = last_visit; 92 } 93 94 // If this is set, we won't autocomplete this URL. hidden()95 bool hidden() const { 96 return hidden_; 97 } set_hidden(bool hidden)98 void set_hidden(bool hidden) { 99 hidden_ = hidden; 100 } 101 102 // Helper functor that determines if an URLRow refers to a given URL. 103 class URLRowHasURL { 104 public: URLRowHasURL(const GURL & url)105 explicit URLRowHasURL(const GURL& url) : url_(url) {} 106 operator()107 bool operator()(const URLRow& row) { 108 return row.url() == url_; 109 } 110 111 private: 112 const GURL& url_; 113 }; 114 115 protected: 116 // Swaps the contents of this URLRow with another, which allows it to be 117 // destructively copied without memory allocations. 118 void Swap(URLRow* other); 119 120 private: 121 // This class writes directly into this structure and clears our dirty bits 122 // when reading out of the DB. 123 friend class URLDatabase; 124 friend class HistoryBackend; 125 126 // Initializes all values that need initialization to their defaults. 127 // This excludes objects which autoinitialize such as strings. 128 void Initialize(); 129 130 // The row ID of this URL from the history database. This is immutable except 131 // when retrieving the row from the database or when determining if the URL 132 // referenced by the URLRow already exists in the database. 133 URLID id_; 134 135 // The URL of this row. Immutable except for the database which sets it 136 // when it pulls them out. If clients want to change it, they must use 137 // the constructor to make a new one. 138 GURL url_; 139 140 base::string16 title_; 141 142 // Total number of times this URL has been visited. 143 int visit_count_; 144 145 // Number of times this URL has been manually entered in the URL bar. 146 int typed_count_; 147 148 // The date of the last visit of this URL, which saves us from having to 149 // loop up in the visit table for things like autocomplete and expiration. 150 base::Time last_visit_; 151 152 // Indicates this entry should now be shown in typical UI or queries, this 153 // is usually for subframes. 154 bool hidden_; 155 156 // We support the implicit copy constuctor and operator=. 157 }; 158 typedef std::vector<URLRow> URLRows; 159 160 161 class URLResult : public URLRow { 162 public: 163 URLResult(); 164 URLResult(const GURL& url, base::Time visit_time); 165 // Constructor that create a URLResult from the specified URL and title match 166 // positions from title_matches. 167 URLResult(const GURL& url, 168 const query_parser::Snippet::MatchPositions& title_matches); 169 explicit URLResult(const URLRow& url_row); 170 virtual ~URLResult(); 171 visit_time()172 base::Time visit_time() const { return visit_time_; } set_visit_time(base::Time visit_time)173 void set_visit_time(base::Time visit_time) { visit_time_ = visit_time; } 174 snippet()175 const query_parser::Snippet& snippet() const { return snippet_; } 176 blocked_visit()177 bool blocked_visit() const { return blocked_visit_; } set_blocked_visit(bool blocked_visit)178 void set_blocked_visit(bool blocked_visit) { 179 blocked_visit_ = blocked_visit; 180 } 181 182 // If this is a title match, title_match_positions contains an entry for 183 // every word in the title that matched one of the query parameters. Each 184 // entry contains the start and end of the match. title_match_positions()185 const query_parser::Snippet::MatchPositions& title_match_positions() const { 186 return title_match_positions_; 187 } 188 189 void SwapResult(URLResult* other); 190 191 static bool CompareVisitTime(const URLResult& lhs, const URLResult& rhs); 192 193 private: 194 friend class HistoryBackend; 195 196 // The time that this result corresponds to. 197 base::Time visit_time_; 198 199 // These values are typically set by HistoryBackend. 200 query_parser::Snippet snippet_; 201 query_parser::Snippet::MatchPositions title_match_positions_; 202 203 // Whether a managed user was blocked when attempting to visit this URL. 204 bool blocked_visit_; 205 206 // We support the implicit copy constructor and operator=. 207 }; 208 209 } // namespace history 210 211 #endif // COMPONENTS_HISTORY_CORE_BROWSER_URL_ROW_H_ 212