Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(134)

Side by Side Diff: chrome/browser/history/expire_history_backend.h

Issue 870593003: Componentize expire_history_backend.{cc,h} (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix a typo Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | chrome/browser/history/expire_history_backend.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2012 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 CHROME_BROWSER_HISTORY_EXPIRE_HISTORY_BACKEND_H_
6 #define CHROME_BROWSER_HISTORY_EXPIRE_HISTORY_BACKEND_H_
7
8 #include <queue>
9 #include <set>
10 #include <vector>
11
12 #include "base/basictypes.h"
13 #include "base/gtest_prod_util.h"
14 #include "base/memory/scoped_ptr.h"
15 #include "base/memory/weak_ptr.h"
16 #include "base/time/time.h"
17 #include "components/history/core/browser/history_types.h"
18
19 class GURL;
20 class TestingProfile;
21
22 namespace history {
23
24 class HistoryBackendNotifier;
25 class HistoryClient;
26 class HistoryDatabase;
27 class ThumbnailDatabase;
28
29 // Encapsulates visit expiration criteria and type of visits to expire.
30 class ExpiringVisitsReader {
31 public:
32 virtual ~ExpiringVisitsReader() {}
33 // Populates |visits| from |db|, using provided |end_time| and |max_visits|
34 // cap.
35 virtual bool Read(base::Time end_time, HistoryDatabase* db,
36 VisitVector* visits, int max_visits) const = 0;
37 };
38
39 typedef std::vector<const ExpiringVisitsReader*> ExpiringVisitsReaders;
40
41 // Helper component to HistoryBackend that manages expiration and deleting of
42 // history.
43 //
44 // It will automatically start periodically expiring old history once you call
45 // StartExpiringOldStuff().
46 class ExpireHistoryBackend {
47 public:
48 // The delegate pointer must be non-NULL. We will NOT take ownership of it.
49 // HistoryClient may be NULL. The HistoryClient is used when expiring URLS so
50 // that we don't remove any URLs or favicons that are bookmarked (visits are
51 // removed though).
52 ExpireHistoryBackend(HistoryBackendNotifier* notifier,
53 HistoryClient* history_client);
54 ~ExpireHistoryBackend();
55
56 // Completes initialization by setting the databases that this class will use.
57 void SetDatabases(HistoryDatabase* main_db,
58 ThumbnailDatabase* thumb_db);
59
60 // Begins periodic expiration of history older than the given threshold. This
61 // will continue until the object is deleted.
62 void StartExpiringOldStuff(base::TimeDelta expiration_threshold);
63
64 // Deletes everything associated with a URL.
65 void DeleteURL(const GURL& url);
66
67 // Deletes everything associated with each URL in the list.
68 void DeleteURLs(const std::vector<GURL>& url);
69
70 // Removes all visits to restrict_urls (or all URLs if empty) in the given
71 // time range, updating the URLs accordingly.
72 void ExpireHistoryBetween(const std::set<GURL>& restrict_urls,
73 base::Time begin_time, base::Time end_time);
74
75 // Removes all visits to all URLs with the given times, updating the
76 // URLs accordingly. |times| must be in reverse chronological order
77 // and not contain any duplicates.
78 void ExpireHistoryForTimes(const std::vector<base::Time>& times);
79
80 // Removes the given list of visits, updating the URLs accordingly (similar to
81 // ExpireHistoryBetween(), but affecting a specific set of visits).
82 void ExpireVisits(const VisitVector& visits);
83
84 // Expires all visits before and including the given time, updating the URLs
85 // accordingly. Currently only used for testing.
86 void ExpireHistoryBefore(base::Time end_time);
87
88 // Returns the current cut-off time before which we will start expiring stuff.
89 // Note that this as an absolute time rather than a delta, so the caller
90 // should not save it.
91 base::Time GetCurrentExpirationTime() const {
92 return base::Time::Now() - expiration_threshold_;
93 }
94
95 private:
96 FRIEND_TEST_ALL_PREFIXES(ExpireHistoryTest, DeleteFaviconsIfPossible);
97 FRIEND_TEST_ALL_PREFIXES(ExpireHistoryTest, ExpireSomeOldHistory);
98 FRIEND_TEST_ALL_PREFIXES(ExpireHistoryTest, ExpiringVisitsReader);
99 FRIEND_TEST_ALL_PREFIXES(ExpireHistoryTest, ExpireSomeOldHistoryWithSource);
100 friend class ::TestingProfile;
101
102 struct DeleteEffects {
103 DeleteEffects();
104 ~DeleteEffects();
105
106 // The time range affected. These can be is_null() to be unbounded in one
107 // or both directions.
108 base::Time begin_time, end_time;
109
110 // The unique URL rows affected by this delete.
111 std::map<URLID, URLRow> affected_urls;
112
113 // The URLs modified, but not deleted, during this operation.
114 URLRows modified_urls;
115
116 // The URLs deleted during this operation.
117 URLRows deleted_urls;
118
119 // All favicon IDs that the deleted URLs had. Favicons will be shared
120 // between all URLs with the same favicon, so this is the set of IDs that we
121 // will need to check when the delete operations are complete.
122 std::set<favicon_base::FaviconID> affected_favicons;
123
124 // All favicon urls that were actually deleted from the thumbnail db.
125 std::set<GURL> deleted_favicons;
126 };
127
128 // Deletes the visit-related stuff for all the visits in the given list, and
129 // adds the rows for unique URLs affected to the affected_urls list in
130 // the dependencies structure.
131 void DeleteVisitRelatedInfo(const VisitVector& visits,
132 DeleteEffects* effects);
133
134 // Finds or deletes dependency information for the given URL. Information that
135 // is specific to this URL (URL row, thumbnails, etc.) is deleted.
136 //
137 // This does not affect the visits! This is used for expiration as well as
138 // deleting from the UI, and they handle visits differently.
139 //
140 // Other information will be collected and returned in the output containers.
141 // This includes some of the things deleted that are needed elsewhere, plus
142 // some things like favicons that could be shared by many URLs, and need to
143 // be checked for deletion (this allows us to delete many URLs with only one
144 // check for shared information at the end).
145 //
146 // Assumes the main_db_ is non-NULL.
147 //
148 // NOTE: If the url is bookmarked only the segments and text db are updated,
149 // everything else is unchanged. This is done so that bookmarks retain their
150 // favicons and thumbnails.
151 void DeleteOneURL(const URLRow& url_row,
152 bool is_bookmarked,
153 DeleteEffects* effects);
154
155 // Deletes all the URLs in the given vector and handles their dependencies.
156 // This will delete starred URLs
157 void DeleteURLs(const URLRows& urls, DeleteEffects* effects);
158
159 // Expiration involves removing visits, then propagating the visits out from
160 // there and delete any orphaned URLs. These will be added to the deleted URLs
161 // field of the dependencies and DeleteOneURL will handle deleting out from
162 // there. This function does not handle favicons.
163 //
164 // When a URL is not deleted, the last visit time and the visit and typed
165 // counts will be updated.
166 //
167 // The visits in the given vector should have already been deleted from the
168 // database, and the list of affected URLs already be filled into
169 // |depenencies->affected_urls|.
170 //
171 // Starred URLs will not be deleted. The information in the dependencies that
172 // DeleteOneURL fills in will be updated, and this function will also delete
173 // any now-unused favicons.
174 void ExpireURLsForVisits(const VisitVector& visits, DeleteEffects* effects);
175
176 // Deletes the favicons listed in |effects->affected_favicons| if they are
177 // unsued. Fails silently (we don't care about favicons so much, so don't want
178 // to stop everything if it fails). Fills |expired_favicons| with the set of
179 // favicon urls that no longer have associated visits and were therefore
180 // expired.
181 void DeleteFaviconsIfPossible(DeleteEffects* effects);
182
183 // Enum representing what type of action resulted in the history DB deletion.
184 enum DeletionType {
185 // User initiated the deletion from the History UI.
186 DELETION_USER_INITIATED,
187 // History data was automatically expired due to being more than 90 days
188 // old.
189 DELETION_EXPIRED
190 };
191
192 // Broadcasts URL modified and deleted notifications.
193 void BroadcastNotifications(DeleteEffects* effects, DeletionType type);
194
195 // Schedules a call to DoExpireIteration.
196 void ScheduleExpire();
197
198 // Calls ExpireSomeOldHistory to expire some amount of old history, according
199 // to the items in work queue, and schedules another call to happen in the
200 // future.
201 void DoExpireIteration();
202
203 // Tries to expire the oldest |max_visits| visits from history that are older
204 // than |time_threshold|. The return value indicates if we think there might
205 // be more history to expire with the current time threshold (it does not
206 // indicate success or failure).
207 bool ExpireSomeOldHistory(base::Time end_time,
208 const ExpiringVisitsReader* reader,
209 int max_visits);
210
211 // Tries to detect possible bad history or inconsistencies in the database
212 // and deletes items. For example, URLs with no visits.
213 void ParanoidExpireHistory();
214
215 // Returns the HistoryClient, blocking until the bookmarks are loaded. This
216 // may return NULL during testing.
217 HistoryClient* GetHistoryClient();
218
219 // Initializes periodic expiration work queue by populating it with with tasks
220 // for all known readers.
221 void InitWorkQueue();
222
223 // Returns the reader for all visits. This method is only used by the unit
224 // tests.
225 const ExpiringVisitsReader* GetAllVisitsReader();
226
227 // Returns the reader for AUTO_SUBFRAME visits. This method is only used by
228 // the unit tests.
229 const ExpiringVisitsReader* GetAutoSubframeVisitsReader();
230
231 // Non-owning pointer to the notification delegate (guaranteed non-NULL).
232 HistoryBackendNotifier* notifier_;
233
234 // Non-owning pointers to the databases we deal with (MAY BE NULL).
235 HistoryDatabase* main_db_; // Main history database.
236 ThumbnailDatabase* thumb_db_; // Thumbnails and favicons.
237
238 // The threshold for "old" history where we will automatically delete it.
239 base::TimeDelta expiration_threshold_;
240
241 // List of all distinct types of readers. This list is used to populate the
242 // work queue.
243 ExpiringVisitsReaders readers_;
244
245 // Work queue for periodic expiration tasks, used by DoExpireIteration() to
246 // determine what to do at an iteration, as well as populate it for future
247 // iterations.
248 std::queue<const ExpiringVisitsReader*> work_queue_;
249
250 // Readers for various types of visits.
251 // TODO(dglazkov): If you are adding another one, please consider reorganizing
252 // into a map.
253 scoped_ptr<ExpiringVisitsReader> all_visits_reader_;
254 scoped_ptr<ExpiringVisitsReader> auto_subframe_visits_reader_;
255
256 // The HistoryClient; may be NULL.
257 //
258 // Use GetHistoryClient to access this, which makes sure the bookmarks are
259 // loaded before returning.
260 HistoryClient* history_client_;
261
262 // Used to generate runnable methods to do timers on this class. They will be
263 // automatically canceled when this class is deleted.
264 base::WeakPtrFactory<ExpireHistoryBackend> weak_factory_;
265
266 DISALLOW_COPY_AND_ASSIGN(ExpireHistoryBackend);
267 };
268
269 } // namespace history
270
271 #endif // CHROME_BROWSER_HISTORY_EXPIRE_HISTORY_BACKEND_H_
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/history/expire_history_backend.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698