• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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