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