1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_HISTORY_HISTORY_BACKEND_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_HISTORY_HISTORY_BACKEND_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include <string>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <utility>
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "app/sql/init_status.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_path.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/gtest_prod_util.h"
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/history/archived_database.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/history/expire_history_backend.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/history/history_database.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/history/history_marshaling.h"
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/history/history_types.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/history/text_database_manager.h"
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/history/thumbnail_database.h"
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/history/visit_tracker.h"
243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/search_engines/template_url_id.h"
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/mru_cache.h"
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BookmarkService;
283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickstruct DownloadCreateInfo;
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TestingProfile;
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct ThumbnailScore;
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace history {
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass CommitLaterTask;
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass HistoryPublisher;
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// *See the .cc file for more information on the design.*
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Internal history implementation which does most of the work of the history
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// system. This runs on a background thread (to not block the browser when we
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// do expensive operations) and is NOT threadsafe, so it must only be called
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// from message handlers on the background thread. Invoking on another thread
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// requires threadsafe refcounting.
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Most functions here are just the implementations of the corresponding
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// functions in the history service. These functions are not documented
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// here, see the history service for behavior.
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass HistoryBackend : public base::RefCountedThreadSafe<HistoryBackend>,
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       public BroadcastNotificationDelegate {
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Interface implemented by the owner of the HistoryBackend object. Normally,
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the history service implements this to send stuff back to the main thread.
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The unit tests can provide a different implementation if they don't have
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // a history service object.
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class Delegate {
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   public:
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual ~Delegate() {}
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Called when the database cannot be read correctly for some reason.
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    virtual void NotifyProfileError(sql::InitStatus init_status) = 0;
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Sets the in-memory history backend. The in-memory backend is created by
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // the main backend. For non-unit tests, this happens on the background
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // thread. It is to be used on the main thread, so this would transfer
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // it to the history service. Unit tests can override this behavior.
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    //
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // This function is NOT guaranteed to be called. If there is an error,
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // there may be no in-memory database.
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    //
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Ownership of the backend pointer is transferred to this function.
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual void SetInMemoryBackend(InMemoryHistoryBackend* backend) = 0;
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Broadcasts the specified notification to the notification service.
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // This is implemented here because notifications must only be sent from
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // the main thread.
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    //
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Ownership of the HistoryDetails is transferred to this function.
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual void BroadcastNotifications(NotificationType type,
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                        HistoryDetails* details) = 0;
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Invoked when the backend has finished loading the db.
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual void DBLoaded() = 0;
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Tell TopSites to start reading thumbnails from the ThumbnailsDB.
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual void StartTopSitesMigration() = 0;
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Init must be called to complete object creation. This object can be
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // constructed on any thread, but all other functions including Init() must
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // be called on the history thread.
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |history_dir| is the directory where the history files will be placed.
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // See the definition of BroadcastNotificationsCallback above. This function
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // takes ownership of the callback pointer.
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |bookmark_service| is used to determine bookmarked URLs when deleting and
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // may be NULL.
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This constructor is fast and does no I/O, so can be called at any time.
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  HistoryBackend(const FilePath& history_dir,
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 Delegate* delegate,
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 BookmarkService* bookmark_service);
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Must be called after creation but before any objects are created. If this
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // fails, all other functions will fail as well. (Since this runs on another
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // thread, we don't bother returning failure.)
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
108731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // |languages| gives a list of language encodings with which the history
109731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // URLs and omnibox searches are interpreted.
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |force_fail| can be set during unittests to unconditionally fail to init.
111731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void Init(const std::string& languages, bool force_fail);
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Notification that the history system is shutting down. This will break
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the refs owned by the delegate and any pending transaction so it will
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // actually be deleted.
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Closing();
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // See NotifyRenderProcessHostDestruction.
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void NotifyRenderProcessHostDestruction(const void* host);
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Navigation ----------------------------------------------------------------
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void AddPage(scoped_refptr<HistoryAddPageArgs> request);
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SetPageTitle(const GURL& url, const string16& title);
12521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  void AddPageNoVisitForBookmark(const GURL& url);
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Indexing ------------------------------------------------------------------
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetPageContents(const GURL& url, const string16& contents);
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Querying ------------------------------------------------------------------
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // ScheduleAutocomplete() never frees |provider| (which is globally live).
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // It passes |params| on to the autocomplete system which will eventually
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // free it.
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ScheduleAutocomplete(HistoryURLProvider* provider,
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            HistoryURLProviderParams* params);
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void IterateURLs(HistoryService::URLEnumerator* enumerator);
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void QueryURL(scoped_refptr<QueryURLRequest> request,
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                const GURL& url,
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                bool want_visits);
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void QueryHistory(scoped_refptr<QueryHistoryRequest> request,
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    const string16& text_query,
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    const QueryOptions& options);
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void QueryRedirectsFrom(scoped_refptr<QueryRedirectsRequest> request,
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          const GURL& url);
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void QueryRedirectsTo(scoped_refptr<QueryRedirectsRequest> request,
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        const GURL& url);
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void GetVisitCountToHost(scoped_refptr<GetVisitCountToHostRequest> request,
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           const GURL& url);
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(Nik): remove. Use QueryMostVisitedURLs instead.
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void QueryTopURLsAndRedirects(
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      scoped_refptr<QueryTopURLsAndRedirectsRequest> request,
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      int result_count);
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Request the |result_count| most visited URLs and the chain of
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // redirects leading to each of these URLs. |days_back| is the
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // number of days of history to use. Used by TopSites.
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void QueryMostVisitedURLs(
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      scoped_refptr<QueryMostVisitedURLsRequest> request,
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      int result_count,
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      int days_back);
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
167513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // QueryMostVisitedURLs without the request.
168513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void QueryMostVisitedURLsImpl(int result_count,
169513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                int days_back,
170513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                MostVisitedURLList* result);
171513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Computes the most recent URL(s) that the given canonical URL has
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // redirected to and returns true on success. There may be more than one
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // redirect in a row, so this function will fill the given array with the
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // entire chain. If there are no redirects for the most recent visit of the
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // URL, or the URL is not in history, returns false.
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Backend for QueryRedirectsFrom.
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool GetMostRecentRedirectsFrom(const GURL& url,
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  history::RedirectList* redirects);
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Similar to above function except computes a chain of redirects to the
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // given URL. Stores the most recent list of redirects ending at |url| in the
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // given RedirectList. For example, if we have the redirect list A -> B -> C,
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // then calling this function with url=C would fill redirects with {B, A}.
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool GetMostRecentRedirectsTo(const GURL& url,
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                      history::RedirectList* redirects);
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Thumbnails ----------------------------------------------------------------
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetPageThumbnail(const GURL& url,
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        const SkBitmap& thumbnail,
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        const ThumbnailScore& score);
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Retrieves a thumbnail, passing it across thread boundaries
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // via. the included callback.
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void GetPageThumbnail(scoped_refptr<GetPageThumbnailRequest> request,
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        const GURL& page_url);
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Backend implementation of GetPageThumbnail. Unlike
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // GetPageThumbnail(), this method has way to transport data across
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // thread boundaries.
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Exposed for testing reasons.
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void GetPageThumbnailDirectly(
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const GURL& page_url,
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      scoped_refptr<RefCountedBytes>* data);
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void MigrateThumbnailsDatabase();
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Favicon -------------------------------------------------------------------
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void GetFavicon(scoped_refptr<GetFaviconRequest> request,
214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                  const GURL& icon_url,
215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                  int icon_types);
216ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void GetFaviconForURL(scoped_refptr<GetFaviconRequest> request,
218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        const GURL& page_url,
219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        int icon_types);
220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SetFavicon(const GURL& page_url,
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  const GURL& icon_url,
223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                  scoped_refptr<RefCountedMemory> data,
224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                  IconType icon_type);
225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void UpdateFaviconMappingAndFetch(scoped_refptr<GetFaviconRequest> request,
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    const GURL& page_url,
228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                    const GURL& icon_url,
229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                    IconType icon_type);
230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SetFaviconOutOfDateForPage(const GURL& page_url);
232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetImportedFavicons(
234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::vector<ImportedFaviconUsage>& favicon_usage);
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Downloads -----------------------------------------------------------------
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void QueryDownloads(scoped_refptr<DownloadQueryRequest> request);
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void CleanUpInProgressEntries();
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void UpdateDownload(int64 received_bytes, int32 state, int64 db_handle);
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void UpdateDownloadPath(const FilePath& path, int64 db_handle);
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void CreateDownload(scoped_refptr<DownloadCreateRequest> request,
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                      const DownloadCreateInfo& info);
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void RemoveDownload(int64 db_handle);
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void RemoveDownloadsBetween(const base::Time remove_begin,
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              const base::Time remove_end);
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void RemoveDownloads(const base::Time remove_end);
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Segment usage -------------------------------------------------------------
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void QuerySegmentUsage(scoped_refptr<QuerySegmentUsageRequest> request,
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         const base::Time from_time,
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         int max_result_count);
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void DeleteOldSegmentData();
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetSegmentPresentationIndex(SegmentID segment_id, int index);
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Keyword search terms ------------------------------------------------------
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetKeywordSearchTermsForURL(const GURL& url,
2603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                   TemplateURLID keyword_id,
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   const string16& term);
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void DeleteAllSearchTermsForKeyword(TemplateURLID keyword_id);
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void GetMostRecentKeywordSearchTerms(
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      scoped_refptr<GetMostRecentKeywordSearchTermsRequest> request,
2673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      TemplateURLID keyword_id,
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const string16& prefix,
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      int max_count);
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Generic operations --------------------------------------------------------
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ProcessDBTask(scoped_refptr<HistoryDBTaskRequest> request);
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool GetAllTypedURLs(std::vector<history::URLRow>* urls);
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool GetVisitsForURL(URLID id, VisitVector* visits);
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool UpdateURL(URLID id, const history::URLRow& url);
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // While adding visits in batch, the source needs to be provided.
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool AddVisits(const GURL& url,
2833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                         const std::vector<base::Time>& visits,
2843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                         VisitSource visit_source);
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool RemoveVisits(const VisitVector& visits);
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool GetURL(const GURL& url, history::URLRow* url_row);
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Deleting ------------------------------------------------------------------
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void DeleteURLs(const std::vector<GURL>& urls);
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void DeleteURL(const GURL& url);
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Calls ExpireHistoryBackend::ExpireHistoryBetween and commits the change.
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ExpireHistoryBetween(scoped_refptr<ExpireHistoryRequest> request,
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            const std::set<GURL>& restrict_urls,
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            base::Time begin_time,
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            base::Time end_time);
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Bookmarks -----------------------------------------------------------------
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Notification that a URL is no longer bookmarked. If there are no visits
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // for the specified url, it is deleted.
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void URLsNoLongerBookmarked(const std::set<GURL>& urls);
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Testing -------------------------------------------------------------------
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the task to run and the message loop to run it on when this object
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // is destroyed. See HistoryService::SetOnBackendDestroyTask for a more
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // complete description.
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetOnBackendDestroyTask(MessageLoop* message_loop, Task* task);
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Adds the given rows to the database if it doesn't exist. A visit will be
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // added for each given URL at the last visit time in the URLRow.
3173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Each visit will have the visit_source type set.
3183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void AddPagesWithDetails(const std::vector<URLRow>& info,
3193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                           VisitSource visit_source);
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(UNIT_TEST)
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  HistoryDatabase* db() const { return db_.get(); }
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExpireHistoryBackend* expire_backend() { return &expirer_; }
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~HistoryBackend();
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class base::RefCountedThreadSafe<HistoryBackend>;
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class CommitLaterTask;  // The commit task needs to call Commit().
333ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  friend class HistoryBackendTest;
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class HistoryTest;  // So the unit tests can poke our innards.
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FRIEND_TEST_ALL_PREFIXES(HistoryBackendTest, DeleteAll);
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FRIEND_TEST_ALL_PREFIXES(HistoryBackendTest, ImportedFaviconsTest);
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FRIEND_TEST_ALL_PREFIXES(HistoryBackendTest, URLsNoLongerBookmarked);
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FRIEND_TEST_ALL_PREFIXES(HistoryBackendTest, StripUsernamePasswordTest);
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FRIEND_TEST_ALL_PREFIXES(HistoryBackendTest, DeleteThumbnailsDatabaseTest);
3403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FRIEND_TEST_ALL_PREFIXES(HistoryBackendTest, AddPageVisitSource);
3413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FRIEND_TEST_ALL_PREFIXES(HistoryBackendTest, AddPageArgsSource);
3423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FRIEND_TEST_ALL_PREFIXES(HistoryBackendTest, AddVisitsSource);
3433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FRIEND_TEST_ALL_PREFIXES(HistoryBackendTest, RemoveVisitsSource);
3443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FRIEND_TEST_ALL_PREFIXES(HistoryBackendTest, MigrationVisitSource);
345ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  FRIEND_TEST_ALL_PREFIXES(HistoryBackendTest, MigrationIconMapping);
346ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  FRIEND_TEST_ALL_PREFIXES(HistoryBackendTest, SetFaviconMapping);
347ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  FRIEND_TEST_ALL_PREFIXES(HistoryBackendTest, AddOrUpdateIconMapping);
348ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class ::TestingProfile;
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Computes the name of the specified database on disk.
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath GetThumbnailFileName() const;
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the name of the Favicons database. This is the new name
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // of the Thumbnails database.
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // See ThumbnailDatabase::RenameAndDropThumbnails.
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath GetFaviconsFileName() const;
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath GetArchivedFileName() const;
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class URLQuerier;
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class URLQuerier;
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Does the work of Init.
364731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void InitImpl(const std::string& languages);
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Adds a single visit to the database, updating the URL information such
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // as visit and typed count. The visit ID of the added visit and the URL ID
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // of the associated URL (whether added or not) is returned. Both values will
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // be 0 on failure.
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This does not schedule database commits, it is intended to be used as a
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // subroutine for AddPage only. It also assumes the database is valid.
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::pair<URLID, VisitID> AddPageVisit(const GURL& url,
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                         base::Time time,
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                         VisitID referring_visit,
3763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                         PageTransition::Type transition,
3773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                         VisitSource visit_source);
378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns a redirect chain in |redirects| for the VisitID
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |cur_visit|. |cur_visit| is assumed to be valid. Assumes that
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // this HistoryBackend object has been Init()ed successfully.
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void GetRedirectsFromSpecificVisit(
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      VisitID cur_visit, history::RedirectList* redirects);
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Similar to the above function except returns a redirect list ending
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // at |cur_visit|.
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void GetRedirectsToSpecificVisit(
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      VisitID cur_visit, history::RedirectList* redirects);
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Thumbnail Helpers ---------------------------------------------------------
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // When a simple GetMostRecentRedirectsFrom() fails, this method is
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // called which searches the last N visit sessions instead of just
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the current one. Returns true and puts thumbnail data in |data|
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // if a proper thumbnail was found. Returns false otherwise. Assumes
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // that this HistoryBackend object has been Init()ed successfully.
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool GetThumbnailFromOlderRedirect(
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const GURL& page_url, std::vector<unsigned char>* data);
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Querying ------------------------------------------------------------------
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Backends for QueryHistory. *Basic() handles queries that are not FTS (full
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // text search) queries and can just be given directly to the history DB).
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The FTS version queries the text_database, then merges with the history DB.
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Both functions assume QueryHistory already checked the DB for validity.
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void QueryHistoryBasic(URLDatabase* url_db, VisitDatabase* visit_db,
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         const QueryOptions& options, QueryResults* result);
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void QueryHistoryFTS(const string16& text_query,
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const QueryOptions& options,
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       QueryResults* result);
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Committing ----------------------------------------------------------------
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We always keep a transaction open on the history database so that multiple
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // transactions can be batched. Periodically, these are flushed (use
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // ScheduleCommit). This function does the commit to write any new changes to
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // disk and opens a new transaction. This will be called automatically by
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // ScheduleCommit, or it can be called explicitly if a caller really wants
419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // to write something to disk.
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Commit();
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Schedules a commit to happen in the future. We do this so that many
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // operations over a period of time will be batched together. If there is
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // already a commit scheduled for the future, this will do nothing.
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ScheduleCommit();
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Cancels the scheduled commit, if any. If there is no scheduled commit,
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // does nothing.
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void CancelScheduledCommit();
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Segments ------------------------------------------------------------------
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Walks back a segment chain to find the last visit with a non null segment
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // id and returns it. If there is none found, returns 0.
435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SegmentID GetLastSegmentID(VisitID from_visit);
436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Update the segment information. This is called internally when a page is
438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // added. Return the segment id of the segment that has been updated.
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SegmentID UpdateSegments(const GURL& url,
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           VisitID from_visit,
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           VisitID visit_id,
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           PageTransition::Type transition_type,
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           const base::Time ts);
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Favicons ------------------------------------------------------------------
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
447ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Used by both UpdateFaviconMappingAndFetch and GetFavicon.
448ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // If page_url is non-null and SetFavicon has previously been invoked for
449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // icon_url the favicon url for page_url (and all redirects) is set to
450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // icon_url.
451ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Only a single type can be given in icon_type when page_url is specified.
452ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void UpdateFaviconMappingAndFetchImpl(
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const GURL* page_url,
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const GURL& icon_url,
455ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      scoped_refptr<GetFaviconRequest> request,
456ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      int icon_type);
457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the favicon url id for page_url to id. This will also broadcast
459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // notifications as necessary.
460ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SetFaviconMapping(const GURL& page_url,
461ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                         FaviconID id,
462ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                         IconType icon_type);
463ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
464ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Updates the FaviconID associated with the url of a page. If there is an
465ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // existing mapping between |page_url| and |id| this does nothing and returns
466ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // false. If the mapping needs to be added or updated, true is returned. If
467ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // there is an existing mapping but it does not map to |id|, then the |id| of
468ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // the replaced FaviconID is set in |replaced_icon_id|.
469ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool AddOrUpdateIconMapping(const GURL& page_url,
470ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                              FaviconID id,
471ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                              IconType icon_type,
472ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                              FaviconID* replaced_icon_id);
473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Generic stuff -------------------------------------------------------------
475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Processes the next scheduled HistoryDBTask, scheduling this method
477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // to be invoked again if there are more tasks that need to run.
478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ProcessDBTaskImpl();
479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Release all tasks in history_db_tasks_ and clears it.
481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ReleaseDBTasks();
482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Schedules a broadcast of the given notification on the main thread. The
484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // details argument will have ownership taken by this function (it will be
485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // sent to the main thread and deleted there).
48621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void BroadcastNotifications(NotificationType type,
48721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                      HistoryDetails* details_deleted);
488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Deleting all history ------------------------------------------------------
490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Deletes all history. This is a special case of deleting that is separated
492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // from our normal dependency-following method for performance reasons. The
493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // logic lives here instead of ExpireHistoryBackend since it will cause
494c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // re-initialization of some databases such as Thumbnails or Archived that
495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // could fail. When these databases are not valid, our pointers must be NULL,
496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // so we need to handle this type of operation to keep the pointers in sync.
497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void DeleteAllHistory();
498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Given a vector of all URLs that we will keep, removes all thumbnails
500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // referenced by any URL, and also all favicons that aren't used by those
501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // URLs. The favicon IDs will change, so this will update the url rows in the
502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // vector to reference the new IDs.
503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool ClearAllThumbnailHistory(std::vector<URLRow>* kept_urls);
504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Deletes all information in the history database, except for the supplied
506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // set of URLs in the URL table (these should correspond to the bookmarked
507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // URLs).
508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The IDs of the URLs may change.
510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool ClearAllMainHistory(const std::vector<URLRow>& kept_urls);
511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the BookmarkService, blocking until it is loaded. This may return
513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NULL during testing.
514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BookmarkService* GetBookmarkService();
515c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Data ----------------------------------------------------------------------
517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
518c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Delegate. See the class definition above for more information. This will
519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // be NULL before Init is called and after Cleanup, but is guaranteed
520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // non-NULL in between.
521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<Delegate> delegate_;
522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Directory where database files will be stored.
524c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath history_dir_;
525c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The history/thumbnail databases. Either MAY BE NULL if the database could
527c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // not be opened, all users must first check for NULL and return immediately
528c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // if it is. The thumbnail DB may be NULL when the history one isn't, but not
529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // vice-versa.
530c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<HistoryDatabase> db_;
531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<ThumbnailDatabase> thumbnail_db_;
532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Stores old history in a larger, slower database.
534c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<ArchivedDatabase> archived_db_;
535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
536c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Full text database manager, possibly NULL if the database could not be
537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // created.
538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<TextDatabaseManager> text_database_;
539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Manages expiration between the various databases.
541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExpireHistoryBackend expirer_;
542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // A commit has been scheduled to occur sometime in the future. We can check
544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // non-null-ness to see if there is a commit scheduled in the future, and we
545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // can use the pointer to cancel the scheduled commit. There can be only one
546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // scheduled commit at a time (see ScheduleCommit).
547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<CommitLaterTask> scheduled_commit_;
548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Maps recent redirect destination pages to the chain of redirects that
550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // brought us to there. Pages that did not have redirects or were not the
551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // final redirect in a chain will not be in this list, as well as pages that
552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // redirected "too long" ago (as determined by ExpireOldRedirects above).
553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // It is used to set titles & favicons for redirects to that of the
554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // destination.
555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // As with AddPage, the last item in the redirect chain will be the
557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // destination of the redirect (i.e., the key into recent_redirects_);
558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef MRUCache<GURL, history::RedirectList> RedirectCache;
559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RedirectCache recent_redirects_;
560c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
561c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Timestamp of the last page addition request. We use this to detect when
562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // multiple additions are requested at the same time (within the resolution
563c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // of the timer), so we can try to ensure they're unique when they're added
564c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // to the database by using the last_recorded_time_ (q.v.). We still can't
565c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // enforce or guarantee uniqueness, since the user might set his clock back.
566c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::Time last_requested_time_;
567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Timestamp of the last page addition, as it was recorded in the database.
569c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If two or more requests come in at the same time, we increment that time
570c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // by 1 us between them so it's more likely to be unique in the database.
571c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This keeps track of that higher-resolution timestamp.
572c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::Time last_recorded_time_;
573c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
574c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Timestamp of the first entry in our database.
575c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::Time first_recorded_time_;
576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // When non-NULL, this is the task that should be invoked on
578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop* backend_destroy_message_loop_;
579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Task* backend_destroy_task_;
580c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
581c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Tracks page transition types.
582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  VisitTracker tracker_;
583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // A boolean variable to track whether we have already purged obsolete segment
585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // data.
586c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool segment_queried_;
587c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
588c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // HistoryDBTasks to run. Be sure to AddRef when adding, and Release when
589c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // done.
590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::list<HistoryDBTaskRequest*> db_task_requests_;
591c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
592c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Used to determine if a URL is bookmarked. This is owned by the Profile and
593c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // may be NULL (during testing).
594c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
595c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Use GetBookmarkService to access this, which makes sure the service is
596c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // loaded.
597c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BookmarkService* bookmark_service_;
598c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
599c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Publishes the history to all indexers which are registered to receive
600c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // history data from us. Can be NULL if there are no listeners.
601c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<HistoryPublisher> history_publisher_;
602c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
603c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(HistoryBackend);
604c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
606c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace history
607c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
608c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_HISTORY_HISTORY_BACKEND_H_
609