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