diff options
Diffstat (limited to 'chrome/browser/history/in_memory_url_index.cc')
-rw-r--r-- | chrome/browser/history/in_memory_url_index.cc | 112 |
1 files changed, 35 insertions, 77 deletions
diff --git a/chrome/browser/history/in_memory_url_index.cc b/chrome/browser/history/in_memory_url_index.cc index cd137d8..b92a062 100644 --- a/chrome/browser/history/in_memory_url_index.cc +++ b/chrome/browser/history/in_memory_url_index.cc @@ -13,15 +13,20 @@ #include "base/file_util.h" #include "base/i18n/case_conversion.h" #include "base/metrics/histogram.h" +#include "base/string_util.h" #include "base/threading/thread_restrictions.h" +#include "base/time.h" #include "base/utf_string_conversions.h" #include "chrome/browser/autocomplete/autocomplete.h" -#include "chrome/browser/history/history_notifications.h" +#include "chrome/browser/autocomplete/history_provider_util.h" #include "chrome/browser/history/url_database.h" -#include "chrome/common/chrome_notification_types.h" +#include "chrome/browser/profiles/profile.h" #include "chrome/common/url_constants.h" -#include "content/public/browser/notification_service.h" +#include "googleurl/src/url_parse.h" +#include "googleurl/src/url_util.h" +#include "net/base/escape.h" #include "net/base/net_util.h" +#include "third_party/protobuf/src/google/protobuf/repeated_field.h" #include "ui/base/l10n/l10n_util.h" using google::protobuf::RepeatedField; @@ -107,19 +112,11 @@ int ScoreForValue(int value, const int* value_ranks) { return score; } -InMemoryURLIndex::InMemoryURLIndex(Profile* profile, - const FilePath& history_dir) +InMemoryURLIndex::InMemoryURLIndex(const FilePath& history_dir) : history_dir_(history_dir), private_data_(new URLIndexPrivateData), cached_at_shutdown_(false) { InMemoryURLIndex::InitializeSchemeWhitelist(&scheme_whitelist_); - if (profile) { - content::Source<Profile> source(profile); - registrar_.Add(this, chrome::NOTIFICATION_HISTORY_URL_VISITED, source); - registrar_.Add(this, chrome::NOTIFICATION_HISTORY_TYPED_URLS_MODIFIED, - source); - registrar_.Add(this, chrome::NOTIFICATION_HISTORY_URLS_DELETED, source); - } } // Called only by unit tests. @@ -133,7 +130,6 @@ InMemoryURLIndex::~InMemoryURLIndex() { // If there was a history directory (which there won't be for some unit tests) // then insure that the cache has already been saved. DCHECK(history_dir_.empty() || cached_at_shutdown_); - registrar_.RemoveAll(); } // static @@ -159,58 +155,11 @@ bool InMemoryURLIndex::Init(URLDatabase* history_db, } void InMemoryURLIndex::ShutDown() { -#if 0 - DEBUGIT DB("InMemoryURLIndex::ShutDown"); - DB.OUTPUT("STOP LISTENING FOR NOTIFICATIONS", instance_); -#endif - registrar_.RemoveAll(); + // Write our cache. SaveToCacheFile(); cached_at_shutdown_ = true; } -void InMemoryURLIndex::Observe(int type, - const content::NotificationSource& source, - const content::NotificationDetails& details) { - switch (type) { - case chrome::NOTIFICATION_HISTORY_URL_VISITED: - OnURLVisited(content::Details<URLVisitedDetails>(details).ptr()); - break; - case chrome::NOTIFICATION_HISTORY_TYPED_URLS_MODIFIED: - OnURLsModified( - content::Details<history::URLsModifiedDetails>(details).ptr()); - break; - case chrome::NOTIFICATION_HISTORY_URLS_DELETED: - OnURLsDeleted( - content::Details<history::URLsDeletedDetails>(details).ptr()); - break; - default: - // For simplicity, the unit tests send us all notifications, even when - // we haven't registered for them, so don't assert here. - break; - } -} - -void InMemoryURLIndex::OnURLVisited(const URLVisitedDetails* details) { - UpdateURL(details->row); -} - -void InMemoryURLIndex::OnURLsModified(const URLsModifiedDetails* details) { - for (std::vector<history::URLRow>::const_iterator row = - details->changed_urls.begin(); - row != details->changed_urls.end(); ++row) - UpdateURL(*row); -} - -void InMemoryURLIndex::OnURLsDeleted(const URLsDeletedDetails* details) { - if (details->all_history) { - ClearPrivateData(); - } else { - for (std::vector<URLRow>::const_iterator row = details->rows.begin(); - row != details->rows.end(); ++row) - DeleteURL(*row); - } -} - void InMemoryURLIndex::IndexRow(const URLRow& row) { const GURL& gurl(row.url()); @@ -400,46 +349,55 @@ bool InMemoryURLIndex::SaveToCacheFile() { return true; } -void InMemoryURLIndex::UpdateURL(const URLRow& row) { +void InMemoryURLIndex::UpdateURL(URLID row_id, const URLRow& row) { // The row may or may not already be in our index. If it is not already // indexed and it qualifies then it gets indexed. If it is already // indexed and still qualifies then it gets updated, otherwise it // is deleted from the index. HistoryInfoMap::iterator row_pos = - private_data_->history_info_map_.find(row.id()); + private_data_->history_info_map_.find(row_id); if (row_pos == private_data_->history_info_map_.end()) { // This new row should be indexed if it qualifies. - if (RowQualifiesAsSignificant(row, base::Time())) - IndexRow(row); + URLRow new_row(row); + new_row.set_id(row_id); + if (RowQualifiesAsSignificant(new_row, base::Time())) + IndexRow(new_row); } else if (RowQualifiesAsSignificant(row, base::Time())) { // This indexed row still qualifies and will be re-indexed. // The url won't have changed but the title, visit count, etc. // might have changed. - URLRow& old_row = row_pos->second; - old_row.set_visit_count(row.visit_count()); - old_row.set_typed_count(row.typed_count()); - old_row.set_last_visit(row.last_visit()); + URLRow& updated_row = row_pos->second; + updated_row.set_visit_count(row.visit_count()); + updated_row.set_typed_count(row.typed_count()); + updated_row.set_last_visit(row.last_visit()); // While the URL is guaranteed to remain stable, the title may have changed. // If so, then we need to update the index with the changed words. - if (old_row.title() != row.title()) { + if (updated_row.title() != row.title()) { // Clear all words associated with this row and re-index both the // URL and title. - RemoveRowWordsFromIndex(row); - old_row.set_title(row.title()); - AddRowWordsToIndex(old_row); + RemoveRowWordsFromIndex(updated_row); + updated_row.set_title(row.title()); + AddRowWordsToIndex(updated_row); } } else { // This indexed row no longer qualifies and will be de-indexed by // clearing all words associated with this row. - RemoveRowFromIndex(row); + URLRow& removed_row = row_pos->second; + RemoveRowFromIndex(removed_row); } // This invalidates the cache. search_term_cache_.clear(); } -void InMemoryURLIndex::DeleteURL(const URLRow& row) { - RemoveRowFromIndex(row); - search_term_cache_.clear(); // Invalidate the word cache. +void InMemoryURLIndex::DeleteURL(URLID row_id) { + // Note that this does not remove any reference to this row from the + // word_id_history_map_. That map will continue to contain (and return) + // hits against this row until that map is rebuilt, but since the + // history_info_map_ no longer references the row no erroneous results + // will propagate to the user. + private_data_->history_info_map_.erase(row_id); + // This invalidates the word cache. + search_term_cache_.clear(); } // Searching |