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