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_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_HISTORY_HISTORY_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include <set>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "app/sql/init_status.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/callback.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_path.h"
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h"
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string16.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/task.h"
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/favicon_service.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/history/history_types.h"
223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/search_engines/template_url_id.h"
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/ref_counted_util.h"
24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/cancelable_request.h"
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_observer.h"
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_registrar.h"
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/page_transition_types.h"
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BookmarkService;
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct DownloadCreateInfo;
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass FilePath;
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass GURL;
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass HistoryURLProvider;
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct HistoryURLProviderParams;
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass InMemoryURLDatabase;
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MainPagesRequest;
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass PageUsageData;
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass PageUsageRequest;
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Profile;
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SkBitmap;
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct ThumbnailScore;
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace base {
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Thread;
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Time;
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace browser_sync {
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass HistoryModelWorker;
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TypedUrlDataTypeController;
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace history {
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass InMemoryHistoryBackend;
553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass InMemoryURLIndex;
563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass HistoryAddPageArgs;
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass HistoryBackend;
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass HistoryDatabase;
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct HistoryDetails;
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass HistoryQueryTest;
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass URLDatabase;
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace history
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HistoryDBTask can be used to process arbitrary work on the history backend
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// thread. HistoryDBTask is scheduled using HistoryService::ScheduleDBTask.
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// When HistoryBackend processes the task it invokes RunOnDBThread. Once the
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// task completes and has not been canceled, DoneRunOnMainThread is invoked back
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// on the main thread.
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass HistoryDBTask : public base::RefCountedThreadSafe<HistoryDBTask> {
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Invoked on the database thread. The return value indicates whether the
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // task is done. A return value of true signals the task is done and
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // RunOnDBThread should NOT be invoked again. A return value of false
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // indicates the task is not done, and should be run again after other
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // tasks are given a chance to be processed.
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool RunOnDBThread(history::HistoryBackend* backend,
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             history::HistoryDatabase* db) = 0;
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Invoked on the main thread once RunOnDBThread has returned false. This is
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // only invoked if the request was not canceled and returned true from
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // RunOnDBThread.
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void DoneRunOnMainThread() = 0;
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class base::RefCountedThreadSafe<HistoryDBTask>;
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~HistoryDBTask() {}
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The history service records page titles, and visit times, as well as
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// (eventually) information about autocomplete.
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This service is thread safe. Each request callback is invoked in the
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// thread that made the request.
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass HistoryService : public CancelableRequestProvider,
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       public NotificationObserver,
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       public base::RefCountedThreadSafe<HistoryService> {
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Miscellaneous commonly-used types.
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef std::vector<PageUsageData*> PageUsageDataList;
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // ID (both star_id and folder_id) of the bookmark bar.
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This entry always exists.
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const history::StarID kBookmarkBarID;
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Must call Init after construction.
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit HistoryService(Profile* profile);
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The empty constructor is provided only for testing.
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  HistoryService();
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Initializes the history service, returning true on success. On false, do
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // not call any other functions. The given directory will be used for storing
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the history files. The BookmarkService is used when deleting URLs to
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // test if a URL is bookmarked; it may be NULL during testing.
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool Init(const FilePath& history_dir, BookmarkService* bookmark_service) {
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return Init(history_dir, bookmark_service, false);
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Triggers the backend to load if it hasn't already, and then returns whether
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // it's finished loading.
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool BackendLoaded();
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
124513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Returns true if the backend has finished loading.
125513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool backend_loaded() const { return backend_loaded_; }
126513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Unloads the backend without actually shutting down the history service.
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This can be used to temporarily reduce the browser process' memory
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // footprint.
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void UnloadBackend();
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called on shutdown, this will tell the history backend to complete and
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // will release pointers to it. No other functions should be called once
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // cleanup has happened that may dispatch to the history thread (because it
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // will be NULL).
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // In practice, this will be called by the service manager (BrowserProcess)
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // when it is being destroyed. Because that reference is being destroyed, it
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // should be impossible for anybody else to call the service, even if it is
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // still in memory (pending requests may be holding a reference to us).
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Cleanup();
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // RenderProcessHost pointers are used to scope page IDs (see AddPage). These
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // objects must tell us when they are being destroyed so that we can clear
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // out any cached data associated with that scope.
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The given pointer will not be dereferenced, it is only used for
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // identification purposes, hence it is a void*.
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void NotifyRenderProcessHostDestruction(const void* host);
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Triggers the backend to load if it hasn't already, and then returns the
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // in-memory URL database. The returned pointer MAY BE NULL if the in-memory
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // database has not been loaded yet. This pointer is owned by the history
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // system. Callers should not store or cache this value.
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(brettw) this should return the InMemoryHistoryBackend.
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history::URLDatabase* InMemoryDatabase();
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
159731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Return the quick history index.
1603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  history::InMemoryURLIndex* InMemoryIndex();
1613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Navigation ----------------------------------------------------------------
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Adds the given canonical URL to history with the current time as the visit
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // time. Referrer may be the empty string.
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The supplied render process host is used to scope the given page ID. Page
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // IDs are only unique inside a given render process, so we need that to
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // differentiate them. This pointer should not be dereferenced by the history
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // system. Since render view host pointers may be reused (if one gets deleted
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // and a new one created at the same address), TabContents should notify
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // us when they are being destroyed through NotifyTabContentsDestruction.
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The scope/ids can be NULL if there is no meaningful tracking information
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // that can be performed on the given URL. The 'page_id' should be the ID of
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the current session history entry in the given process.
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // 'redirects' is an array of redirect URLs leading to this page, with the
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // page itself as the last item (so when there is no redirect, it will have
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // one entry). If there are no redirects, this array may also be empty for
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the convenience of callers.
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // 'did_replace_entry' is true when the navigation entry for this page has
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // replaced the existing entry. A non-user initiated redirect causes such
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // replacement.
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // All "Add Page" functions will update the visited link database.
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void AddPage(const GURL& url,
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               const void* id_scope,
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               int32 page_id,
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               const GURL& referrer,
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               PageTransition::Type transition,
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               const history::RedirectList& redirects,
1943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick               history::VisitSource visit_source,
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               bool did_replace_entry);
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // For adding pages to history with a specific time. This is for testing
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // purposes. Call the previous one to use the current time.
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void AddPage(const GURL& url,
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               base::Time time,
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               const void* id_scope,
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               int32 page_id,
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               const GURL& referrer,
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               PageTransition::Type transition,
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               const history::RedirectList& redirects,
2063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick               history::VisitSource visit_source,
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               bool did_replace_entry);
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // For adding pages to history where no tracking information can be done.
2103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void AddPage(const GURL& url, history::VisitSource visit_source) {
2113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    AddPage(url, NULL, 0, GURL(), PageTransition::LINK,
2123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick            history::RedirectList(), visit_source, false);
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // All AddPage variants end up here.
2163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void AddPage(const history::HistoryAddPageArgs& add_page_args);
2173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
21821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Adds an entry for the specified url without creating a visit. This should
21921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // only be used when bookmarking a page, otherwise the row leaks in the
22021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // history db (it never gets cleaned).
22121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  void AddPageNoVisitForBookmark(const GURL& url);
22221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the title for the given page. The page should be in history. If it
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // is not, this operation is ignored. This call will not update the full
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // text index. The last title set when the page is indexed will be the
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // title in the full text index.
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetPageTitle(const GURL& url, const string16& title);
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Indexing ------------------------------------------------------------------
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Notifies history of the body text of the given recently-visited URL.
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If the URL was not visited "recently enough," the history system may
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // discard it.
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetPageContents(const GURL& url, const string16& contents);
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Querying ------------------------------------------------------------------
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Callback class that a client can implement to iterate over URLs. The
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // callbacks WILL BE CALLED ON THE BACKGROUND THREAD! Your implementation
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // should handle this appropriately.
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class URLEnumerator {
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   public:
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual ~URLEnumerator() {}
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Indicates that a URL is available. There will be exactly one call for
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // every URL in history.
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual void OnURL(const GURL& url) = 0;
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Indicates we are done iterating over URLs. Once called, there will be no
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // more callbacks made. This call is guaranteed to occur, even if there are
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // no URLs. If all URLs were iterated, success will be true.
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual void OnComplete(bool success) = 0;
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Enumerate all URLs in history. The given iterator will be owned by the
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // caller, so the caller should ensure it exists until OnComplete is called.
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // You should not generally use this since it will be slow to slurp all URLs
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // in from the database. It is designed for rebuilding the visited link
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // database from history.
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void IterateURLs(URLEnumerator* iterator);
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the information about the requested URL. If the URL is found,
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // success will be true and the information will be in the URLRow parameter.
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // On success, the visits, if requested, will be sorted by date. If they have
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // not been requested, the pointer will be valid, but the vector will be
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // empty.
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If success is false, neither the row nor the vector will be valid.
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef Callback4<Handle,
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    bool,  // Success flag, when false, nothing else is valid.
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    const history::URLRow*,
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    history::VisitVector*>::Type
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      QueryURLCallback;
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Queries the basic information about the URL in the history database. If
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the caller is interested in the visits (each time the URL is visited),
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // set |want_visits| to true. If these are not needed, the function will be
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // faster by setting this to false.
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Handle QueryURL(const GURL& url,
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  bool want_visits,
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  CancelableRequestConsumerBase* consumer,
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  QueryURLCallback* callback);
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Provides the result of a query. See QueryResults in history_types.h.
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The common use will be to use QueryResults.Swap to suck the contents of
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the results out of the passed in parameter and take ownership of them.
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef Callback2<Handle, history::QueryResults*>::Type
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      QueryHistoryCallback;
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Queries all history with the given options (see QueryOptions in
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // history_types.h). If non-empty, the full-text database will be queried with
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the given |text_query|. If empty, all results matching the given options
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // will be returned.
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This isn't totally hooked up yet, this will query the "new" full text
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // database (see SetPageContents) which won't generally be set yet.
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Handle QueryHistory(const string16& text_query,
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                      const history::QueryOptions& options,
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                      CancelableRequestConsumerBase* consumer,
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                      QueryHistoryCallback* callback);
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called when the results of QueryRedirectsFrom are available.
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The given vector will contain a list of all redirects, not counting
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the original page. If A redirects to B, the vector will contain only B,
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // and A will be in 'source_url'.
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If there is no such URL in the database or the most recent visit has no
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // redirect, the vector will be empty. If the history system failed for
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // some reason, success will additionally be false. If the given page
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // has redirected to multiple destinations, this will pick a random one.
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef Callback4<Handle,
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    GURL,  // from_url
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    bool,  // success
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    history::RedirectList*>::Type
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      QueryRedirectsCallback;
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Schedules a query for the most recent redirect coming out of the given
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // URL. See the RedirectQuerySource above, which is guaranteed to be called
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // if the request is not canceled.
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Handle QueryRedirectsFrom(const GURL& from_url,
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            CancelableRequestConsumerBase* consumer,
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            QueryRedirectsCallback* callback);
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Schedules a query to get the most recent redirects ending at the given
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // URL.
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Handle QueryRedirectsTo(const GURL& to_url,
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          CancelableRequestConsumerBase* consumer,
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          QueryRedirectsCallback* callback);
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef Callback4<Handle,
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    bool,        // Were we able to determine the # of visits?
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    int,         // Number of visits.
33372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                    base::Time>::Type  // Time of first visit. Only first bool
33472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                       // is true and int is > 0.
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GetVisitCountToHostCallback;
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Requests the number of visits to all urls on the scheme/host/post
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // identified by url. This is only valid for http and https urls.
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Handle GetVisitCountToHost(const GURL& url,
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             CancelableRequestConsumerBase* consumer,
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             GetVisitCountToHostCallback* callback);
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called when QueryTopURLsAndRedirects completes. The vector contains a list
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // of the top |result_count| URLs.  For each of these URLs, there is an entry
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // in the map containing redirects from the URL.  For example, if we have the
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // redirect chain A -> B -> C and A is a top visited URL, then A will be in
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the vector and "A => {B -> C}" will be in the map.
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef Callback4<Handle,
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    bool,  // Did we get the top urls and redirects?
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    std::vector<GURL>*,  // List of top URLs.
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    history::RedirectMap*>::Type  // Redirects for top URLs.
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      QueryTopURLsAndRedirectsCallback;
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Request the top |result_count| most visited URLs and the chain of redirects
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // leading to each of these URLs.
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(Nik): remove this. Use QueryMostVisitedURLs instead.
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Handle QueryTopURLsAndRedirects(int result_count,
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  CancelableRequestConsumerBase* consumer,
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  QueryTopURLsAndRedirectsCallback* callback);
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef Callback2<Handle, history::MostVisitedURLList>::Type
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    QueryMostVisitedURLsCallback;
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Request the |result_count| most visited URLs and the chain of
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // redirects leading to each of these URLs. |days_back| is the
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // number of days of history to use. Used by TopSites.
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Handle QueryMostVisitedURLs(int result_count, int days_back,
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              CancelableRequestConsumerBase* consumer,
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              QueryMostVisitedURLsCallback* callback);
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Thumbnails ----------------------------------------------------------------
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Implemented by consumers to get thumbnail data. Called when a request for
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the thumbnail data is complete. Once this callback is made, the request
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // will be completed and no other calls will be made for that handle.
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This function will be called even on error conditions or if there is no
378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // thumbnail for that page. In these cases, the data pointer will be NULL.
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef Callback2<Handle, scoped_refptr<RefCountedBytes> >::Type
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ThumbnailDataCallback;
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the thumbnail for a given URL. The URL must be in the history
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // database or the request will be ignored.
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetPageThumbnail(const GURL& url,
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        const SkBitmap& thumbnail,
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        const ThumbnailScore& score);
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Requests a page thumbnail. See ThumbnailDataCallback definition above.
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Handle GetPageThumbnail(const GURL& page_url,
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          CancelableRequestConsumerBase* consumer,
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          ThumbnailDataCallback* callback);
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Database management operations --------------------------------------------
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Delete all the information related to a single url.
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void DeleteURL(const GURL& url);
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Implemented by the caller of ExpireHistoryBetween, and
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // is called when the history service has deleted the history.
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef Callback0::Type ExpireHistoryCallback;
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Removes all visits in the selected time range (including the start time),
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // updating the URLs accordingly. This deletes the associated data, including
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the full text index. This function also deletes the associated favicons,
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // if they are no longer referenced. |callback| runs when the expiration is
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // complete. You may use null Time values to do an unbounded delete in
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // either direction.
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If |restrict_urls| is not empty, only visits to the URLs in this set are
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // removed.
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ExpireHistoryBetween(const std::set<GURL>& restrict_urls,
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            base::Time begin_time, base::Time end_time,
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            CancelableRequestConsumerBase* consumer,
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            ExpireHistoryCallback* callback);
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Downloads -----------------------------------------------------------------
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Implemented by the caller of 'CreateDownload' below, and is called when the
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // history service has created a new entry for a download in the history db.
4194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  typedef Callback2<DownloadCreateInfo, int64>::Type
420513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      DownloadCreateCallback;
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Begins a history request to create a new persistent entry for a download.
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // 'info' contains all the download's creation state, and 'callback' runs
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // when the history service request is complete.
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Handle CreateDownload(const DownloadCreateInfo& info,
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        CancelableRequestConsumerBase* consumer,
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        DownloadCreateCallback* callback);
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Implemented by the caller of 'QueryDownloads' below, and is called when the
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // history service has retrieved a list of all download state. The call
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef Callback1<std::vector<DownloadCreateInfo>*>::Type
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      DownloadQueryCallback;
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Begins a history request to retrieve the state of all downloads in the
435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // history db. 'callback' runs when the history service request is complete,
436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // at which point 'info' contains an array of DownloadCreateInfo, one per
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // download.
438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Handle QueryDownloads(CancelableRequestConsumerBase* consumer,
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        DownloadQueryCallback* callback);
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Begins a request to clean up entries that has been corrupted (because of
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the crash, for example).
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void CleanUpInProgressEntries();
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called to update the history service about the current state of a download.
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This is a 'fire and forget' query, so just pass the relevant state info to
447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the database with no need for a callback.
448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void UpdateDownload(int64 received_bytes, int32 state, int64 db_handle);
449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called to update the history service about the path of a download.
451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This is a 'fire and forget' query.
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void UpdateDownloadPath(const FilePath& path, int64 db_handle);
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Permanently remove a download from the history system. This is a 'fire and
455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // forget' operation.
456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void RemoveDownload(int64 db_handle);
457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Permanently removes all completed download from the history system within
459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the specified range. This function does not delete downloads that are in
460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // progress or in the process of being cancelled. This is a 'fire and forget'
461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // operation. You can pass is_null times to get unbounded time in either or
462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // both directions.
463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void RemoveDownloadsBetween(base::Time remove_begin, base::Time remove_end);
464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Visit Segments ------------------------------------------------------------
466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef Callback2<Handle, std::vector<PageUsageData*>*>::Type
468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      SegmentQueryCallback;
469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Query usage data for all visit segments since the provided time.
471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The request is performed asynchronously and can be cancelled by using the
473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // returned handle.
474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The vector provided to the callback and its contents is owned by the
476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // history system. It will be deeply deleted after the callback is invoked.
477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If you want to preserve any PageUsageData instance, simply remove them
478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // from the vector.
479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The vector contains a list of PageUsageData. Each PageUsageData ID is set
481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // to the segment ID. The URL and all the other information is set to the page
482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // representing the segment.
483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Handle QuerySegmentUsageSince(CancelableRequestConsumerBase* consumer,
484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                const base::Time from_time,
485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                int max_result_count,
486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                SegmentQueryCallback* callback);
487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Set the presentation index for the segment identified by |segment_id|.
489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetSegmentPresentationIndex(int64 segment_id, int index);
490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Keyword search terms -----------------------------------------------------
492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the search terms for the specified url and keyword. url_id gives the
494c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // id of the url, keyword_id the id of the keyword and term the search term.
495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetKeywordSearchTermsForURL(const GURL& url,
4963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                   TemplateURLID keyword_id,
497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   const string16& term);
498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Deletes all search terms for the specified keyword.
5003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void DeleteAllSearchTermsForKeyword(TemplateURLID keyword_id);
501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef Callback2<Handle, std::vector<history::KeywordSearchTermVisit>*>::Type
503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GetMostRecentKeywordSearchTermsCallback;
504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns up to max_count of the most recent search terms starting with the
506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // specified text. The matching is case insensitive. The results are ordered
507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // in descending order up to |max_count| with the most recent search term
508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // first.
509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Handle GetMostRecentKeywordSearchTerms(
5103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      TemplateURLID keyword_id,
511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const string16& prefix,
512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      int max_count,
513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      CancelableRequestConsumerBase* consumer,
514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GetMostRecentKeywordSearchTermsCallback* callback);
515c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Bookmarks -----------------------------------------------------------------
517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
518c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Notification that a URL is no longer bookmarked.
519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void URLsNoLongerBookmarked(const std::set<GURL>& urls);
520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Generic Stuff -------------------------------------------------------------
522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef Callback0::Type HistoryDBTaskCallback;
524c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
525c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Schedules a HistoryDBTask for running on the history backend thread. See
526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // HistoryDBTask for details on what this does.
527c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual Handle ScheduleDBTask(HistoryDBTask* task,
528c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                CancelableRequestConsumerBase* consumer);
529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
530513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Returns true if top sites needs to be migrated out of history into its own
531513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // db.
532513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool needs_top_sites_migration() const { return needs_top_sites_migration_; }
533513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
534c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Testing -------------------------------------------------------------------
535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
536c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Designed for unit tests, this passes the given task on to the history
537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // backend to be called once the history backend has terminated. This allows
538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // callers to know when the history thread is complete and the database files
539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // can be deleted and the next test run. Otherwise, the history thread may
540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // still be running, causing problems in subsequent tests.
541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // There can be only one closing task, so this will override any previously
543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // set task. We will take ownership of the pointer and delete it when done.
544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The task will be run on the calling thread (this function is threadsafe).
545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetOnBackendDestroyTask(Task* task);
546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Used for unit testing and potentially importing to get known information
548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // into the database. This assumes the URL doesn't exist in the database
549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Calling this function many times may be slow because each call will
551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // dispatch to the history thread and will be a separate database
552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // transaction. If this functionality is needed for importing many URLs, a
553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // version that takes an array should probably be added.
554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void AddPageWithDetails(const GURL& url,
555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          const string16& title,
556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          int visit_count,
557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          int typed_count,
558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          base::Time last_visit,
5593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                          bool hidden,
5603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                          history::VisitSource visit_source);
561c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The same as AddPageWithDetails() but takes a vector.
5633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void AddPagesWithDetails(const std::vector<history::URLRow>& info,
5643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                           history::VisitSource visit_source);
565c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
566c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Starts the TopSites migration in the HistoryThread. Called by the
567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // BackendDelegate.
568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void StartTopSitesMigration();
569c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
570c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called by TopSites after the thumbnails were read and it is safe
571c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // to delete the thumbnails DB.
572c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void OnTopSitesReady();
573c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
574c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true if this looks like the type of URL we want to add to the
575c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // history. We filter out some URLs such as JavaScript.
576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static bool CanAddURL(const GURL& url);
577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ~HistoryService();
580c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
581c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // These are not currently used, hopefully we can do something in the future
582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // to ensure that the most important things happen first.
583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  enum SchedulePriority {
584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    PRIORITY_UI,      // The highest priority (must respond to UI events).
585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    PRIORITY_NORMAL,  // Normal stuff like adding a page.
586c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    PRIORITY_LOW,     // Low priority things like indexing or expiration.
587c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
588c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
589c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class BackendDelegate;
591c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class base::RefCountedThreadSafe<HistoryService>;
592c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class BackendDelegate;
593c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class FaviconService;
594c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class history::HistoryBackend;
595c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class history::HistoryQueryTest;
596c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class HistoryOperation;
597c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class HistoryURLProvider;
598c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class HistoryURLProviderTest;
599c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template<typename Info, typename Callback> friend class DownloadRequest;
600c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class PageUsageRequest;
601c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class RedirectRequest;
602c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class TestingProfile;
603c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
604c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Implementation of NotificationObserver.
605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
606c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
607c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
608c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
609c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Low-level Init().  Same as the public version, but adds a |no_db| parameter
610c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // that is only set by unittests which causes the backend to not init its DB.
611c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool Init(const FilePath& history_dir,
612c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            BookmarkService* bookmark_service,
613c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            bool no_db);
614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
615c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called by the HistoryURLProvider class to schedule an autocomplete, it
616c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // will be called back on the internal history thread with the history
617c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // database so it can query. See history_autocomplete.cc for a diagram.
618c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ScheduleAutocomplete(HistoryURLProvider* provider,
619c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            HistoryURLProviderParams* params);
620c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
621c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Broadcasts the given notification. This is called by the backend so that
622c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the notification will be broadcast on the main thread.
623c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
624c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The |details_deleted| pointer will be sent as the "details" for the
625c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // notification. The function takes ownership of the pointer and deletes it
626c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // when the notification is sent (it is coming from another thread, so must
627c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // be allocated on the heap).
628c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void BroadcastNotifications(NotificationType type,
629c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              history::HistoryDetails* details_deleted);
630c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
631c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Initializes the backend.
632c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void LoadBackendIfNecessary();
633c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
634c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Notification from the backend that it has finished loading. Sends
635c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // notification (NOTIFY_HISTORY_LOADED) and sets backend_loaded_ to true.
636c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void OnDBLoaded();
637c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
638ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Favicon -------------------------------------------------------------------
639c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
640c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // These favicon methods are exposed to the FaviconService. Instead of calling
641c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // these methods directly you should call the respective method on the
642c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // FaviconService.
643c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
644c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Used by the FaviconService to get a favicon from the history backend.
645c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void GetFavicon(FaviconService::GetFaviconRequest* request,
646ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                  const GURL& icon_url,
647ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                  history::IconType icon_type);
648c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
649c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Used by the FaviconService to update the favicon mappings on the history
650c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // backend.
651c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void UpdateFaviconMappingAndFetch(FaviconService::GetFaviconRequest* request,
652c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    const GURL& page_url,
653ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                    const GURL& icon_url,
654ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                    history::IconType icon_type);
655c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
656c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Used by the FaviconService to get a favicon from the history backend.
657c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void GetFaviconForURL(FaviconService::GetFaviconRequest* request,
658ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        const GURL& page_url,
659ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        int icon_types);
660c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
661c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Used by the FaviconService to mark the favicon for the page as being out
662c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // of date.
663c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetFaviconOutOfDateForPage(const GURL& page_url);
664c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
665c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Used by the FaviconService for importing many favicons for many pages at
666c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // once. The pages must exist, any favicon sets for unknown pages will be
667c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // discarded. Existing favicons will not be overwritten.
668c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetImportedFavicons(
669ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::vector<history::ImportedFaviconUsage>& favicon_usage);
670c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
671c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Used by the FaviconService to set the favicon for a page on the history
672c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // backend.
673c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetFavicon(const GURL& page_url,
674c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  const GURL& icon_url,
675ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                  const std::vector<unsigned char>& image_data,
676ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                  history::IconType icon_type);
677c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
678c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
679c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the in-memory URL database. This is called by the backend once the
680c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // database is loaded to make it available.
681c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetInMemoryBackend(history::InMemoryHistoryBackend* mem_backend);
682c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
683c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called by our BackendDelegate when there is a problem reading the database.
684ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void NotifyProfileError(sql::InitStatus init_status);
685c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
686c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Call to schedule a given task for running on the history thread with the
687c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // specified priority. The task will have ownership taken.
688c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ScheduleTask(SchedulePriority priority, Task* task);
689c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
690c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Schedule ------------------------------------------------------------------
691c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
692c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Functions for scheduling operations on the history thread that have a
693c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // handle and may be cancelable. For fire-and-forget operations, see
694c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // ScheduleAndForget below.
695c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
696c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template<typename BackendFunc, class RequestType>
697c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Handle Schedule(SchedulePriority priority,
698c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  BackendFunc func,  // Function to call on the HistoryBackend.
699c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  CancelableRequestConsumerBase* consumer,
700c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  RequestType* request) {
701c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DCHECK(thread_) << "History service being called after cleanup";
702c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    LoadBackendIfNecessary();
703c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (consumer)
704c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      AddRequest(request, consumer);
705c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ScheduleTask(priority,
706c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 NewRunnableMethod(history_backend_.get(), func,
707c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   scoped_refptr<RequestType>(request)));
708c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return request->handle();
709c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
710c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
711c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template<typename BackendFunc, class RequestType, typename ArgA>
712c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Handle Schedule(SchedulePriority priority,
713c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  BackendFunc func,  // Function to call on the HistoryBackend.
714c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  CancelableRequestConsumerBase* consumer,
715c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  RequestType* request,
716c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  const ArgA& a) {
717c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DCHECK(thread_) << "History service being called after cleanup";
718c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    LoadBackendIfNecessary();
719c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (consumer)
720c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      AddRequest(request, consumer);
721c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ScheduleTask(priority,
722c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 NewRunnableMethod(history_backend_.get(), func,
723c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   scoped_refptr<RequestType>(request),
724c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   a));
725c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return request->handle();
726c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
727c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
728c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template<typename BackendFunc,
729c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch           class RequestType,  // Descendant of CancelableRequstBase.
730c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch           typename ArgA,
731c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch           typename ArgB>
732c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Handle Schedule(SchedulePriority priority,
733c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  BackendFunc func,  // Function to call on the HistoryBackend.
734c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  CancelableRequestConsumerBase* consumer,
735c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  RequestType* request,
736c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  const ArgA& a,
737c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  const ArgB& b) {
738c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DCHECK(thread_) << "History service being called after cleanup";
739c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    LoadBackendIfNecessary();
740c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (consumer)
741c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      AddRequest(request, consumer);
742c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ScheduleTask(priority,
743c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 NewRunnableMethod(history_backend_.get(), func,
744c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   scoped_refptr<RequestType>(request),
745c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   a, b));
746c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return request->handle();
747c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
748c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
749c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template<typename BackendFunc,
750c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch           class RequestType,  // Descendant of CancelableRequstBase.
751c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch           typename ArgA,
752c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch           typename ArgB,
753c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch           typename ArgC>
754c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Handle Schedule(SchedulePriority priority,
755c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  BackendFunc func,  // Function to call on the HistoryBackend.
756c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  CancelableRequestConsumerBase* consumer,
757c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  RequestType* request,
758c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  const ArgA& a,
759c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  const ArgB& b,
760c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  const ArgC& c) {
761c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DCHECK(thread_) << "History service being called after cleanup";
762c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    LoadBackendIfNecessary();
763c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (consumer)
764c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      AddRequest(request, consumer);
765c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ScheduleTask(priority,
766c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 NewRunnableMethod(history_backend_.get(), func,
767c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   scoped_refptr<RequestType>(request),
768c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   a, b, c));
769c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return request->handle();
770c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
771c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
772c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // ScheduleAndForget ---------------------------------------------------------
773c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
774c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Functions for scheduling operations on the history thread that do not need
775c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // any callbacks and are not cancelable.
776c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
777c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template<typename BackendFunc>
778c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ScheduleAndForget(SchedulePriority priority,
779c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         BackendFunc func) {  // Function to call on backend.
780c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DCHECK(thread_) << "History service being called after cleanup";
781c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    LoadBackendIfNecessary();
782c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ScheduleTask(priority, NewRunnableMethod(history_backend_.get(), func));
783c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
784c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
785c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template<typename BackendFunc, typename ArgA>
786c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ScheduleAndForget(SchedulePriority priority,
787c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         BackendFunc func,  // Function to call on backend.
788c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         const ArgA& a) {
789c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DCHECK(thread_) << "History service being called after cleanup";
790c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    LoadBackendIfNecessary();
791c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ScheduleTask(priority, NewRunnableMethod(history_backend_.get(), func, a));
792c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
793c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
794c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template<typename BackendFunc, typename ArgA, typename ArgB>
795c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ScheduleAndForget(SchedulePriority priority,
796c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         BackendFunc func,  // Function to call on backend.
797c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         const ArgA& a,
798c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         const ArgB& b) {
799c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DCHECK(thread_) << "History service being called after cleanup";
800c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    LoadBackendIfNecessary();
801c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ScheduleTask(priority, NewRunnableMethod(history_backend_.get(), func,
802c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                             a, b));
803c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
804c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
805c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template<typename BackendFunc, typename ArgA, typename ArgB, typename ArgC>
806c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ScheduleAndForget(SchedulePriority priority,
807c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         BackendFunc func,  // Function to call on backend.
808c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         const ArgA& a,
809c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         const ArgB& b,
810c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         const ArgC& c) {
811c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DCHECK(thread_) << "History service being called after cleanup";
812c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    LoadBackendIfNecessary();
813c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ScheduleTask(priority, NewRunnableMethod(history_backend_.get(), func,
814c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                             a, b, c));
815c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
816c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
817c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template<typename BackendFunc,
818c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch           typename ArgA,
819c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch           typename ArgB,
820c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch           typename ArgC,
821c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch           typename ArgD>
822c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ScheduleAndForget(SchedulePriority priority,
823c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         BackendFunc func,  // Function to call on backend.
824c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         const ArgA& a,
825c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         const ArgB& b,
826c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         const ArgC& c,
827c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         const ArgD& d) {
828c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DCHECK(thread_) << "History service being called after cleanup";
829c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    LoadBackendIfNecessary();
830c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ScheduleTask(priority, NewRunnableMethod(history_backend_.get(), func,
831c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                             a, b, c, d));
832c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
833c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
834c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
835c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
836c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Some void primitives require some internal processing in the main thread
837c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // when done. We use this internal consumer for this purpose.
838c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CancelableRequestConsumer internal_consumer_;
839c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
840513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // The thread used by the history service to run complicated operations.
841513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // |thread_| is NULL once |Cleanup| is NULL.
842c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::Thread* thread_;
843c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
844c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This class has most of the implementation and runs on the 'thread_'.
845c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // You MUST communicate with this class ONLY through the thread_'s
846c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // message_loop().
847c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
848c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This pointer will be NULL once Cleanup() has been called, meaning no
849c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // more calls should be made to the history thread.
850c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<history::HistoryBackend> history_backend_;
851c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
852c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // A cache of the user-typed URLs kept in memory that is used by the
853c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // autocomplete system. This will be NULL until the database has been created
854c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // on the background thread.
855c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<history::InMemoryHistoryBackend> in_memory_backend_;
856c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
857c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The profile, may be null when testing.
858c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Profile* profile_;
859c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
860c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Has the backend finished loading? The backend is loaded once Init has
861c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // completed.
862c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool backend_loaded_;
863c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
864c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Cached values from Init(), used whenever we need to reload the backend.
865c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath history_dir_;
866c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BookmarkService* bookmark_service_;
867c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool no_db_;
868c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
869513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // True if needs top site migration.
870513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool needs_top_sites_migration_;
871513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
872c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(HistoryService);
873c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
874c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
875c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_HISTORY_HISTORY_H_
876