Index: chrome/browser/history/expire_history_backend.cc |
diff --git a/chrome/browser/history/expire_history_backend.cc b/chrome/browser/history/expire_history_backend.cc |
index cf77fe48b6adad9cfdcb4c9f1db2567784181864..160e40db30cbbfa95016fe8b052d61d389343d43 100644 |
--- a/chrome/browser/history/expire_history_backend.cc |
+++ b/chrome/browser/history/expire_history_backend.cc |
@@ -16,7 +16,6 @@ |
#include "base/message_loop/message_loop.h" |
#include "chrome/browser/bookmarks/bookmark_service.h" |
#include "chrome/browser/chrome_notification_types.h" |
-#include "chrome/browser/history/archived_database.h" |
#include "chrome/browser/history/history_database.h" |
#include "chrome/browser/history/history_notifications.h" |
#include "chrome/browser/history/thumbnail_database.h" |
@@ -94,32 +93,6 @@ class AutoSubframeVisitsReader : public ExpiringVisitsReader { |
} |
}; |
-// Returns true if this visit is worth archiving. Otherwise, this visit is not |
-// worth saving (for example, subframe navigations and redirects) and we can |
-// just delete it when it gets old. |
-bool ShouldArchiveVisit(const VisitRow& visit) { |
- int no_qualifier = content::PageTransitionStripQualifier(visit.transition); |
- |
- // These types of transitions are always "important" and the user will want |
- // to see them. |
- if (no_qualifier == content::PAGE_TRANSITION_TYPED || |
- no_qualifier == content::PAGE_TRANSITION_AUTO_BOOKMARK || |
- no_qualifier == content::PAGE_TRANSITION_AUTO_TOPLEVEL) |
- return true; |
- |
- // Only archive these "less important" transitions when they were the final |
- // navigation and not part of a redirect chain. |
- if ((no_qualifier == content::PAGE_TRANSITION_LINK || |
- no_qualifier == content::PAGE_TRANSITION_FORM_SUBMIT || |
- no_qualifier == content::PAGE_TRANSITION_KEYWORD || |
- no_qualifier == content::PAGE_TRANSITION_GENERATED) && |
- visit.transition & content::PAGE_TRANSITION_CHAIN_END) |
- return true; |
- |
- // The transition types we ignore are AUTO_SUBFRAME and MANUAL_SUBFRAME. |
- return false; |
-} |
- |
// The number of visits we will expire very time we check for old items. This |
// Prevents us from doing too much work any given time. |
const int kNumExpirePerIteration = 32; |
@@ -169,7 +142,6 @@ ExpireHistoryBackend::ExpireHistoryBackend( |
BookmarkService* bookmark_service) |
: delegate_(delegate), |
main_db_(NULL), |
- archived_db_(NULL), |
thumb_db_(NULL), |
weak_factory_(this), |
bookmark_service_(bookmark_service) { |
@@ -179,10 +151,8 @@ ExpireHistoryBackend::~ExpireHistoryBackend() { |
} |
void ExpireHistoryBackend::SetDatabases(HistoryDatabase* main_db, |
- ArchivedDatabase* archived_db, |
ThumbnailDatabase* thumb_db) { |
main_db_ = main_db; |
- archived_db_ = archived_db; |
thumb_db_ = thumb_db; |
} |
@@ -203,8 +173,7 @@ void ExpireHistoryBackend::DeleteURLs(const std::vector<GURL>& urls) { |
// Collect all the visits and delete them. Note that we don't give |
// up if there are no visits, since the URL could still have an |
- // entry that we should delete. TODO(brettw): bug 1171148: We |
- // should also delete from the archived DB. |
+ // entry that we should delete. |
VisitVector visits; |
main_db_->GetVisitsForURL(url_row.id(), &visits); |
@@ -234,7 +203,6 @@ void ExpireHistoryBackend::ExpireHistoryBetween( |
return; |
// Find the affected visits and delete them. |
- // TODO(brettw): bug 1171164: We should query the archived database here, too. |
VisitVector visits; |
main_db_->GetAllVisitsInRange(begin_time, end_time, 0, &visits); |
if (!restrict_urls.empty()) { |
@@ -267,7 +235,6 @@ void ExpireHistoryBackend::ExpireHistoryForTimes( |
return; |
// Find the affected visits and delete them. |
- // TODO(brettw): bug 1171164: We should query the archived database here, too. |
VisitVector visits; |
main_db_->GetVisitsForTimes(times, &visits); |
ExpireVisits(visits); |
@@ -294,12 +261,12 @@ void ExpireHistoryBackend::ExpireVisits(const VisitVector& visits) { |
ParanoidExpireHistory(); |
} |
-void ExpireHistoryBackend::ArchiveHistoryBefore(Time end_time) { |
+void ExpireHistoryBackend::ExpireHistoryBefore(Time end_time) { |
if (!main_db_) |
return; |
- // Archive as much history as possible before the given date. |
- ArchiveSomeOldHistory(end_time, GetAllVisitsReader(), |
+ // Expire all history before the given date. |
+ ExpireSomeOldHistory(end_time, GetAllVisitsReader(), |
std::numeric_limits<int>::max()); |
ParanoidExpireHistory(); |
} |
@@ -324,7 +291,7 @@ const ExpiringVisitsReader* |
return auto_subframe_visits_reader_.get(); |
} |
-void ExpireHistoryBackend::StartArchivingOldStuff( |
+void ExpireHistoryBackend::StartExpiringOldStuff( |
TimeDelta expiration_threshold) { |
expiration_threshold_ = expiration_threshold; |
@@ -339,7 +306,7 @@ void ExpireHistoryBackend::StartArchivingOldStuff( |
// Initialize the queue with all tasks for the first set of iterations. |
InitWorkQueue(); |
- ScheduleArchive(); |
+ ScheduleExpire(); |
} |
void ExpireHistoryBackend::DeleteFaviconsIfPossible( |
@@ -372,10 +339,10 @@ void ExpireHistoryBackend::BroadcastDeleteNotifications( |
// determine if they care whether anything was deleted). |
scoped_ptr<URLsDeletedDetails> details(new URLsDeletedDetails); |
details->all_history = false; |
- details->archived = (type == DELETION_ARCHIVED); |
+ details->expired = (type == DELETION_EXPIRED); |
details->rows = dependencies->deleted_urls; |
details->favicon_urls = dependencies->expired_favicons; |
- delegate_->NotifySyncURLsDeleted(false, details->archived, &details->rows); |
+ delegate_->NotifySyncURLsDeleted(false, details->expired, &details->rows); |
delegate_->BroadcastNotifications(chrome::NOTIFICATION_HISTORY_URLS_DELETED, |
details.PassAs<HistoryDetails>()); |
} |
@@ -427,27 +394,6 @@ void ExpireHistoryBackend::DeleteOneURL( |
} |
} |
-URLID ExpireHistoryBackend::ArchiveOneURL(const URLRow& url_row) { |
- if (!archived_db_) |
- return 0; |
- |
- // See if this URL is present in the archived database already. Note that |
- // we must look up by ID since the URL ID will be different. |
- URLRow archived_row; |
- if (archived_db_->GetRowForURL(url_row.url(), &archived_row)) { |
- // TODO(sky): bug 1168470, need to archive past search terms. |
- // TODO(brettw): should be copy the visit counts over? This will mean that |
- // the main DB's visit counts are only for the last 3 months rather than |
- // accumulative. |
- archived_row.set_last_visit(url_row.last_visit()); |
- archived_db_->UpdateURLRow(archived_row.id(), archived_row); |
- return archived_row.id(); |
- } |
- |
- // This row is not in the archived DB, add it. |
- return archived_db_->AddURL(url_row); |
-} |
- |
namespace { |
struct ChangedURL { |
@@ -518,62 +464,7 @@ void ExpireHistoryBackend::ExpireURLsForVisits( |
} |
} |
-void ExpireHistoryBackend::ArchiveURLsAndVisits( |
- const VisitVector& visits, |
- DeleteDependencies* dependencies) { |
- if (!archived_db_ || !main_db_) |
- return; |
- |
- // Make sure all unique URL rows are added to the dependency list and the |
- // archived database. We will also keep the mapping between the main DB URLID |
- // and the archived one. |
- std::map<URLID, URLID> main_id_to_archived_id; |
- for (size_t i = 0; i < visits.size(); i++) { |
- std::map<URLID, URLRow>::const_iterator found = |
- dependencies->affected_urls.find(visits[i].url_id); |
- if (found == dependencies->affected_urls.end()) { |
- // Unique URL encountered, archive it. |
- URLRow row; // Row in the main DB. |
- URLID archived_id; // ID in the archived DB. |
- if (!main_db_->GetURLRow(visits[i].url_id, &row) || |
- !(archived_id = ArchiveOneURL(row))) { |
- // Failure archiving, skip this one. |
- continue; |
- } |
- |
- // Only add URL to the dependency list once we know we successfully |
- // archived it. |
- main_id_to_archived_id[row.id()] = archived_id; |
- dependencies->affected_urls[row.id()] = row; |
- } |
- } |
- |
- // Retrieve the sources for all the archived visits before archiving. |
- // The returned visit_sources vector should contain the source for each visit |
- // from visits at the same index. |
- VisitSourceMap visit_sources; |
- main_db_->GetVisitsSource(visits, &visit_sources); |
- |
- // Now archive the visits since we know the URL ID to make them reference. |
- // The source visit list should still reference the visits in the main DB, but |
- // we will update it to reflect only the visits that were successfully |
- // archived. |
- for (size_t i = 0; i < visits.size(); i++) { |
- // Construct the visit that we will add to the archived database. We do |
- // not store referring visits since we delete many of the visits when |
- // archiving. |
- VisitRow cur_visit(visits[i]); |
- cur_visit.url_id = main_id_to_archived_id[cur_visit.url_id]; |
- cur_visit.referring_visit = 0; |
- VisitSourceMap::iterator iter = visit_sources.find(visits[i].visit_id); |
- archived_db_->AddVisit( |
- &cur_visit, |
- iter == visit_sources.end() ? SOURCE_BROWSED : iter->second); |
- // Ignore failures, we will delete it from the main DB no matter what. |
- } |
-} |
- |
-void ExpireHistoryBackend::ScheduleArchive() { |
+void ExpireHistoryBackend::ScheduleExpire() { |
TimeDelta delay; |
if (work_queue_.empty()) { |
// If work queue is empty, reset the work queue to contain all tasks and |
@@ -586,16 +477,16 @@ void ExpireHistoryBackend::ScheduleArchive() { |
base::MessageLoop::current()->PostDelayedTask( |
FROM_HERE, |
- base::Bind(&ExpireHistoryBackend::DoArchiveIteration, |
+ base::Bind(&ExpireHistoryBackend::DoExpireIteration, |
weak_factory_.GetWeakPtr()), |
delay); |
} |
-void ExpireHistoryBackend::DoArchiveIteration() { |
+void ExpireHistoryBackend::DoExpireIteration() { |
DCHECK(!work_queue_.empty()) << "queue has to be non-empty"; |
const ExpiringVisitsReader* reader = work_queue_.front(); |
- bool more_to_expire = ArchiveSomeOldHistory(GetCurrentArchiveTime(), reader, |
+ bool more_to_expire = ExpireSomeOldHistory(GetCurrentExpirationTime(), reader, |
kNumExpirePerIteration); |
work_queue_.pop(); |
@@ -604,10 +495,10 @@ void ExpireHistoryBackend::DoArchiveIteration() { |
if (more_to_expire) |
work_queue_.push(reader); |
- ScheduleArchive(); |
+ ScheduleExpire(); |
} |
-bool ExpireHistoryBackend::ArchiveSomeOldHistory( |
+bool ExpireHistoryBackend::ExpireSomeOldHistory( |
base::Time end_time, |
const ExpiringVisitsReader* reader, |
int max_visits) { |
@@ -619,51 +510,17 @@ bool ExpireHistoryBackend::ArchiveSomeOldHistory( |
Time effective_end_time = |
Time::FromInternalValue(end_time.ToInternalValue() + 1); |
- VisitVector affected_visits; |
+ VisitVector visits_to_delete; |
bool more_to_expire = reader->Read(effective_end_time, main_db_, |
- &affected_visits, max_visits); |
+ &visits_to_delete, max_visits); |
- // Some visits we'll delete while others we'll archive. |
- VisitVector deleted_visits, archived_visits; |
- for (size_t i = 0; i < affected_visits.size(); i++) { |
- if (ShouldArchiveVisit(affected_visits[i])) |
- archived_visits.push_back(affected_visits[i]); |
- else |
- deleted_visits.push_back(affected_visits[i]); |
- } |
+ DeleteDependencies dependencies; |
+ DeleteVisitRelatedInfo(visits_to_delete, &dependencies); |
+ ExpireURLsForVisits(visits_to_delete, &dependencies); |
+ DeleteFaviconsIfPossible(dependencies.affected_favicons, |
+ &dependencies.expired_favicons); |
- // Do the actual archiving. |
- DeleteDependencies archived_dependencies; |
- ArchiveURLsAndVisits(archived_visits, &archived_dependencies); |
- DeleteVisitRelatedInfo(archived_visits, &archived_dependencies); |
- |
- DeleteDependencies deleted_dependencies; |
- DeleteVisitRelatedInfo(deleted_visits, &deleted_dependencies); |
- |
- // This will remove or archive all the affected URLs. Must do the deleting |
- // cleanup before archiving so the delete dependencies structure references |
- // only those URLs that were actually deleted instead of having some visits |
- // archived and then the rest deleted. |
- ExpireURLsForVisits(deleted_visits, &deleted_dependencies); |
- ExpireURLsForVisits(archived_visits, &archived_dependencies); |
- |
- // Create a union of all affected favicons (we don't store favicons for |
- // archived URLs) and delete them. |
- std::set<chrome::FaviconID> affected_favicons( |
- archived_dependencies.affected_favicons); |
- for (std::set<chrome::FaviconID>::const_iterator i = |
- deleted_dependencies.affected_favicons.begin(); |
- i != deleted_dependencies.affected_favicons.end(); ++i) { |
- affected_favicons.insert(*i); |
- } |
- DeleteFaviconsIfPossible(affected_favicons, |
- &deleted_dependencies.expired_favicons); |
- |
- // Send notifications for the stuff that was deleted. These won't normally be |
- // in history views since they were subframes, but they will be in the visited |
- // link system, which needs to be updated now. This function is smart enough |
- // to not do anything if nothing was deleted. |
- BroadcastDeleteNotifications(&deleted_dependencies, DELETION_ARCHIVED); |
+ BroadcastDeleteNotifications(&dependencies, DELETION_EXPIRED); |
return more_to_expire; |
} |