15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_HISTORY_IN_MEMORY_URL_INDEX_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_HISTORY_IN_MEMORY_URL_INDEX_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <functional> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/task/cancelable_task_tracker.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/history_db_task.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/in_memory_url_index_types.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/scored_history_match.h" 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/history/core/browser/history_types.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sql/connection.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HistoryQuickProviderTest; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Time; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace in_memory_url_index { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InMemoryURLIndexCacheItem; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace history { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace imui = in_memory_url_index; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class HistoryClient; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HistoryDatabase; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLIndexPrivateData; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct URLsDeletedDetails; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct URLsModifiedDetails; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct URLVisitedDetails; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The URL history source. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Holds portions of the URL database in memory in an indexed form. Used to 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// quickly look up matching URLs for a given query string. Used by 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the HistoryURLProvider for inline autocomplete and to provide URL 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// matches to the omnibox. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note about multi-byte codepoints and the data structures in the 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// InMemoryURLIndex class: One will quickly notice that no effort is made to 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// insure that multi-byte character boundaries are detected when indexing the 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// words and characters in the URL history database except when converting 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URL strings to lowercase. Multi-byte-edness makes no difference when 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// indexing or when searching the index as the final filtering of results 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is dependent on the comparison of a string of bytes, not individual 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// characters. While the lookup of those bytes during a search in the 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |char_word_map_| could serve up words in which the individual char16 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// occurs as a portion of a composite character the next filtering step 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// will eliminate such words except in the case where a single character 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is being searched on and which character occurs as the second char16 of a 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// multi-char16 instance. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InMemoryURLIndex : public content::NotificationObserver, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public base::SupportsWeakPtr<InMemoryURLIndex> { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Defines an abstract class which is notified upon completion of restoring 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the index's private data either by reading from the cache file or by 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // rebuilding from the history database. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class RestoreCacheObserver { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~RestoreCacheObserver(); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback that lets the observer know that the restore operation has 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // completed. |succeeded| indicates if the restore was successful. This is 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // called on the UI thread. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnCacheRestoreFinished(bool succeeded) = 0; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Defines an abstract class which is notified upon completion of saving 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the index's private data to the cache file. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class SaveCacheObserver { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~SaveCacheObserver(); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback that lets the observer know that the save succeeded. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is called on the UI thread. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnCacheSaveFinished(bool succeeded) = 0; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |profile|, which may be NULL during unit testing, is used to register for 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // history changes. |history_dir| is a path to the directory containing the 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // history database within the profile wherein the cache and transaction 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // journals will be stored. |languages| gives a list of language encodings by 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which URLs and omnibox searches are broken down into words and characters. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InMemoryURLIndex(Profile* profile, 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& history_dir, 10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& languages, 10546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) HistoryClient* client); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~InMemoryURLIndex(); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Opens and prepares the index of historical URL visits. If the index private 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // data cannot be restored from its cache file then it is rebuilt from the 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // history database. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Init(); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Signals that any outstanding initialization should be canceled and 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // flushes the cache to disk. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ShutDown(); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Scans the history index and returns a vector with all scored, matching 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // history items. This entry point simply forwards the call on to the 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // URLIndexPrivateData class. For a complete description of this function 120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // refer to that class. If |cursor_position| is base::string16::npos, the 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // function doesn't do anything special with the cursor; this is equivalent 122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // to the cursor being at the end. In total, |max_matches| of items will be 123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // returned in the |ScoredHistoryMatches| vector. 124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ScoredHistoryMatches HistoryItemsForTerms(const base::string16& term_string, 125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) size_t cursor_position, 126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) size_t max_matches); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Deletes the index entry, if any, for the given |url|. 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DeleteURL(const GURL& url); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the optional observers for completion of restoral and saving of the 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // index's private data. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_restore_cache_observer( 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RestoreCacheObserver* restore_cache_observer) { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) restore_cache_observer_ = restore_cache_observer; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_save_cache_observer(SaveCacheObserver* save_cache_observer) { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_cache_observer_ = save_cache_observer; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Indicates that the index restoration is complete. 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool restored() const { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return restored_; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ::HistoryQuickProviderTest; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class InMemoryURLIndexTest; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class InMemoryURLIndexCacheTest; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(LimitedInMemoryURLIndexTest, Initialization); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creating one of me without a history path is not allowed (tests excepted). 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InMemoryURLIndex(); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // HistoryDBTask used to rebuild our private data from the history database. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class RebuildPrivateDataFromHistoryDBTask : public HistoryDBTask { 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit RebuildPrivateDataFromHistoryDBTask( 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InMemoryURLIndex* index, 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& languages, 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::set<std::string>& scheme_whitelist); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool RunOnDBThread(HistoryBackend* backend, 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::HistoryDatabase* db) OVERRIDE; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DoneRunOnMainThread() OVERRIDE; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~RebuildPrivateDataFromHistoryDBTask(); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InMemoryURLIndex* index_; // Call back to this index at completion. 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string languages_; // Languages for word-breaking. 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<std::string> scheme_whitelist_; // Schemes to be indexed. 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool succeeded_; // Indicates if the rebuild was successful. 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<URLIndexPrivateData> data_; // The rebuilt private data. 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(RebuildPrivateDataFromHistoryDBTask); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initializes all index data members in preparation for restoring the index 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from the cache or a complete rebuild from the history database. 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ClearPrivateData(); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Constructs a file path for the cache file within the same directory where 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the history database is kept and saves that path to |file_path|. Returns 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // true if |file_path| can be successfully constructed. (This function 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // provided as a hook for unit testing.) 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool GetCacheFilePath(base::FilePath* file_path); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Restores the index's private data from the cache file stored in the 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // profile directory. 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PostRestoreFromCacheFileTask(); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Schedules a history task to rebuild our private data from the history 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // database. 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ScheduleRebuildFromHistory(); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback used by RebuildPrivateDataFromHistoryDBTask to signal completion 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // or rebuilding our private data from the history database. |succeeded| 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will be true if the rebuild was successful. |data| will point to a new 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // instanceof the private data just rebuilt. 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DoneRebuidingPrivateDataFromHistoryDB( 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool succeeded, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<URLIndexPrivateData> private_data); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Rebuilds the history index from the history database in |history_db|. 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used for unit testing only. 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RebuildFromHistory(HistoryDatabase* history_db); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Determines if the private data was successfully reloaded from the cache 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // file or if the private data must be rebuilt from the history database. 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |private_data_ptr|'s data will be NULL if the cache file load failed. If 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // successful, sets the private data and notifies any 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |restore_cache_observer_|. Otherwise, kicks off a rebuild from the history 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // database. 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnCacheLoadDone(scoped_refptr<URLIndexPrivateData> private_data_ptr); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback function that sets the private data from the just-restored-from- 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // file |private_data|. Notifies any |restore_cache_observer_| that the 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // restore has succeeded. 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnCacheRestored(URLIndexPrivateData* private_data); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Posts a task to cache the index private data and write the cache file to 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the profile directory. 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PostSaveToCacheFileTask(); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Saves private_data_ to the given |path|. Runs on the UI thread. 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Provided for unit testing so that a test cache file can be used. 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void DoSaveToCacheFile(const base::FilePath& path); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notifies the observer, if any, of the success of the private data caching. 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |succeeded| is true on a successful save. 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnCacheSaveDone(bool succeeded); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handles notifications of history changes. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int notification_type, 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) OVERRIDE; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notification handlers. 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnURLVisited(const URLVisitedDetails* details); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnURLsModified(const URLsModifiedDetails* details); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnURLsDeleted(const URLsDeletedDetails* details); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the directory wherein the cache file will be maintained. 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For unit test usage only. 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void set_history_dir(const base::FilePath& dir_path) { 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) history_dir_ = dir_path; 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a pointer to our private data. For unit testing only. 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLIndexPrivateData* private_data() { return private_data_.get(); } 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Returns a pointer to our private data cancelable request tracker. For 254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // unit testing only. 255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::CancelableTaskTracker* private_data_tracker() { 256116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return &private_data_tracker_; 257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 258116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the set of whitelisted schemes. For unit testing only. 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::set<std::string>& scheme_whitelist() { return scheme_whitelist_; } 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The profile, may be null when testing. 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile_; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // The HistoryClient; may be NULL when testing. 26646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) HistoryClient* history_client_; 26746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Directory where cache file resides. This is, except when unit testing, 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the same directory in which the profile's history database is found. It 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should never be empty. 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath history_dir_; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Languages used during the word-breaking process during indexing. 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string languages_; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only URLs with a whitelisted scheme are indexed. 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<std::string> scheme_whitelist_; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The index's durable private data. 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<URLIndexPrivateData> private_data_; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Observers to notify upon restoral or save of the private data cache. 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RestoreCacheObserver* restore_cache_observer_; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SaveCacheObserver* save_cache_observer_; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 286116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::CancelableTaskTracker private_data_tracker_; 287116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::CancelableTaskTracker cache_reader_tracker_; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationRegistrar registrar_; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set to true once the shutdown process has begun. 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool shutdown_; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set to true once the index restoration is complete. 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool restored_; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set to true when changes to the index have been made and the index needs 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to be cached. Set to false when the index has been cached. Used as a 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // temporary safety check to insure that the cache is saved before the 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // index has been destructed. 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool needs_to_be_cached_; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(InMemoryURLIndex); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace history 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_HISTORY_IN_MEMORY_URL_INDEX_H_ 308