Index: chrome/browser/history/expire_history_backend.h |
=================================================================== |
--- chrome/browser/history/expire_history_backend.h (revision 19822) |
+++ chrome/browser/history/expire_history_backend.h (working copy) |
@@ -5,12 +5,14 @@ |
#ifndef CHROME_BROWSER_HISTORY_EXPIRE_HISTORY_BACKEND_H__ |
#define CHROME_BROWSER_HISTORY_EXPIRE_HISTORY_BACKEND_H__ |
+#include <queue> |
#include <set> |
#include <vector> |
#include "base/basictypes.h" |
#include "base/task.h" |
#include "base/time.h" |
+#include "base/scoped_ptr.h" |
#include "chrome/browser/history/history_types.h" |
#include "chrome/browser/history/text_database_manager.h" |
#include "testing/gtest/include/gtest/gtest_prod.h" |
@@ -36,6 +38,18 @@ |
HistoryDetails* details_deleted) = 0; |
}; |
+// Encapsulates visit expiration criteria and type of visits to expire. |
+class ExpiringVisitsReader { |
+ public: |
+ virtual ~ExpiringVisitsReader() {} |
+ // Populates |visits| from |db|, using provided |end_time| and |max_visits| |
+ // cap. |
+ virtual bool Read(base::Time end_time, HistoryDatabase* db, |
+ VisitVector* visits, int max_visits) const = 0; |
+}; |
+ |
+typedef std::vector<const ExpiringVisitsReader*> ExpiringVisitsReaders; |
+ |
// Helper component to HistoryBackend that manages expiration and deleting of |
// history, as well as moving data from the main database to the archived |
// database as it gets old. |
@@ -86,6 +100,7 @@ |
FRIEND_TEST(ExpireHistoryTest, DeleteTextIndexForURL); |
FRIEND_TEST(ExpireHistoryTest, DeleteFaviconsIfPossible); |
FRIEND_TEST(ExpireHistoryTest, ArchiveSomeOldHistory); |
+ FRIEND_TEST(ExpireHistoryTest, ExpiringVisitsReader); |
friend class ::TestingProfile; |
struct DeleteDependencies { |
@@ -207,19 +222,21 @@ |
// Broadcast the URL deleted notification. |
void BroadcastDeleteNotifications(DeleteDependencies* dependencies); |
- // Schedules a call to DoArchiveIteration at the given time in the |
+ // Schedules a call to DoArchiveIteration. |
+ void ScheduleArchive(); |
+ |
+ // Calls ArchiveSomeOldHistory to expire some amount of old history, according |
+ // to the items in work queue, and schedules another call to happen in the |
// future. |
- void ScheduleArchive(base::TimeDelta delay); |
- |
- // Calls ArchiveSomeOldHistory to expire some amount of old history, and |
- // schedules another call to happen in the future. |
void DoArchiveIteration(); |
// Tries to expire the oldest |max_visits| visits from history that are older |
// than |time_threshold|. The return value indicates if we think there might |
// be more history to expire with the current time threshold (it does not |
// indicate success or failure). |
- bool ArchiveSomeOldHistory(base::Time time_threshold, int max_visits); |
+ bool ArchiveSomeOldHistory(base::Time end_time, |
+ const ExpiringVisitsReader* reader, |
+ int max_visits); |
// Tries to detect possible bad history or inconsistencies in the database |
// and deletes items. For example, URLs with no visits. |
@@ -229,6 +246,18 @@ |
// NULL. |
BookmarkService* GetBookmarkService(); |
+ // Initializes periodic expiration work queue by populating it with with tasks |
+ // for all known readers. |
+ void InitWorkQueue(); |
+ |
+ // Returns the reader for all visits. This method is only used by the unit |
+ // tests. |
+ const ExpiringVisitsReader* GetAllVisitsReader(); |
+ |
+ // Returns the reader for AUTO_SUBFRAME visits. This method is only used by |
+ // the unit tests. |
+ const ExpiringVisitsReader* GetAutoSubframeVisitsReader(); |
+ |
// Non-owning pointer to the notification delegate (guaranteed non-NULL). |
BroadcastNotificationDelegate* delegate_; |
@@ -246,6 +275,21 @@ |
// the archived database. |
base::TimeDelta expiration_threshold_; |
+ // List of all distinct types of readers. This list is used to populate the |
+ // work queue. |
+ ExpiringVisitsReaders readers_; |
+ |
+ // Work queue for periodic expiration tasks, used by DoArchiveIteration() to |
+ // determine what to do at an iteration, as well as populate it for future |
+ // iterations. |
+ std::queue<const ExpiringVisitsReader*> work_queue_; |
+ |
+ // Readers for various types of visits. |
+ // TODO(dglazkov): If you are adding another one, please consider reorganizing |
+ // into a map. |
+ scoped_ptr<ExpiringVisitsReader> all_visits_reader_; |
+ scoped_ptr<ExpiringVisitsReader> auto_subframe_visits_reader_; |
+ |
// The BookmarkService; may be null. This is owned by the Profile. |
// |
// Use GetBookmarkService to access this, which makes sure the service is |