| Index: chrome/browser/history/in_memory_url_index.cc
|
| diff --git a/chrome/browser/history/in_memory_url_index.cc b/chrome/browser/history/in_memory_url_index.cc
|
| deleted file mode 100644
|
| index e3c2a91af67c1f497e2a45b0b10be56ae7033397..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/history/in_memory_url_index.cc
|
| +++ /dev/null
|
| @@ -1,333 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/browser/history/in_memory_url_index.h"
|
| -
|
| -#include "base/files/file_util.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "base/trace_event/trace_event.h"
|
| -#include "chrome/browser/history/history_service.h"
|
| -#include "chrome/browser/history/url_index_private_data.h"
|
| -#include "chrome/common/url_constants.h"
|
| -#include "components/history/core/browser/url_database.h"
|
| -#include "content/public/browser/browser_thread.h"
|
| -
|
| -using in_memory_url_index::InMemoryURLIndexCacheItem;
|
| -
|
| -namespace history {
|
| -
|
| -// Called by DoSaveToCacheFile to delete any old cache file at |path| when
|
| -// there is no private data to save. Runs on the FILE thread.
|
| -void DeleteCacheFile(const base::FilePath& path) {
|
| - DCHECK(!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
|
| - base::DeleteFile(path, false);
|
| -}
|
| -
|
| -// Initializes a whitelist of URL schemes.
|
| -void InitializeSchemeWhitelist(std::set<std::string>* whitelist) {
|
| - DCHECK(whitelist);
|
| - if (!whitelist->empty())
|
| - return; // Nothing to do, already initialized.
|
| - whitelist->insert(std::string(url::kAboutScheme));
|
| - whitelist->insert(std::string(content::kChromeUIScheme));
|
| - whitelist->insert(std::string(url::kFileScheme));
|
| - whitelist->insert(std::string(url::kFtpScheme));
|
| - whitelist->insert(std::string(url::kHttpScheme));
|
| - whitelist->insert(std::string(url::kHttpsScheme));
|
| - whitelist->insert(std::string(url::kMailToScheme));
|
| -}
|
| -
|
| -// Restore/SaveCacheObserver ---------------------------------------------------
|
| -
|
| -InMemoryURLIndex::RestoreCacheObserver::~RestoreCacheObserver() {}
|
| -
|
| -InMemoryURLIndex::SaveCacheObserver::~SaveCacheObserver() {}
|
| -
|
| -// RebuildPrivateDataFromHistoryDBTask -----------------------------------------
|
| -
|
| -InMemoryURLIndex::RebuildPrivateDataFromHistoryDBTask::
|
| - RebuildPrivateDataFromHistoryDBTask(
|
| - InMemoryURLIndex* index,
|
| - const std::string& languages,
|
| - const std::set<std::string>& scheme_whitelist)
|
| - : index_(index),
|
| - languages_(languages),
|
| - scheme_whitelist_(scheme_whitelist),
|
| - succeeded_(false) {
|
| -}
|
| -
|
| -bool InMemoryURLIndex::RebuildPrivateDataFromHistoryDBTask::RunOnDBThread(
|
| - HistoryBackend* backend,
|
| - HistoryDatabase* db) {
|
| - data_ = URLIndexPrivateData::RebuildFromHistory(db, languages_,
|
| - scheme_whitelist_);
|
| - succeeded_ = data_.get() && !data_->Empty();
|
| - if (!succeeded_ && data_.get())
|
| - data_->Clear();
|
| - return true;
|
| -}
|
| -
|
| -void InMemoryURLIndex::RebuildPrivateDataFromHistoryDBTask::
|
| - DoneRunOnMainThread() {
|
| - index_->DoneRebuidingPrivateDataFromHistoryDB(succeeded_, data_);
|
| -}
|
| -
|
| -InMemoryURLIndex::RebuildPrivateDataFromHistoryDBTask::
|
| - ~RebuildPrivateDataFromHistoryDBTask() {
|
| -}
|
| -
|
| -// InMemoryURLIndex ------------------------------------------------------------
|
| -
|
| -InMemoryURLIndex::InMemoryURLIndex(HistoryService* history_service,
|
| - const base::FilePath& history_dir,
|
| - const std::string& languages)
|
| - : history_service_(history_service),
|
| - history_dir_(history_dir),
|
| - languages_(languages),
|
| - private_data_(new URLIndexPrivateData),
|
| - restore_cache_observer_(NULL),
|
| - save_cache_observer_(NULL),
|
| - shutdown_(false),
|
| - restored_(false),
|
| - needs_to_be_cached_(false),
|
| - listen_to_history_service_loaded_(false) {
|
| - InitializeSchemeWhitelist(&scheme_whitelist_);
|
| - // TODO(mrossetti): Register for language change notifications.
|
| - if (history_service_)
|
| - history_service_->AddObserver(this);
|
| -}
|
| -
|
| -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() || !needs_to_be_cached_);
|
| - DCHECK(!history_service_);
|
| - DCHECK(shutdown_);
|
| -}
|
| -
|
| -void InMemoryURLIndex::Init() {
|
| - PostRestoreFromCacheFileTask();
|
| -}
|
| -
|
| -void InMemoryURLIndex::ShutDown() {
|
| - if (history_service_) {
|
| - history_service_->RemoveObserver(this);
|
| - history_service_ = nullptr;
|
| - }
|
| - cache_reader_tracker_.TryCancelAll();
|
| - shutdown_ = true;
|
| - base::FilePath path;
|
| - if (!GetCacheFilePath(&path))
|
| - return;
|
| - private_data_tracker_.TryCancelAll();
|
| - URLIndexPrivateData::WritePrivateDataToCacheFileTask(private_data_, path);
|
| - needs_to_be_cached_ = false;
|
| -}
|
| -
|
| -void InMemoryURLIndex::ClearPrivateData() {
|
| - private_data_->Clear();
|
| -}
|
| -
|
| -bool InMemoryURLIndex::GetCacheFilePath(base::FilePath* file_path) {
|
| - if (history_dir_.empty())
|
| - return false;
|
| - *file_path = history_dir_.Append(FILE_PATH_LITERAL("History Provider Cache"));
|
| - return true;
|
| -}
|
| -
|
| -// Querying --------------------------------------------------------------------
|
| -
|
| -ScoredHistoryMatches InMemoryURLIndex::HistoryItemsForTerms(
|
| - const base::string16& term_string,
|
| - size_t cursor_position,
|
| - size_t max_matches,
|
| - const ScoredHistoryMatch::Builder& builder) {
|
| - return private_data_->HistoryItemsForTerms(term_string, cursor_position,
|
| - max_matches, languages_, builder);
|
| -}
|
| -
|
| -// Updating --------------------------------------------------------------------
|
| -
|
| -void InMemoryURLIndex::DeleteURL(const GURL& url) {
|
| - private_data_->DeleteURL(url);
|
| -}
|
| -
|
| -void InMemoryURLIndex::OnURLVisited(HistoryService* history_service,
|
| - ui::PageTransition transition,
|
| - const URLRow& row,
|
| - const RedirectList& redirects,
|
| - base::Time visit_time) {
|
| - DCHECK_EQ(history_service_, history_service);
|
| - needs_to_be_cached_ |= private_data_->UpdateURL(history_service_,
|
| - row,
|
| - languages_,
|
| - scheme_whitelist_,
|
| - &private_data_tracker_);
|
| -}
|
| -
|
| -void InMemoryURLIndex::OnURLsModified(HistoryService* history_service,
|
| - const URLRows& changed_urls) {
|
| - DCHECK_EQ(history_service_, history_service);
|
| - for (const auto& row : changed_urls) {
|
| - needs_to_be_cached_ |= private_data_->UpdateURL(history_service_,
|
| - row,
|
| - languages_,
|
| - scheme_whitelist_,
|
| - &private_data_tracker_);
|
| - }
|
| -}
|
| -
|
| -void InMemoryURLIndex::OnURLsDeleted(HistoryService* history_service,
|
| - bool all_history,
|
| - bool expired,
|
| - const URLRows& deleted_rows,
|
| - const std::set<GURL>& favicon_urls) {
|
| - if (all_history) {
|
| - ClearPrivateData();
|
| - needs_to_be_cached_ = true;
|
| - } else {
|
| - for (const auto& row : deleted_rows)
|
| - needs_to_be_cached_ |= private_data_->DeleteURL(row.url());
|
| - }
|
| - // If we made changes, destroy the previous cache. Otherwise, if we go
|
| - // through an unclean shutdown (and therefore fail to write a new cache file),
|
| - // when Chrome restarts and we restore from the previous cache, we'll end up
|
| - // searching over URLs that may be deleted. This would be wrong, and
|
| - // surprising to the user who bothered to delete some URLs from his/her
|
| - // history. In this situation, deleting the cache is a better solution than
|
| - // writing a new cache (after deleting the URLs from the in-memory structure)
|
| - // because deleting the cache forces it to be rebuilt from history upon
|
| - // startup. If we instead write a new, updated cache then at the time of next
|
| - // startup (after an unclean shutdown) we will not rebuild the in-memory data
|
| - // structures from history but rather use the cache. This solution is
|
| - // mediocre because this cache may not have the most-recently-visited URLs
|
| - // in it (URLs visited after user deleted some URLs from history), which
|
| - // would be odd and confusing. It's better to force a rebuild.
|
| - base::FilePath path;
|
| - if (needs_to_be_cached_ && GetCacheFilePath(&path)) {
|
| - content::BrowserThread::PostBlockingPoolTask(
|
| - FROM_HERE, base::Bind(DeleteCacheFile, path));
|
| - }
|
| -}
|
| -
|
| -void InMemoryURLIndex::OnHistoryServiceLoaded(HistoryService* history_service) {
|
| - if (listen_to_history_service_loaded_)
|
| - ScheduleRebuildFromHistory();
|
| - listen_to_history_service_loaded_ = false;
|
| -}
|
| -
|
| -// Restoring from Cache --------------------------------------------------------
|
| -
|
| -void InMemoryURLIndex::PostRestoreFromCacheFileTask() {
|
| - DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
|
| - TRACE_EVENT0("browser", "InMemoryURLIndex::PostRestoreFromCacheFileTask");
|
| -
|
| - base::FilePath path;
|
| - if (!GetCacheFilePath(&path) || shutdown_) {
|
| - restored_ = true;
|
| - if (restore_cache_observer_)
|
| - restore_cache_observer_->OnCacheRestoreFinished(false);
|
| - return;
|
| - }
|
| -
|
| - content::BrowserThread::PostTaskAndReplyWithResult
|
| - <scoped_refptr<URLIndexPrivateData> >(
|
| - content::BrowserThread::FILE, FROM_HERE,
|
| - base::Bind(&URLIndexPrivateData::RestoreFromFile, path, languages_),
|
| - base::Bind(&InMemoryURLIndex::OnCacheLoadDone, AsWeakPtr()));
|
| -}
|
| -
|
| -void InMemoryURLIndex::OnCacheLoadDone(
|
| - scoped_refptr<URLIndexPrivateData> private_data) {
|
| - if (private_data.get() && !private_data->Empty()) {
|
| - private_data_tracker_.TryCancelAll();
|
| - private_data_ = private_data;
|
| - restored_ = true;
|
| - if (restore_cache_observer_)
|
| - restore_cache_observer_->OnCacheRestoreFinished(true);
|
| - } else if (history_service_) {
|
| - // When unable to restore from the cache file delete the cache file, if
|
| - // it exists, and then rebuild from the history database if it's available,
|
| - // otherwise wait until the history database loaded and then rebuild.
|
| - base::FilePath path;
|
| - if (!GetCacheFilePath(&path) || shutdown_)
|
| - return;
|
| - content::BrowserThread::PostBlockingPoolTask(
|
| - FROM_HERE, base::Bind(DeleteCacheFile, path));
|
| - if (history_service_->backend_loaded()) {
|
| - ScheduleRebuildFromHistory();
|
| - } else {
|
| - listen_to_history_service_loaded_ = true;
|
| - }
|
| - }
|
| -}
|
| -
|
| -// Restoring from the History DB -----------------------------------------------
|
| -
|
| -void InMemoryURLIndex::ScheduleRebuildFromHistory() {
|
| - DCHECK(history_service_);
|
| - history_service_->ScheduleDBTask(
|
| - scoped_ptr<history::HistoryDBTask>(
|
| - new InMemoryURLIndex::RebuildPrivateDataFromHistoryDBTask(
|
| - this, languages_, scheme_whitelist_)),
|
| - &cache_reader_tracker_);
|
| -}
|
| -
|
| -void InMemoryURLIndex::DoneRebuidingPrivateDataFromHistoryDB(
|
| - bool succeeded,
|
| - scoped_refptr<URLIndexPrivateData> private_data) {
|
| - DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
|
| - if (succeeded) {
|
| - private_data_tracker_.TryCancelAll();
|
| - private_data_ = private_data;
|
| - PostSaveToCacheFileTask(); // Cache the newly rebuilt index.
|
| - } else {
|
| - private_data_->Clear(); // Dump the old private data.
|
| - // There is no need to do anything with the cache file as it was deleted
|
| - // when the rebuild from the history operation was kicked off.
|
| - }
|
| - restored_ = true;
|
| - if (restore_cache_observer_)
|
| - restore_cache_observer_->OnCacheRestoreFinished(succeeded);
|
| -}
|
| -
|
| -void InMemoryURLIndex::RebuildFromHistory(HistoryDatabase* history_db) {
|
| - private_data_tracker_.TryCancelAll();
|
| - private_data_ = URLIndexPrivateData::RebuildFromHistory(history_db,
|
| - languages_,
|
| - scheme_whitelist_);
|
| -}
|
| -
|
| -// Saving to Cache -------------------------------------------------------------
|
| -
|
| -void InMemoryURLIndex::PostSaveToCacheFileTask() {
|
| - base::FilePath path;
|
| - if (!GetCacheFilePath(&path))
|
| - return;
|
| - // If there is anything in our private data then make a copy of it and tell
|
| - // it to save itself to a file.
|
| - if (private_data_.get() && !private_data_->Empty()) {
|
| - // Note that ownership of the copy of our private data is passed to the
|
| - // completion closure below.
|
| - scoped_refptr<URLIndexPrivateData> private_data_copy =
|
| - private_data_->Duplicate();
|
| - content::BrowserThread::PostTaskAndReplyWithResult<bool>(
|
| - content::BrowserThread::FILE, FROM_HERE,
|
| - base::Bind(&URLIndexPrivateData::WritePrivateDataToCacheFileTask,
|
| - private_data_copy, path),
|
| - base::Bind(&InMemoryURLIndex::OnCacheSaveDone, AsWeakPtr()));
|
| - } else {
|
| - // If there is no data in our index then delete any existing cache file.
|
| - content::BrowserThread::PostBlockingPoolTask(
|
| - FROM_HERE,
|
| - base::Bind(DeleteCacheFile, path));
|
| - }
|
| -}
|
| -
|
| -void InMemoryURLIndex::OnCacheSaveDone(bool succeeded) {
|
| - if (save_cache_observer_)
|
| - save_cache_observer_->OnCacheSaveFinished(succeeded);
|
| -}
|
| -
|
| -} // namespace history
|
|
|