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

Unified Diff: chrome/browser/history/in_memory_url_index.cc

Issue 963823003: Move InMemoryURLIndex into chrome/browser/autocomplete (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@shortcut-database
Patch Set: Fixing win_chromium_x64_rel_ng build Created 5 years, 9 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 side-by-side diff with in-line comments
Download patch
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
« no previous file with comments | « chrome/browser/history/in_memory_url_index.h ('k') | chrome/browser/history/in_memory_url_index_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698