history_service.h revision b2df76ea8fec9e32f6f3718986dba0d95315b29c
18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// Copyright (c) 2012 The Chromium Authors. All rights reserved.
28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// Use of this source code is governed by a BSD-style license that can be
38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// found in the LICENSE file.
48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef CHROME_BROWSER_HISTORY_HISTORY_SERVICE_H_
68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CHROME_BROWSER_HISTORY_HISTORY_SERVICE_H_
78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <set>
98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <vector>
108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "base/basictypes.h"
128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "base/bind.h"
138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "base/callback.h"
148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "base/files/file_path.h"
158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "base/logging.h"
168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "base/memory/ref_counted.h"
178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "base/memory/scoped_ptr.h"
188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "base/memory/weak_ptr.h"
198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "base/observer_list.h"
208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "base/string16.h"
218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "base/threading/thread_checker.h"
228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "base/time.h"
238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "chrome/browser/common/cancelable_request.h"
248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "chrome/browser/favicon/favicon_service.h"
258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "chrome/browser/history/delete_directive_handler.h"
268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "chrome/browser/history/history_types.h"
278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "chrome/browser/history/typed_url_syncable_service.h"
288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "chrome/browser/profiles/profile_keyed_service.h"
298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "chrome/browser/search_engines/template_url_id.h"
308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "chrome/common/cancelable_task_tracker.h"
318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "chrome/common/ref_counted_util.h"
328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "components/visitedlink/browser/visitedlink_delegate.h"
338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "content/public/browser/notification_observer.h"
348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "content/public/browser/notification_registrar.h"
358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "content/public/common/page_transition_types.h"
368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "sql/init_status.h"
378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "sync/api/syncable_service.h"
388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "ui/base/layout.h"
398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(OS_ANDROID)
418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "chrome/browser/history/android/android_history_provider_service.h"
428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass BookmarkService;
458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass GURL;
468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass HistoryURLProvider;
478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass PageUsageData;
488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass PageUsageRequest;
498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass Profile;
508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct HistoryURLProviderParams;
518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectnamespace base {
538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass FilePath;
548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass Thread;
558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectnamespace components {
588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass VisitedLinkMaster;
598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}  // namespace components
608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectnamespace history {
638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass HistoryBackend;
658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass HistoryDatabase;
668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass HistoryDBTask;
678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass HistoryQueryTest;
688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass InMemoryHistoryBackend;
698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass InMemoryURLIndex;
708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass InMemoryURLIndexTest;
718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass URLDatabase;
728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass VisitDatabaseObserver;
738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass VisitFilter;
748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct DownloadRow;
758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct HistoryAddPageArgs;
768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct HistoryDetails;
778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}  // namespace history
798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// The history service records page titles, and visit times, as well as
818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// (eventually) information about autocomplete.
828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//
838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// This service is thread safe. Each request callback is invoked in the
848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// thread that made the request.
858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass HistoryService : public CancelableRequestProvider,
868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                       public content::NotificationObserver,
878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                       public syncer::SyncableService,
888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                       public ProfileKeyedService,
898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                       public components::VisitedLinkDelegate {
908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project public:
918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Miscellaneous commonly-used types.
928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  typedef std::vector<PageUsageData*> PageUsageDataList;
938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Must call Init after construction.
958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  explicit HistoryService(Profile* profile);
968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // The empty constructor is provided only for testing.
978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  HistoryService();
988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual ~HistoryService();
1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Initializes the history service, returning true on success. On false, do
1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // not call any other functions. The given directory will be used for storing
1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // the history files. The BookmarkService is used when deleting URLs to
1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // test if a URL is bookmarked; it may be NULL during testing.
1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool Init(const base::FilePath& history_dir, BookmarkService* bookmark_service) {
1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return Init(history_dir, bookmark_service, false);
1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Triggers the backend to load if it hasn't already, and then returns whether
1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // it's finished loading.
1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Note: Virtual needed for mocking.
1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual bool BackendLoaded();
1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Returns true if the backend has finished loading.
1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool backend_loaded() const { return backend_loaded_; }
1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Unloads the backend without actually shutting down the history service.
1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // This can be used to temporarily reduce the browser process' memory
1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // footprint.
1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void UnloadBackend();
1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  // Called on shutdown, this will tell the history backend to complete and
1235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  // will release pointers to it. No other functions should be called once
1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // cleanup has happened that may dispatch to the history thread (because it
1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // will be NULL).
1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //
1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // In practice, this will be called by the service manager (BrowserProcess)
1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // when it is being destroyed. Because that reference is being destroyed, it
1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // should be impossible for anybody else to call the service, even if it is
1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // still in memory (pending requests may be holding a reference to us).
1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void Cleanup();
1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // RenderProcessHost pointers are used to scope page IDs (see AddPage). These
1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // objects must tell us when they are being destroyed so that we can clear
1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // out any cached data associated with that scope.
1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //
1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // The given pointer will not be dereferenced, it is only used for
1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // identification purposes, hence it is a void*.
1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void NotifyRenderProcessHostDestruction(const void* host);
1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Triggers the backend to load if it hasn't already, and then returns the
1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // in-memory URL database. The returned pointer MAY BE NULL if the in-memory
1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // database has not been loaded yet. This pointer is owned by the history
1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // system. Callers should not store or cache this value.
1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //
1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // TODO(brettw) this should return the InMemoryHistoryBackend.
1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  history::URLDatabase* InMemoryDatabase();
1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Following functions get URL information from in-memory database.
1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // They return false if database is not available (e.g. not loaded yet) or the
1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // URL does not exist.
1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Reads the number of times the user has typed the given URL.
1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool GetTypedCountForURL(const GURL& url, int* typed_count);
1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Reads the last visit time for the given URL.
1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool GetLastVisitTimeForURL(const GURL& url, base::Time* last_visit);
1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Reads the number of times this URL has been visited.
1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool GetVisitCountForURL(const GURL& url, int* visit_count);
1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Returns a pointer to the TypedUrlSyncableService owned by HistoryBackend.
1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // This method should only be called from the history thread, because the
1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // returned service is intended to be accessed only via the history thread.
1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  history::TypedUrlSyncableService* GetTypedUrlSyncableService() const;
1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Return the quick history index.
1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  history::InMemoryURLIndex* InMemoryIndex() const {
1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return in_memory_url_index_.get();
1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // ProfileKeyedService:
1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void Shutdown() OVERRIDE;
1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Navigation ----------------------------------------------------------------
1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Adds the given canonical URL to history with the given time as the visit
1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // time. Referrer may be the empty string.
1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //
1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // The supplied render process host is used to scope the given page ID. Page
1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // IDs are only unique inside a given render process, so we need that to
1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // differentiate them. This pointer should not be dereferenced by the history
1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // system.
1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //
1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // The scope/ids can be NULL if there is no meaningful tracking information
1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // that can be performed on the given URL. The 'page_id' should be the ID of
1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // the current session history entry in the given process.
1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //
1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // 'redirects' is an array of redirect URLs leading to this page, with the
1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // page itself as the last item (so when there is no redirect, it will have
1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // one entry). If there are no redirects, this array may also be empty for
1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // the convenience of callers.
1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //
1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // 'did_replace_entry' is true when the navigation entry for this page has
1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // replaced the existing entry. A non-user initiated redirect causes such
1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // replacement.
1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //
1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // All "Add Page" functions will update the visited link database.
1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void AddPage(const GURL& url,
2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               base::Time time,
2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               const void* id_scope,
2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               int32 page_id,
2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               const GURL& referrer,
2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               const history::RedirectList& redirects,
2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               content::PageTransition transition,
2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               history::VisitSource visit_source,
2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               bool did_replace_entry);
2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // For adding pages to history where no tracking information can be done.
2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void AddPage(const GURL& url,
2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               base::Time time,
2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               history::VisitSource visit_source);
2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // All AddPage variants end up here.
2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void AddPage(const history::HistoryAddPageArgs& add_page_args);
2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Adds an entry for the specified url without creating a visit. This should
2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // only be used when bookmarking a page, otherwise the row leaks in the
2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // history db (it never gets cleaned).
2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void AddPageNoVisitForBookmark(const GURL& url, const string16& title);
2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Sets the title for the given page. The page should be in history. If it
2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // is not, this operation is ignored. This call will not update the full
2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // text index. The last title set when the page is indexed will be the
2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // title in the full text index.
2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void SetPageTitle(const GURL& url, const string16& title);
2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Updates the history database with a page's ending time stamp information.
2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // The page can be identified by the combination of the pointer to
2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // a RenderProcessHost, the page id and the url.
2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //
2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // The given pointer will not be dereferenced, it is only used for
2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // identification purposes, hence it is a void*.
2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void UpdateWithPageEndTime(const void* host,
2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                             int32 page_id,
2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                             const GURL& url,
2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                             base::Time end_ts);
2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Indexing ------------------------------------------------------------------
2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Notifies history of the body text of the given recently-visited URL.
2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // If the URL was not visited "recently enough," the history system may
2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // discard it.
2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void SetPageContents(const GURL& url, const string16& contents);
2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Querying ------------------------------------------------------------------
2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Returns the information about the requested URL. If the URL is found,
2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // success will be true and the information will be in the URLRow parameter.
2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // On success, the visits, if requested, will be sorted by date. If they have
2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // not been requested, the pointer will be valid, but the vector will be
2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // empty.
2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //
2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // If success is false, neither the row nor the vector will be valid.
2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  typedef base::Callback<void(
2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      Handle,
2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      bool,  // Success flag, when false, nothing else is valid.
2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      const history::URLRow*,
2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      history::VisitVector*)> QueryURLCallback;
2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Queries the basic information about the URL in the history database. If
2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // the caller is interested in the visits (each time the URL is visited),
2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // set |want_visits| to true. If these are not needed, the function will be
2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // faster by setting this to false.
2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  Handle QueryURL(const GURL& url,
2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  bool want_visits,
2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  CancelableRequestConsumerBase* consumer,
2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  const QueryURLCallback& callback);
2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Provides the result of a query. See QueryResults in history_types.h.
2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // The common use will be to use QueryResults.Swap to suck the contents of
2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // the results out of the passed in parameter and take ownership of them.
2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  typedef base::Callback<void(Handle, history::QueryResults*)>
2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      QueryHistoryCallback;
2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Queries all history with the given options (see QueryOptions in
2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // history_types.h). If non-empty, the full-text database will be queried with
2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // the given |text_query|. If empty, all results matching the given options
2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // will be returned.
2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //
2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // This isn't totally hooked up yet, this will query the "new" full text
2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // database (see SetPageContents) which won't generally be set yet.
2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  Handle QueryHistory(const string16& text_query,
2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                      const history::QueryOptions& options,
2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                      CancelableRequestConsumerBase* consumer,
2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                      const QueryHistoryCallback& callback);
2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Called when the results of QueryRedirectsFrom are available.
2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // The given vector will contain a list of all redirects, not counting
2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // the original page. If A redirects to B, the vector will contain only B,
2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // and A will be in 'source_url'.
2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //
2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // If there is no such URL in the database or the most recent visit has no
2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // redirect, the vector will be empty. If the history system failed for
2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // some reason, success will additionally be false. If the given page
2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // has redirected to multiple destinations, this will pick a random one.
2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  typedef base::Callback<void(Handle,
2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                              GURL,  // from_url
2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                              bool,  // success
3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                              history::RedirectList*)> QueryRedirectsCallback;
3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Schedules a query for the most recent redirect coming out of the given
3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // URL. See the RedirectQuerySource above, which is guaranteed to be called
3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // if the request is not canceled.
3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  Handle QueryRedirectsFrom(const GURL& from_url,
3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            CancelableRequestConsumerBase* consumer,
3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            const QueryRedirectsCallback& callback);
3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Schedules a query to get the most recent redirects ending at the given
3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // URL.
3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  Handle QueryRedirectsTo(const GURL& to_url,
3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                          CancelableRequestConsumerBase* consumer,
3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                          const QueryRedirectsCallback& callback);
3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  typedef base::Callback<
3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      void(Handle,
3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           bool,        // Were we able to determine the # of visits?
3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           int,         // Number of visits.
3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           base::Time)> // Time of first visit. Only set if bool
3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        // is true and int is > 0.
3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      GetVisibleVisitCountToHostCallback;
3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Requests the number of user-visible visits (i.e. no redirects or subframes)
3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // to all urls on the same scheme/host/port as |url|.  This is only valid for
3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // HTTP and HTTPS URLs.
3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  Handle GetVisibleVisitCountToHost(
3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      const GURL& url,
3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      CancelableRequestConsumerBase* consumer,
3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      const GetVisibleVisitCountToHostCallback& callback);
3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Called when QueryTopURLsAndRedirects completes. The vector contains a list
3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // of the top |result_count| URLs.  For each of these URLs, there is an entry
3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // in the map containing redirects from the URL.  For example, if we have the
3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // redirect chain A -> B -> C and A is a top visited URL, then A will be in
3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // the vector and "A => {B -> C}" will be in the map.
3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  typedef base::Callback<
3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      void(Handle,
3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           bool,  // Did we get the top urls and redirects?
3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           std::vector<GURL>*,  // List of top URLs.
3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           history::RedirectMap*)>  // Redirects for top URLs.
3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      QueryTopURLsAndRedirectsCallback;
3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Request the top |result_count| most visited URLs and the chain of redirects
3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // leading to each of these URLs.
3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // TODO(Nik): remove this. Use QueryMostVisitedURLs instead.
3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  Handle QueryTopURLsAndRedirects(
3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      int result_count,
3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      CancelableRequestConsumerBase* consumer,
3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      const QueryTopURLsAndRedirectsCallback& callback);
3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  typedef base::Callback<void(Handle, history::MostVisitedURLList)>
3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      QueryMostVisitedURLsCallback;
3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  typedef base::Callback<void(Handle, const history::FilteredURLList&)>
3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      QueryFilteredURLsCallback;
3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Request the |result_count| most visited URLs and the chain of
3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // redirects leading to each of these URLs. |days_back| is the
3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // number of days of history to use. Used by TopSites.
3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  Handle QueryMostVisitedURLs(int result_count, int days_back,
3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                              CancelableRequestConsumerBase* consumer,
3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                              const QueryMostVisitedURLsCallback& callback);
3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Request the |result_count| URLs filtered and sorted based on the |filter|.
3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // If |extended_info| is true, additional data will be provided in the
3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // results. Computing this additional data is expensive, likely to become
3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // more expensive as additional data points are added in future changes, and
3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // not useful in most cases. Set |extended_info| to true only if you
3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // explicitly require the additional data.
3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  Handle QueryFilteredURLs(
3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      int result_count,
3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      const history::VisitFilter& filter,
3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      bool extended_info,
3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      CancelableRequestConsumerBase* consumer,
3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      const QueryFilteredURLsCallback& callback);
3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Thumbnails ----------------------------------------------------------------
3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Implemented by consumers to get thumbnail data. Called when a request for
3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // the thumbnail data is complete. Once this callback is made, the request
3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // will be completed and no other calls will be made for that handle.
3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //
3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // This function will be called even on error conditions or if there is no
3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // thumbnail for that page. In these cases, the data pointer will be NULL.
3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  typedef base::Callback<void(Handle, scoped_refptr<base::RefCountedBytes>)>
3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      ThumbnailDataCallback;
3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Requests a page thumbnail. See ThumbnailDataCallback definition above.
3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  Handle GetPageThumbnail(const GURL& page_url,
3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                          CancelableRequestConsumerBase* consumer,
3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                          const ThumbnailDataCallback& callback);
3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Database management operations --------------------------------------------
3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Delete all the information related to a single url.
3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void DeleteURL(const GURL& url);
3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Delete all the information related to a list of urls.  (Deleting
3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // URLs one by one is slow as it has to flush to disk each time.)
4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void DeleteURLsForTest(const std::vector<GURL>& urls);
4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Removes all visits in the selected time range (including the start time),
4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // updating the URLs accordingly. This deletes the associated data, including
4048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // the full text index. This function also deletes the associated favicons,
4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // if they are no longer referenced. |callback| runs when the expiration is
4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // complete. You may use null Time values to do an unbounded delete in
4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // either direction.
4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // If |restrict_urls| is not empty, only visits to the URLs in this set are
4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // removed.
4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void ExpireHistoryBetween(const std::set<GURL>& restrict_urls,
4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            base::Time begin_time,
4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            base::Time end_time,
4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            const base::Closure& callback,
4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            CancelableTaskTracker* tracker);
4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Removes all visits to specified URLs in specific time ranges.
4178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // This is the equivalent ExpireHistoryBetween() once for each element in the
4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // vector. The fields of |ExpireHistoryArgs| map directly to the arguments of
4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // of ExpireHistoryBetween().
4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void ExpireHistory(const std::vector<history::ExpireHistoryArgs>& expire_list,
4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                     const base::Closure& callback,
4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                     CancelableTaskTracker* tracker);
4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Removes all visits to the given URLs in the specified time range. Calls
4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // ExpireHistoryBetween() to delete local visits, and handles deletion of
4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // synced visits if appropriate.
4278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void ExpireLocalAndRemoteHistoryBetween(
4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      const std::set<GURL>& restrict_urls,
4298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      base::Time begin_time,
4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      base::Time end_time,
4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      const base::Closure& callback,
4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      CancelableTaskTracker* tracker);
4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Processes the given |delete_directive| and sends it to the
4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // SyncChangeProcessor (if it exists).  Returns any error resulting
4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // from sending the delete directive to sync.
4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  syncer::SyncError ProcessLocalDeleteDirective(
4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      const sync_pb::HistoryDeleteDirectiveSpecifics& delete_directive);
4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Downloads -----------------------------------------------------------------
4418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Implemented by the caller of 'CreateDownload' below, and is called when the
4438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // history service has created a new entry for a download in the history db.
4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  typedef base::Callback<void(int64)> DownloadCreateCallback;
4458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Begins a history request to create a new row for a download. 'info'
4478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // contains all the download's creation state, and 'callback' runs when the
4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // history service request is complete. The callback is called on the thread
4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // that calls CreateDownload().
4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void CreateDownload(
4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      const history::DownloadRow& info,
4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      const DownloadCreateCallback& callback);
4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Implemented by the caller of 'GetNextDownloadId' below.
4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  typedef base::Callback<void(int)> DownloadNextIdCallback;
4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Runs the callback with the next available download id. The callback is
4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // called on the thread that calls GetNextDownloadId().
4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void GetNextDownloadId(const DownloadNextIdCallback& callback);
4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Implemented by the caller of 'QueryDownloads' below, and is called when the
4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // history service has retrieved a list of all download state. The call
4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  typedef base::Callback<void(
4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      scoped_ptr<std::vector<history::DownloadRow> >)>
4658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project          DownloadQueryCallback;
4668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Begins a history request to retrieve the state of all downloads in the
4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // history db. 'callback' runs when the history service request is complete,
4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // at which point 'info' contains an array of history::DownloadRow, one per
4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // download. The callback is called on the thread that calls QueryDownloads().
4718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void QueryDownloads(const DownloadQueryCallback& callback);
4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Called to update the history service about the current state of a download.
4748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // This is a 'fire and forget' query, so just pass the relevant state info to
4758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // the database with no need for a callback.
4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void UpdateDownload(const history::DownloadRow& data);
4778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Permanently remove some downloads from the history system. This is a 'fire
4798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // and forget' operation.
4808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void RemoveDownloads(const std::set<int64>& db_handles);
4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Visit Segments ------------------------------------------------------------
4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  typedef base::Callback<void(Handle, std::vector<PageUsageData*>*)>
4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      SegmentQueryCallback;
4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Query usage data for all visit segments since the provided time.
4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //
4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // The request is performed asynchronously and can be cancelled by using the
4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // returned handle.
4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //
4928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // The vector provided to the callback and its contents is owned by the
4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // history system. It will be deeply deleted after the callback is invoked.
4948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // If you want to preserve any PageUsageData instance, simply remove them
4958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // from the vector.
4968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //
4978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // The vector contains a list of PageUsageData. Each PageUsageData ID is set
4988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // to the segment ID. The URL and all the other information is set to the page
4998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // representing the segment.
5008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  Handle QuerySegmentUsageSince(CancelableRequestConsumerBase* consumer,
5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                                const base::Time from_time,
5028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                                int max_result_count,
5038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                                const SegmentQueryCallback& callback);
5048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Increases the amount of time the user actively viewed the url.
5068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void IncreaseSegmentDuration(const GURL& url,
5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                               base::Time time,
5088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                               base::TimeDelta delta);
5098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Queries segments based on active time viewed.
5118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  Handle QuerySegmentDurationSince(CancelableRequestConsumerBase* consumer,
5128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                                   base::Time from_time,
5138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                                   int max_result_count,
5148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                                   const SegmentQueryCallback& callback);
5158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Keyword search terms -----------------------------------------------------
5178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Sets the search terms for the specified url and keyword. url_id gives the
5198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // id of the url, keyword_id the id of the keyword and term the search term.
5208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void SetKeywordSearchTermsForURL(const GURL& url,
5218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                                   TemplateURLID keyword_id,
5228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                                   const string16& term);
5238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Deletes all search terms for the specified keyword.
5258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void DeleteAllSearchTermsForKeyword(TemplateURLID keyword_id);
5268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  typedef base::Callback<
5288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      void(Handle, std::vector<history::KeywordSearchTermVisit>*)>
5298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project          GetMostRecentKeywordSearchTermsCallback;
5308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Returns up to max_count of the most recent search terms starting with the
5328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // specified text. The matching is case insensitive. The results are ordered
5338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // in descending order up to |max_count| with the most recent search term
5348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // first.
5358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  Handle GetMostRecentKeywordSearchTerms(
5368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      TemplateURLID keyword_id,
5378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      const string16& prefix,
5388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      int max_count,
5398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      CancelableRequestConsumerBase* consumer,
5408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      const GetMostRecentKeywordSearchTermsCallback& callback);
5418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Bookmarks -----------------------------------------------------------------
5438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Notification that a URL is no longer bookmarked.
5458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void URLsNoLongerBookmarked(const std::set<GURL>& urls);
5468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Generic Stuff -------------------------------------------------------------
5488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Schedules a HistoryDBTask for running on the history backend thread. See
5508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // HistoryDBTask for details on what this does.
5518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void ScheduleDBTask(history::HistoryDBTask* task,
5528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                              CancelableRequestConsumerBase* consumer);
5538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Returns true if top sites needs to be migrated out of history into its own
5558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // db.
5568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool needs_top_sites_migration() const { return needs_top_sites_migration_; }
5578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Adds or removes observers for the VisitDatabase.
5598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void AddVisitDatabaseObserver(history::VisitDatabaseObserver* observer);
5608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void RemoveVisitDatabaseObserver(history::VisitDatabaseObserver* observer);
5618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void NotifyVisitDBObserversOnAddVisit(const history::BriefVisitInfo& info);
5638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Testing -------------------------------------------------------------------
5658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Designed for unit tests, this passes the given task on to the history
5678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // backend to be called once the history backend has terminated. This allows
5688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // callers to know when the history thread is complete and the database files
5698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // can be deleted and the next test run. Otherwise, the history thread may
5708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // still be running, causing problems in subsequent tests.
5718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //
5728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // There can be only one closing task, so this will override any previously
5738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // set task. We will take ownership of the pointer and delete it when done.
5748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // The task will be run on the calling thread (this function is threadsafe).
5758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void SetOnBackendDestroyTask(const base::Closure& task);
5768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Used for unit testing and potentially importing to get known information
5788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // into the database. This assumes the URL doesn't exist in the database
5798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //
5808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Calling this function many times may be slow because each call will
5818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // dispatch to the history thread and will be a separate database
5828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // transaction. If this functionality is needed for importing many URLs,
5838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // callers should use AddPagesWithDetails() instead.
5848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //
5858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Note that this routine (and AddPageWithDetails()) always adds a single
5868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // visit using the |last_visit| timestamp, and a PageTransition type of LINK,
5878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // if |visit_source| != SYNCED.
5888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void AddPageWithDetails(const GURL& url,
5898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                          const string16& title,
5908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                          int visit_count,
5918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                          int typed_count,
5928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                          base::Time last_visit,
5938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                          bool hidden,
5948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                          history::VisitSource visit_source);
5958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // The same as AddPageWithDetails() but takes a vector.
5978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void AddPagesWithDetails(const history::URLRows& info,
5988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                           history::VisitSource visit_source);
5998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Starts the TopSites migration in the HistoryThread. Called by the
6018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // BackendDelegate.
6028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void StartTopSitesMigration(int backend_id);
6038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Called by TopSites after the thumbnails were read and it is safe
6058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // to delete the thumbnails DB.
6068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void OnTopSitesReady();
6078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Returns true if this looks like the type of URL we want to add to the
6098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // history. We filter out some URLs such as JavaScript.
6108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool CanAddURL(const GURL& url);
6118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  base::WeakPtr<HistoryService> AsWeakPtr();
6138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // syncer::SyncableService implementation.
6158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual syncer::SyncMergeResult MergeDataAndStartSyncing(
6168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      syncer::ModelType type,
6178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      const syncer::SyncDataList& initial_sync_data,
6188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      scoped_ptr<syncer::SyncChangeProcessor> sync_processor,
6198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      scoped_ptr<syncer::SyncErrorFactory> error_handler) OVERRIDE;
6208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void StopSyncing(syncer::ModelType type) OVERRIDE;
6218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual syncer::SyncDataList GetAllSyncData(
6228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      syncer::ModelType type) const OVERRIDE;
6238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual syncer::SyncError ProcessSyncChanges(
6248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      const tracked_objects::Location& from_here,
6258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      const syncer::SyncChangeList& change_list) OVERRIDE;
6268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project protected:
6288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // These are not currently used, hopefully we can do something in the future
6298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // to ensure that the most important things happen first.
6308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  enum SchedulePriority {
6318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    PRIORITY_UI,      // The highest priority (must respond to UI events).
6328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    PRIORITY_NORMAL,  // Normal stuff like adding a page.
6338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    PRIORITY_LOW,     // Low priority things like indexing or expiration.
6348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  };
6358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project private:
6378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class BackendDelegate;
6388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(OS_ANDROID)
6398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class AndroidHistoryProviderService;
6408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
6418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class base::RefCountedThreadSafe<HistoryService>;
6428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class BackendDelegate;
6438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class FaviconService;
6448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class history::HistoryBackend;
6458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class history::HistoryQueryTest;
6468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class HistoryOperation;
6478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class HistoryURLProvider;
6488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class HistoryURLProviderTest;
6498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class history::InMemoryURLIndexTest;
6508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  template<typename Info, typename Callback> friend class DownloadRequest;
6518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class PageUsageRequest;
6528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class RedirectRequest;
6538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class TestingProfile;
6548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Implementation of content::NotificationObserver.
6568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void Observe(int type,
6578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                       const content::NotificationSource& source,
6588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                       const content::NotificationDetails& details) OVERRIDE;
6598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Implementation of components::VisitedLinkDelegate.
6618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void RebuildTable(
6628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      const scoped_refptr<URLEnumerator>& enumerator) OVERRIDE;
6638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Low-level Init().  Same as the public version, but adds a |no_db| parameter
6658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // that is only set by unittests which causes the backend to not init its DB.
6668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool Init(const base::FilePath& history_dir,
6678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            BookmarkService* bookmark_service,
6688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            bool no_db);
6698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Called by the HistoryURLProvider class to schedule an autocomplete, it
6718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // will be called back on the internal history thread with the history
6728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // database so it can query. See history_autocomplete.cc for a diagram.
6738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void ScheduleAutocomplete(HistoryURLProvider* provider,
6748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            HistoryURLProviderParams* params);
6758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Broadcasts the given notification. This is called by the backend so that
6778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // the notification will be broadcast on the main thread.
6788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //
6798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Compared to BroadcastNotifications(), this function does not take
6808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // ownership of |details|.
6818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void BroadcastNotificationsHelper(int type,
6828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                                    history::HistoryDetails* details);
6838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Initializes the backend.
6858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void LoadBackendIfNecessary();
6868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Notification from the backend that it has finished loading. Sends
6888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // notification (NOTIFY_HISTORY_LOADED) and sets backend_loaded_ to true.
6898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void OnDBLoaded(int backend_id);
6908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Helper function for getting URL information.
6928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Reads a URLRow from in-memory database. Returns false if database is not
6938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // available or the URL does not exist.
6948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool GetRowForURL(const GURL& url, history::URLRow* url_row);
6958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Favicon -------------------------------------------------------------------
6978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // These favicon methods are exposed to the FaviconService. Instead of calling
6998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // these methods directly you should call the respective method on the
7008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // FaviconService.
7018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Used by FaviconService to get the favicon bitmaps from the history backend
7038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // which most closely match |desired_size_in_dip| x |desired_size_in_dip| and
7048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // |desired_scale_factors| for |icon_types|. If |desired_size_in_dip| is 0,
7058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // the largest favicon bitmap for |icon_types| is returned. The returned
7068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // FaviconBitmapResults will have at most one result for each of
7078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // |desired_scale_factors|. If a favicon bitmap is determined to be the best
7088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // candidate for multiple scale factors there will be less results.
7098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // If |icon_types| has several types, results for only a single type will be
7108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // returned in the priority of TOUCH_PRECOMPOSED_ICON, TOUCH_ICON, and
7118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // FAVICON.
7128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  CancelableTaskTracker::TaskId GetFavicons(
7138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      const std::vector<GURL>& icon_urls,
7148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      int icon_types,
7158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      int desired_size_in_dip,
7168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      const std::vector<ui::ScaleFactor>& desired_scale_factors,
7178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      const FaviconService::FaviconResultsCallback& callback,
7188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      CancelableTaskTracker* tracker);
7198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Used by the FaviconService to get favicons mapped to |page_url| for
7218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // |icon_types| which most closely match |desired_size_in_dip| and
7228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // |desired_scale_factors|. If |desired_size_in_dip| is 0, the largest favicon
7238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // bitmap for |icon_types| is returned. The returned FaviconBitmapResults will
7248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // have at most one result for each of |desired_scale_factors|. If a favicon
7258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // bitmap is determined to be the best candidate for multiple scale factors
7268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // there will be less results. If |icon_types| has several types, results for
7278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // only a single type will be returned in the priority of
7288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // TOUCH_PRECOMPOSED_ICON, TOUCH_ICON, and FAVICON.
7298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  CancelableTaskTracker::TaskId GetFaviconsForURL(
7308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      const GURL& page_url,
7318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      int icon_types,
7328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      int desired_size_in_dip,
7338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      const std::vector<ui::ScaleFactor>& desired_scale_factors,
7348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      const FaviconService::FaviconResultsCallback& callback,
7358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      CancelableTaskTracker* tracker);
7368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Used by the FaviconService to get the favicon bitmap which most closely
7388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // matches |desired_size_in_dip| and |desired_scale_factor| from the favicon
7398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // with |favicon_id| from the history backend. If |desired_size_in_dip| is 0,
7408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // the largest favicon bitmap for |favicon_id| is returned.
7418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  CancelableTaskTracker::TaskId GetFaviconForID(
7428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      history::FaviconID favicon_id,
7438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      int desired_size_in_dip,
7448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      ui::ScaleFactor desired_scale_factor,
7458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      const FaviconService::FaviconResultsCallback& callback,
7468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      CancelableTaskTracker* tracker);
7478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Used by the FaviconService to replace the favicon mappings to |page_url|
7498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // for |icon_types| on the history backend.
7508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Sample |icon_urls|:
7518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //  { ICON_URL1 -> TOUCH_ICON, known to the database,
7528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //    ICON_URL2 -> TOUCH_ICON, not known to the database,
7538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //    ICON_URL3 -> TOUCH_PRECOMPOSED_ICON, known to the database }
7548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // The new mappings are computed from |icon_urls| with these rules:
7558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // 1) Any urls in |icon_urls| which are not already known to the database are
7568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //    rejected.
7578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //    Sample new mappings to |page_url|: { ICON_URL1, ICON_URL3 }
7588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // 2) If |icon_types| has multiple types, the mappings are only set for the
7598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //    largest icon type.
7608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //    Sample new mappings to |page_url|: { ICON_URL3 }
7618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // |icon_types| can only have multiple IconTypes if
7628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // |icon_types| == TOUCH_ICON | TOUCH_PRECOMPOSED_ICON.
7638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // The favicon bitmaps which most closely match |desired_size_in_dip|
7648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // and |desired_scale_factors| from the favicons which were just mapped
7658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // to |page_url| are returned. If |desired_size_in_dip| is 0, the
7668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // largest favicon bitmap is returned.
7678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  CancelableTaskTracker::TaskId UpdateFaviconMappingsAndFetch(
7688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      const GURL& page_url,
7698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      const std::vector<GURL>& icon_urls,
7708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      int icon_types,
7718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      int desired_size_in_dip,
7728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      const std::vector<ui::ScaleFactor>& desired_scale_factors,
7738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      const FaviconService::FaviconResultsCallback& callback,
7748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      CancelableTaskTracker* tracker);
7758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Used by FaviconService to set a favicon for |page_url| and |icon_url| with
7778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // |pixel_size|.
7788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Example:
7798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //   |page_url|: www.google.com
7808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // 2 favicons in history for |page_url|:
7818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //   www.google.com/a.ico  16x16
7828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //   www.google.com/b.ico  32x32
7838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // MergeFavicon(|page_url|, www.google.com/a.ico, ..., ..., 16x16)
7848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //
7858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Merging occurs in the following manner:
7868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // 1) |page_url| is set to map to only to |icon_url|. In order to not lose
7878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //    data, favicon bitmaps mapped to |page_url| but not to |icon_url| are
7888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //    copied to the favicon at |icon_url|.
7898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //    For the example above, |page_url| will only be mapped to a.ico.
7908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //    The 32x32 favicon bitmap at b.ico is copied to a.ico
7918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // 2) |bitmap_data| is added to the favicon at |icon_url|, overwriting any
7928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //    favicon bitmaps of |pixel_size|.
7938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //    For the example above, |bitmap_data| overwrites the 16x16 favicon
7948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //    bitmap for a.ico.
7958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // TODO(pkotwicz): Remove once no longer required by sync.
7968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void MergeFavicon(const GURL& page_url,
7978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    const GURL& icon_url,
7988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    history::IconType icon_type,
7998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    scoped_refptr<base::RefCountedMemory> bitmap_data,
8008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    const gfx::Size& pixel_size);
8018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Used by the FaviconService to set the favicons for a page on the history
8038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // backend.
8048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // |favicon_bitmap_data| replaces all the favicon bitmaps mapped to
8058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // |page_url|.
8068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // |expired| and |icon_type| fields in FaviconBitmapData are ignored.
8078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Use MergeFavicon() if |favicon_bitmap_data| is incomplete, and favicon
8088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // bitmaps in the database should be preserved if possible. For instance,
8098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // favicon bitmaps from sync are 1x only. MergeFavicon() is used to avoid
8108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // deleting the 2x favicon bitmap if it is present in the history backend.
8118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // See HistoryBackend::ValidateSetFaviconsParams() for more details on the
8128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // criteria for |favicon_bitmap_data| to be valid.
8138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void SetFavicons(
8148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      const GURL& page_url,
8158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      history::IconType icon_type,
8168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      const std::vector<history::FaviconBitmapData>& favicon_bitmap_data);
8178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Used by the FaviconService to mark the favicon for the page as being out
8198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // of date.
8208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void SetFaviconsOutOfDateForPage(const GURL& page_url);
8218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Used by the FaviconService to clone favicons from one page to another,
8238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // provided that other page does not already have favicons.
8248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void CloneFavicons(const GURL& old_page_url, const GURL& new_page_url);
8258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Used by the FaviconService for importing many favicons for many pages at
8278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // once. The pages must exist, any favicon sets for unknown pages will be
8288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // discarded. Existing favicons will not be overwritten.
8298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void SetImportedFavicons(
8308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      const std::vector<history::ImportedFaviconUsage>& favicon_usage);
8318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Sets the in-memory URL database. This is called by the backend once the
8338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // database is loaded to make it available.
8348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void SetInMemoryBackend(int backend_id,
8358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                          history::InMemoryHistoryBackend* mem_backend);
8368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Called by our BackendDelegate when there is a problem reading the database.
8388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void NotifyProfileError(int backend_id, sql::InitStatus init_status);
8398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Call to schedule a given task for running on the history thread with the
8418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // specified priority. The task will have ownership taken.
8428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void ScheduleTask(SchedulePriority priority, const base::Closure& task);
8438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Schedule ------------------------------------------------------------------
8458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //
8468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Functions for scheduling operations on the history thread that have a
8478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // handle and may be cancelable. For fire-and-forget operations, see
8488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // ScheduleAndForget below.
8498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  template<typename BackendFunc, class RequestType>
8518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  Handle Schedule(SchedulePriority priority,
8528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  BackendFunc func,  // Function to call on the HistoryBackend.
8538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  CancelableRequestConsumerBase* consumer,
8548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  RequestType* request) {
8558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    DCHECK(thread_) << "History service being called after cleanup";
8568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    DCHECK(thread_checker_.CalledOnValidThread());
8578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    LoadBackendIfNecessary();
8588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (consumer)
8598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      AddRequest(request, consumer);
8608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ScheduleTask(priority,
8618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                 base::Bind(func, history_backend_.get(),
8628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            scoped_refptr<RequestType>(request)));
8638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return request->handle();
8648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
8658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  template<typename BackendFunc, class RequestType, typename ArgA>
8678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  Handle Schedule(SchedulePriority priority,
8688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  BackendFunc func,  // Function to call on the HistoryBackend.
8698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  CancelableRequestConsumerBase* consumer,
8708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  RequestType* request,
8718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  const ArgA& a) {
8728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    DCHECK(thread_) << "History service being called after cleanup";
8738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    DCHECK(thread_checker_.CalledOnValidThread());
8748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    LoadBackendIfNecessary();
8758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (consumer)
8768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      AddRequest(request, consumer);
8778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ScheduleTask(priority,
8788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                 base::Bind(func, history_backend_.get(),
8798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            scoped_refptr<RequestType>(request), a));
8808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return request->handle();
8818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
8828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  template<typename BackendFunc,
8848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           class RequestType,  // Descendant of CancelableRequestBase.
8858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           typename ArgA,
8868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           typename ArgB>
8878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  Handle Schedule(SchedulePriority priority,
8888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  BackendFunc func,  // Function to call on the HistoryBackend.
8898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  CancelableRequestConsumerBase* consumer,
8908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  RequestType* request,
8918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  const ArgA& a,
8928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  const ArgB& b) {
8938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    DCHECK(thread_) << "History service being called after cleanup";
8948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    DCHECK(thread_checker_.CalledOnValidThread());
8958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    LoadBackendIfNecessary();
8968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (consumer)
8978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      AddRequest(request, consumer);
8988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ScheduleTask(priority,
8998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                 base::Bind(func, history_backend_.get(),
9008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            scoped_refptr<RequestType>(request), a, b));
9018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return request->handle();
9028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
9038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  template<typename BackendFunc,
9058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           class RequestType,  // Descendant of CancelableRequestBase.
9068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           typename ArgA,
9078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           typename ArgB,
9088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           typename ArgC>
9098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  Handle Schedule(SchedulePriority priority,
9108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  BackendFunc func,  // Function to call on the HistoryBackend.
9118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  CancelableRequestConsumerBase* consumer,
9128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  RequestType* request,
9138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  const ArgA& a,
9148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  const ArgB& b,
9158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  const ArgC& c) {
9168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    DCHECK(thread_) << "History service being called after cleanup";
9178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    DCHECK(thread_checker_.CalledOnValidThread());
9188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    LoadBackendIfNecessary();
9198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (consumer)
9208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      AddRequest(request, consumer);
9218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ScheduleTask(priority,
9228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                 base::Bind(func, history_backend_.get(),
9238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            scoped_refptr<RequestType>(request), a, b, c));
9248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return request->handle();
9258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
9268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  template<typename BackendFunc,
9288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           class RequestType,  // Descendant of CancelableRequestBase.
9298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           typename ArgA,
9308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           typename ArgB,
9318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           typename ArgC,
9328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           typename ArgD>
9338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  Handle Schedule(SchedulePriority priority,
9348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  BackendFunc func,  // Function to call on the HistoryBackend.
9358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  CancelableRequestConsumerBase* consumer,
9368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  RequestType* request,
9378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  const ArgA& a,
9388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  const ArgB& b,
9398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  const ArgC& c,
9408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  const ArgD& d) {
9418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    DCHECK(thread_) << "History service being called after cleanup";
9428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    DCHECK(thread_checker_.CalledOnValidThread());
9438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    LoadBackendIfNecessary();
9448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (consumer)
9458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      AddRequest(request, consumer);
9468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ScheduleTask(priority,
9478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                 base::Bind(func, history_backend_.get(),
9488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            scoped_refptr<RequestType>(request), a, b, c, d));
9498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return request->handle();
9508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
9518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // ScheduleAndForget ---------------------------------------------------------
9538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //
9548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Functions for scheduling operations on the history thread that do not need
9558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // any callbacks and are not cancelable.
9568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  template<typename BackendFunc>
9588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void ScheduleAndForget(SchedulePriority priority,
9598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                         BackendFunc func) {  // Function to call on backend.
9608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    DCHECK(thread_) << "History service being called after cleanup";
9618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    DCHECK(thread_checker_.CalledOnValidThread());
9628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    LoadBackendIfNecessary();
9638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ScheduleTask(priority, base::Bind(func, history_backend_.get()));
9648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
9658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  template<typename BackendFunc, typename ArgA>
9678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void ScheduleAndForget(SchedulePriority priority,
9688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                         BackendFunc func,  // Function to call on backend.
9698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                         const ArgA& a) {
9708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    DCHECK(thread_) << "History service being called after cleanup";
9718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    DCHECK(thread_checker_.CalledOnValidThread());
9728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    LoadBackendIfNecessary();
9738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ScheduleTask(priority, base::Bind(func, history_backend_.get(), a));
9748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
9758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  template<typename BackendFunc, typename ArgA, typename ArgB>
9778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void ScheduleAndForget(SchedulePriority priority,
9788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                         BackendFunc func,  // Function to call on backend.
9798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                         const ArgA& a,
9808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                         const ArgB& b) {
9818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    DCHECK(thread_) << "History service being called after cleanup";
9828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    DCHECK(thread_checker_.CalledOnValidThread());
9838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    LoadBackendIfNecessary();
9848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ScheduleTask(priority, base::Bind(func, history_backend_.get(), a, b));
9858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
9868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  template<typename BackendFunc, typename ArgA, typename ArgB, typename ArgC>
9888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void ScheduleAndForget(SchedulePriority priority,
9898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                         BackendFunc func,  // Function to call on backend.
9908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                         const ArgA& a,
9918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                         const ArgB& b,
9928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                         const ArgC& c) {
9938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    DCHECK(thread_) << "History service being called after cleanup";
9948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    DCHECK(thread_checker_.CalledOnValidThread());
9958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    LoadBackendIfNecessary();
9968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ScheduleTask(priority, base::Bind(func, history_backend_.get(), a, b, c));
9978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
9988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  template<typename BackendFunc,
10008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           typename ArgA,
10018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           typename ArgB,
10028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           typename ArgC,
10038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           typename ArgD>
10048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void ScheduleAndForget(SchedulePriority priority,
10058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                         BackendFunc func,  // Function to call on backend.
10068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                         const ArgA& a,
10078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                         const ArgB& b,
10088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                         const ArgC& c,
10098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                         const ArgD& d) {
10108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    DCHECK(thread_) << "History service being called after cleanup";
10118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    DCHECK(thread_checker_.CalledOnValidThread());
10128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    LoadBackendIfNecessary();
10138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ScheduleTask(priority, base::Bind(func, history_backend_.get(),
10148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                                      a, b, c, d));
10158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
10168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  template<typename BackendFunc,
10188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           typename ArgA,
10198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           typename ArgB,
10208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           typename ArgC,
10218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           typename ArgD,
10228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           typename ArgE>
10238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void ScheduleAndForget(SchedulePriority priority,
10248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                         BackendFunc func,  // Function to call on backend.
10258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                         const ArgA& a,
10268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                         const ArgB& b,
10278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                         const ArgC& c,
10288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                         const ArgD& d,
10298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                         const ArgE& e) {
10308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    DCHECK(thread_) << "History service being called after cleanup";
10318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    DCHECK(thread_checker_.CalledOnValidThread());
10328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    LoadBackendIfNecessary();
10338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ScheduleTask(priority, base::Bind(func, history_backend_.get(),
10348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                                      a, b, c, d, e));
10358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
10368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // All vended weak pointers are invalidated in Cleanup().
10388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  base::WeakPtrFactory<HistoryService> weak_ptr_factory_;
10398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  base::ThreadChecker thread_checker_;
10418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  content::NotificationRegistrar registrar_;
10438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Some void primitives require some internal processing in the main thread
10458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // when done. We use this internal consumer for this purpose.
10468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  CancelableRequestConsumer internal_consumer_;
10478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // The thread used by the history service to run complicated operations.
10498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // |thread_| is NULL once |Cleanup| is NULL.
10508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  base::Thread* thread_;
10518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // This class has most of the implementation and runs on the 'thread_'.
10538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // You MUST communicate with this class ONLY through the thread_'s
10548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // message_loop().
10558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //
10568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // This pointer will be NULL once Cleanup() has been called, meaning no
10578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // more calls should be made to the history thread.
10588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  scoped_refptr<history::HistoryBackend> history_backend_;
10598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // A cache of the user-typed URLs kept in memory that is used by the
10618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // autocomplete system. This will be NULL until the database has been created
10628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // on the background thread.
10638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // TODO(mrossetti): Consider changing ownership. See http://crbug.com/138321
10648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  scoped_ptr<history::InMemoryHistoryBackend> in_memory_backend_;
10658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // The profile, may be null when testing.
10678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  Profile* profile_;
10688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Used for propagating link highlighting data across renderers. May be null
10708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // in tests.
10718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  scoped_ptr<components::VisitedLinkMaster> visitedlink_master_;
10728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Has the backend finished loading? The backend is loaded once Init has
10748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // completed.
10758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool backend_loaded_;
10768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // The id of the current backend. This is only valid when history_backend_
10788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // is not NULL.
10798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  int current_backend_id_;
10808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Cached values from Init(), used whenever we need to reload the backend.
10828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  base::FilePath history_dir_;
10838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  BookmarkService* bookmark_service_;
10845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  bool no_db_;
10855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
10865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  // True if needs top site migration.
10875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  bool needs_top_sites_migration_;
10885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
10895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  // The index used for quick history lookups.
10905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  // TODO(mrossetti): Move in_memory_url_index out of history_service.
10915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  // See http://crbug.com/138321
10925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  scoped_ptr<history::InMemoryURLIndex> in_memory_url_index_;
10935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
10945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  ObserverList<history::VisitDatabaseObserver> visit_database_observers_;
10955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
10965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  history::DeleteDirectiveHandler delete_directive_handler_;
10975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
10985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  DISALLOW_COPY_AND_ASSIGN(HistoryService);
10995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner};
11005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
11018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif  // CHROME_BROWSER_HISTORY_HISTORY_SERVICE_H_
11028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project