Home | History | Annotate | Download | only in history
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_HISTORY_HISTORY_SERVICE_H_
      6 #define CHROME_BROWSER_HISTORY_HISTORY_SERVICE_H_
      7 
      8 #include <set>
      9 #include <vector>
     10 
     11 #include "base/basictypes.h"
     12 #include "base/bind.h"
     13 #include "base/callback.h"
     14 #include "base/files/file_path.h"
     15 #include "base/logging.h"
     16 #include "base/memory/ref_counted.h"
     17 #include "base/memory/scoped_ptr.h"
     18 #include "base/memory/weak_ptr.h"
     19 #include "base/observer_list.h"
     20 #include "base/strings/string16.h"
     21 #include "base/threading/thread_checker.h"
     22 #include "base/time/time.h"
     23 #include "chrome/browser/common/cancelable_request.h"
     24 #include "chrome/browser/favicon/favicon_service.h"
     25 #include "chrome/browser/history/delete_directive_handler.h"
     26 #include "chrome/browser/history/history_types.h"
     27 #include "chrome/browser/history/typed_url_syncable_service.h"
     28 #include "chrome/browser/search_engines/template_url_id.h"
     29 #include "chrome/common/cancelable_task_tracker.h"
     30 #include "chrome/common/ref_counted_util.h"
     31 #include "components/browser_context_keyed_service/browser_context_keyed_service.h"
     32 #include "components/visitedlink/browser/visitedlink_delegate.h"
     33 #include "content/public/browser/download_manager_delegate.h"
     34 #include "content/public/browser/notification_observer.h"
     35 #include "content/public/browser/notification_registrar.h"
     36 #include "content/public/common/page_transition_types.h"
     37 #include "sql/init_status.h"
     38 #include "sync/api/syncable_service.h"
     39 #include "ui/base/layout.h"
     40 
     41 #if defined(OS_ANDROID)
     42 #include "chrome/browser/history/android/android_history_provider_service.h"
     43 #endif
     44 
     45 class BookmarkService;
     46 class GURL;
     47 class HistoryURLProvider;
     48 class PageUsageData;
     49 class PageUsageRequest;
     50 class Profile;
     51 struct HistoryURLProviderParams;
     52 
     53 namespace base {
     54 class FilePath;
     55 class Thread;
     56 }
     57 
     58 namespace visitedlink {
     59 class VisitedLinkMaster;
     60 }
     61 
     62 namespace history {
     63 
     64 class HistoryBackend;
     65 class HistoryDatabase;
     66 class HistoryDBTask;
     67 class HistoryQueryTest;
     68 class InMemoryHistoryBackend;
     69 class InMemoryURLIndex;
     70 class InMemoryURLIndexTest;
     71 class URLDatabase;
     72 class VisitDatabaseObserver;
     73 class VisitFilter;
     74 struct DownloadRow;
     75 struct HistoryAddPageArgs;
     76 struct HistoryDetails;
     77 
     78 }  // namespace history
     79 
     80 // The history service records page titles, and visit times, as well as
     81 // (eventually) information about autocomplete.
     82 //
     83 // This service is thread safe. Each request callback is invoked in the
     84 // thread that made the request.
     85 class HistoryService : public CancelableRequestProvider,
     86                        public content::NotificationObserver,
     87                        public syncer::SyncableService,
     88                        public BrowserContextKeyedService,
     89                        public visitedlink::VisitedLinkDelegate {
     90  public:
     91   // Miscellaneous commonly-used types.
     92   typedef std::vector<PageUsageData*> PageUsageDataList;
     93 
     94   // Must call Init after construction.
     95   explicit HistoryService(Profile* profile);
     96   // The empty constructor is provided only for testing.
     97   HistoryService();
     98 
     99   virtual ~HistoryService();
    100 
    101   // Initializes the history service, returning true on success. On false, do
    102   // not call any other functions. The given directory will be used for storing
    103   // the history files. The BookmarkService is used when deleting URLs to
    104   // test if a URL is bookmarked; it may be NULL during testing.
    105   bool Init(const base::FilePath& history_dir, BookmarkService* bookmark_service) {
    106     return Init(history_dir, bookmark_service, false);
    107   }
    108 
    109   // Triggers the backend to load if it hasn't already, and then returns whether
    110   // it's finished loading.
    111   // Note: Virtual needed for mocking.
    112   virtual bool BackendLoaded();
    113 
    114   // Returns true if the backend has finished loading.
    115   bool backend_loaded() const { return backend_loaded_; }
    116 
    117   // Unloads the backend without actually shutting down the history service.
    118   // This can be used to temporarily reduce the browser process' memory
    119   // footprint.
    120   void UnloadBackend();
    121 
    122   // Called on shutdown, this will tell the history backend to complete and
    123   // will release pointers to it. No other functions should be called once
    124   // cleanup has happened that may dispatch to the history thread (because it
    125   // will be NULL).
    126   //
    127   // In practice, this will be called by the service manager (BrowserProcess)
    128   // when it is being destroyed. Because that reference is being destroyed, it
    129   // should be impossible for anybody else to call the service, even if it is
    130   // still in memory (pending requests may be holding a reference to us).
    131   void Cleanup();
    132 
    133   // RenderProcessHost pointers are used to scope page IDs (see AddPage). These
    134   // objects must tell us when they are being destroyed so that we can clear
    135   // out any cached data associated with that scope.
    136   //
    137   // The given pointer will not be dereferenced, it is only used for
    138   // identification purposes, hence it is a void*.
    139   void NotifyRenderProcessHostDestruction(const void* host);
    140 
    141   // Triggers the backend to load if it hasn't already, and then returns the
    142   // in-memory URL database. The returned pointer MAY BE NULL if the in-memory
    143   // database has not been loaded yet. This pointer is owned by the history
    144   // system. Callers should not store or cache this value.
    145   //
    146   // TODO(brettw) this should return the InMemoryHistoryBackend.
    147   history::URLDatabase* InMemoryDatabase();
    148 
    149   // Following functions get URL information from in-memory database.
    150   // They return false if database is not available (e.g. not loaded yet) or the
    151   // URL does not exist.
    152 
    153   // Reads the number of times the user has typed the given URL.
    154   bool GetTypedCountForURL(const GURL& url, int* typed_count);
    155 
    156   // Reads the last visit time for the given URL.
    157   bool GetLastVisitTimeForURL(const GURL& url, base::Time* last_visit);
    158 
    159   // Reads the number of times this URL has been visited.
    160   bool GetVisitCountForURL(const GURL& url, int* visit_count);
    161 
    162   // Returns a pointer to the TypedUrlSyncableService owned by HistoryBackend.
    163   // This method should only be called from the history thread, because the
    164   // returned service is intended to be accessed only via the history thread.
    165   history::TypedUrlSyncableService* GetTypedUrlSyncableService() const;
    166 
    167   // Return the quick history index.
    168   history::InMemoryURLIndex* InMemoryIndex() const {
    169     return in_memory_url_index_.get();
    170   }
    171 
    172   // BrowserContextKeyedService:
    173   virtual void Shutdown() OVERRIDE;
    174 
    175   // Navigation ----------------------------------------------------------------
    176 
    177   // Adds the given canonical URL to history with the given time as the visit
    178   // time. Referrer may be the empty string.
    179   //
    180   // The supplied render process host is used to scope the given page ID. Page
    181   // IDs are only unique inside a given render process, so we need that to
    182   // differentiate them. This pointer should not be dereferenced by the history
    183   // system.
    184   //
    185   // The scope/ids can be NULL if there is no meaningful tracking information
    186   // that can be performed on the given URL. The 'page_id' should be the ID of
    187   // the current session history entry in the given process.
    188   //
    189   // 'redirects' is an array of redirect URLs leading to this page, with the
    190   // page itself as the last item (so when there is no redirect, it will have
    191   // one entry). If there are no redirects, this array may also be empty for
    192   // the convenience of callers.
    193   //
    194   // 'did_replace_entry' is true when the navigation entry for this page has
    195   // replaced the existing entry. A non-user initiated redirect causes such
    196   // replacement.
    197   //
    198   // All "Add Page" functions will update the visited link database.
    199   void AddPage(const GURL& url,
    200                base::Time time,
    201                const void* id_scope,
    202                int32 page_id,
    203                const GURL& referrer,
    204                const history::RedirectList& redirects,
    205                content::PageTransition transition,
    206                history::VisitSource visit_source,
    207                bool did_replace_entry);
    208 
    209   // For adding pages to history where no tracking information can be done.
    210   void AddPage(const GURL& url,
    211                base::Time time,
    212                history::VisitSource visit_source);
    213 
    214   // All AddPage variants end up here.
    215   void AddPage(const history::HistoryAddPageArgs& add_page_args);
    216 
    217   // Adds an entry for the specified url without creating a visit. This should
    218   // only be used when bookmarking a page, otherwise the row leaks in the
    219   // history db (it never gets cleaned).
    220   void AddPageNoVisitForBookmark(const GURL& url, const base::string16& title);
    221 
    222   // Sets the title for the given page. The page should be in history. If it
    223   // is not, this operation is ignored.
    224   void SetPageTitle(const GURL& url, const base::string16& title);
    225 
    226   // Updates the history database with a page's ending time stamp information.
    227   // The page can be identified by the combination of the pointer to
    228   // a RenderProcessHost, the page id and the url.
    229   //
    230   // The given pointer will not be dereferenced, it is only used for
    231   // identification purposes, hence it is a void*.
    232   void UpdateWithPageEndTime(const void* host,
    233                              int32 page_id,
    234                              const GURL& url,
    235                              base::Time end_ts);
    236 
    237   // Querying ------------------------------------------------------------------
    238 
    239   // Returns the information about the requested URL. If the URL is found,
    240   // success will be true and the information will be in the URLRow parameter.
    241   // On success, the visits, if requested, will be sorted by date. If they have
    242   // not been requested, the pointer will be valid, but the vector will be
    243   // empty.
    244   //
    245   // If success is false, neither the row nor the vector will be valid.
    246   typedef base::Callback<void(
    247       Handle,
    248       bool,  // Success flag, when false, nothing else is valid.
    249       const history::URLRow*,
    250       history::VisitVector*)> QueryURLCallback;
    251 
    252   // Queries the basic information about the URL in the history database. If
    253   // the caller is interested in the visits (each time the URL is visited),
    254   // set |want_visits| to true. If these are not needed, the function will be
    255   // faster by setting this to false.
    256   Handle QueryURL(const GURL& url,
    257                   bool want_visits,
    258                   CancelableRequestConsumerBase* consumer,
    259                   const QueryURLCallback& callback);
    260 
    261   // Provides the result of a query. See QueryResults in history_types.h.
    262   // The common use will be to use QueryResults.Swap to suck the contents of
    263   // the results out of the passed in parameter and take ownership of them.
    264   typedef base::Callback<void(Handle, history::QueryResults*)>
    265       QueryHistoryCallback;
    266 
    267   // Queries all history with the given options (see QueryOptions in
    268   // history_types.h).  If empty, all results matching the given options
    269   // will be returned.
    270   Handle QueryHistory(const base::string16& text_query,
    271                       const history::QueryOptions& options,
    272                       CancelableRequestConsumerBase* consumer,
    273                       const QueryHistoryCallback& callback);
    274 
    275   // Called when the results of QueryRedirectsFrom are available.
    276   // The given vector will contain a list of all redirects, not counting
    277   // the original page. If A redirects to B, the vector will contain only B,
    278   // and A will be in 'source_url'.
    279   //
    280   // If there is no such URL in the database or the most recent visit has no
    281   // redirect, the vector will be empty. If the history system failed for
    282   // some reason, success will additionally be false. If the given page
    283   // has redirected to multiple destinations, this will pick a random one.
    284   typedef base::Callback<void(Handle,
    285                               GURL,  // from_url
    286                               bool,  // success
    287                               history::RedirectList*)> QueryRedirectsCallback;
    288 
    289   // Schedules a query for the most recent redirect coming out of the given
    290   // URL. See the RedirectQuerySource above, which is guaranteed to be called
    291   // if the request is not canceled.
    292   Handle QueryRedirectsFrom(const GURL& from_url,
    293                             CancelableRequestConsumerBase* consumer,
    294                             const QueryRedirectsCallback& callback);
    295 
    296   // Schedules a query to get the most recent redirects ending at the given
    297   // URL.
    298   Handle QueryRedirectsTo(const GURL& to_url,
    299                           CancelableRequestConsumerBase* consumer,
    300                           const QueryRedirectsCallback& callback);
    301 
    302   typedef base::Callback<
    303       void(Handle,
    304            bool,        // Were we able to determine the # of visits?
    305            int,         // Number of visits.
    306            base::Time)> // Time of first visit. Only set if bool
    307                         // is true and int is > 0.
    308       GetVisibleVisitCountToHostCallback;
    309 
    310   // Requests the number of user-visible visits (i.e. no redirects or subframes)
    311   // to all urls on the same scheme/host/port as |url|.  This is only valid for
    312   // HTTP and HTTPS URLs.
    313   Handle GetVisibleVisitCountToHost(
    314       const GURL& url,
    315       CancelableRequestConsumerBase* consumer,
    316       const GetVisibleVisitCountToHostCallback& callback);
    317 
    318   // Called when QueryTopURLsAndRedirects completes. The vector contains a list
    319   // of the top |result_count| URLs.  For each of these URLs, there is an entry
    320   // in the map containing redirects from the URL.  For example, if we have the
    321   // redirect chain A -> B -> C and A is a top visited URL, then A will be in
    322   // the vector and "A => {B -> C}" will be in the map.
    323   typedef base::Callback<
    324       void(Handle,
    325            bool,  // Did we get the top urls and redirects?
    326            std::vector<GURL>*,  // List of top URLs.
    327            history::RedirectMap*)>  // Redirects for top URLs.
    328       QueryTopURLsAndRedirectsCallback;
    329 
    330   // Request the top |result_count| most visited URLs and the chain of redirects
    331   // leading to each of these URLs.
    332   // TODO(Nik): remove this. Use QueryMostVisitedURLs instead.
    333   Handle QueryTopURLsAndRedirects(
    334       int result_count,
    335       CancelableRequestConsumerBase* consumer,
    336       const QueryTopURLsAndRedirectsCallback& callback);
    337 
    338   typedef base::Callback<void(Handle, history::MostVisitedURLList)>
    339       QueryMostVisitedURLsCallback;
    340 
    341   typedef base::Callback<void(Handle, const history::FilteredURLList&)>
    342       QueryFilteredURLsCallback;
    343 
    344   // Request the |result_count| most visited URLs and the chain of
    345   // redirects leading to each of these URLs. |days_back| is the
    346   // number of days of history to use. Used by TopSites.
    347   Handle QueryMostVisitedURLs(int result_count, int days_back,
    348                               CancelableRequestConsumerBase* consumer,
    349                               const QueryMostVisitedURLsCallback& callback);
    350 
    351   // Request the |result_count| URLs filtered and sorted based on the |filter|.
    352   // If |extended_info| is true, additional data will be provided in the
    353   // results. Computing this additional data is expensive, likely to become
    354   // more expensive as additional data points are added in future changes, and
    355   // not useful in most cases. Set |extended_info| to true only if you
    356   // explicitly require the additional data.
    357   Handle QueryFilteredURLs(
    358       int result_count,
    359       const history::VisitFilter& filter,
    360       bool extended_info,
    361       CancelableRequestConsumerBase* consumer,
    362       const QueryFilteredURLsCallback& callback);
    363 
    364   // Database management operations --------------------------------------------
    365 
    366   // Delete all the information related to a single url.
    367   void DeleteURL(const GURL& url);
    368 
    369   // Delete all the information related to a list of urls.  (Deleting
    370   // URLs one by one is slow as it has to flush to disk each time.)
    371   void DeleteURLsForTest(const std::vector<GURL>& urls);
    372 
    373   // Removes all visits in the selected time range (including the
    374   // start time), updating the URLs accordingly. This deletes any
    375   // associated data. This function also deletes the associated
    376   // favicons, if they are no longer referenced. |callback| runs when
    377   // the expiration is complete. You may use null Time values to do an
    378   // unbounded delete in either direction.
    379   // If |restrict_urls| is not empty, only visits to the URLs in this set are
    380   // removed.
    381   void ExpireHistoryBetween(const std::set<GURL>& restrict_urls,
    382                             base::Time begin_time,
    383                             base::Time end_time,
    384                             const base::Closure& callback,
    385                             CancelableTaskTracker* tracker);
    386 
    387   // Removes all visits to specified URLs in specific time ranges.
    388   // This is the equivalent ExpireHistoryBetween() once for each element in the
    389   // vector. The fields of |ExpireHistoryArgs| map directly to the arguments of
    390   // of ExpireHistoryBetween().
    391   void ExpireHistory(const std::vector<history::ExpireHistoryArgs>& expire_list,
    392                      const base::Closure& callback,
    393                      CancelableTaskTracker* tracker);
    394 
    395   // Removes all visits to the given URLs in the specified time range. Calls
    396   // ExpireHistoryBetween() to delete local visits, and handles deletion of
    397   // synced visits if appropriate.
    398   void ExpireLocalAndRemoteHistoryBetween(
    399       const std::set<GURL>& restrict_urls,
    400       base::Time begin_time,
    401       base::Time end_time,
    402       const base::Closure& callback,
    403       CancelableTaskTracker* tracker);
    404 
    405   // Processes the given |delete_directive| and sends it to the
    406   // SyncChangeProcessor (if it exists).  Returns any error resulting
    407   // from sending the delete directive to sync.
    408   syncer::SyncError ProcessLocalDeleteDirective(
    409       const sync_pb::HistoryDeleteDirectiveSpecifics& delete_directive);
    410 
    411   // Downloads -----------------------------------------------------------------
    412 
    413   // Implemented by the caller of 'CreateDownload' below, and is called when the
    414   // history service has created a new entry for a download in the history db.
    415   typedef base::Callback<void(bool)> DownloadCreateCallback;
    416 
    417   // Begins a history request to create a new row for a download. 'info'
    418   // contains all the download's creation state, and 'callback' runs when the
    419   // history service request is complete. The callback is called on the thread
    420   // that calls CreateDownload().
    421   void CreateDownload(
    422       const history::DownloadRow& info,
    423       const DownloadCreateCallback& callback);
    424 
    425   // Responds on the calling thread with the maximum id of all downloads records
    426   // in the database plus 1.
    427   void GetNextDownloadId(const content::DownloadIdCallback& callback);
    428 
    429   // Implemented by the caller of 'QueryDownloads' below, and is called when the
    430   // history service has retrieved a list of all download state. The call
    431   typedef base::Callback<void(
    432       scoped_ptr<std::vector<history::DownloadRow> >)>
    433           DownloadQueryCallback;
    434 
    435   // Begins a history request to retrieve the state of all downloads in the
    436   // history db. 'callback' runs when the history service request is complete,
    437   // at which point 'info' contains an array of history::DownloadRow, one per
    438   // download. The callback is called on the thread that calls QueryDownloads().
    439   void QueryDownloads(const DownloadQueryCallback& callback);
    440 
    441   // Called to update the history service about the current state of a download.
    442   // This is a 'fire and forget' query, so just pass the relevant state info to
    443   // the database with no need for a callback.
    444   void UpdateDownload(const history::DownloadRow& data);
    445 
    446   // Permanently remove some downloads from the history system. This is a 'fire
    447   // and forget' operation.
    448   void RemoveDownloads(const std::set<uint32>& ids);
    449 
    450   // Visit Segments ------------------------------------------------------------
    451 
    452   typedef base::Callback<void(Handle, std::vector<PageUsageData*>*)>
    453       SegmentQueryCallback;
    454 
    455   // Query usage data for all visit segments since the provided time.
    456   //
    457   // The request is performed asynchronously and can be cancelled by using the
    458   // returned handle.
    459   //
    460   // The vector provided to the callback and its contents is owned by the
    461   // history system. It will be deeply deleted after the callback is invoked.
    462   // If you want to preserve any PageUsageData instance, simply remove them
    463   // from the vector.
    464   //
    465   // The vector contains a list of PageUsageData. Each PageUsageData ID is set
    466   // to the segment ID. The URL and all the other information is set to the page
    467   // representing the segment.
    468   Handle QuerySegmentUsageSince(CancelableRequestConsumerBase* consumer,
    469                                 const base::Time from_time,
    470                                 int max_result_count,
    471                                 const SegmentQueryCallback& callback);
    472 
    473   // Increases the amount of time the user actively viewed the url.
    474   void IncreaseSegmentDuration(const GURL& url,
    475                                base::Time time,
    476                                base::TimeDelta delta);
    477 
    478   // Queries segments based on active time viewed.
    479   Handle QuerySegmentDurationSince(CancelableRequestConsumerBase* consumer,
    480                                    base::Time from_time,
    481                                    int max_result_count,
    482                                    const SegmentQueryCallback& callback);
    483 
    484   // Keyword search terms -----------------------------------------------------
    485 
    486   // Sets the search terms for the specified url and keyword. url_id gives the
    487   // id of the url, keyword_id the id of the keyword and term the search term.
    488   void SetKeywordSearchTermsForURL(const GURL& url,
    489                                    TemplateURLID keyword_id,
    490                                    const base::string16& term);
    491 
    492   // Deletes all search terms for the specified keyword.
    493   void DeleteAllSearchTermsForKeyword(TemplateURLID keyword_id);
    494 
    495   typedef base::Callback<
    496       void(Handle, std::vector<history::KeywordSearchTermVisit>*)>
    497           GetMostRecentKeywordSearchTermsCallback;
    498 
    499   // Returns up to max_count of the most recent search terms starting with the
    500   // specified text. The matching is case insensitive. The results are ordered
    501   // in descending order up to |max_count| with the most recent search term
    502   // first.
    503   Handle GetMostRecentKeywordSearchTerms(
    504       TemplateURLID keyword_id,
    505       const base::string16& prefix,
    506       int max_count,
    507       CancelableRequestConsumerBase* consumer,
    508       const GetMostRecentKeywordSearchTermsCallback& callback);
    509 
    510   // Deletes any search term corresponding to |url|.
    511   void DeleteKeywordSearchTermForURL(const GURL& url);
    512 
    513   // Deletes all URL and search term entries matching the given |term| and
    514   // |keyword_id|.
    515   void DeleteMatchingURLsForKeyword(TemplateURLID keyword_id,
    516                                     const base::string16& term);
    517 
    518   // Bookmarks -----------------------------------------------------------------
    519 
    520   // Notification that a URL is no longer bookmarked.
    521   void URLsNoLongerBookmarked(const std::set<GURL>& urls);
    522 
    523   // Generic Stuff -------------------------------------------------------------
    524 
    525   // Schedules a HistoryDBTask for running on the history backend thread. See
    526   // HistoryDBTask for details on what this does.
    527   virtual void ScheduleDBTask(history::HistoryDBTask* task,
    528                               CancelableRequestConsumerBase* consumer);
    529 
    530   // Adds or removes observers for the VisitDatabase.
    531   void AddVisitDatabaseObserver(history::VisitDatabaseObserver* observer);
    532   void RemoveVisitDatabaseObserver(history::VisitDatabaseObserver* observer);
    533 
    534   void NotifyVisitDBObserversOnAddVisit(const history::BriefVisitInfo& info);
    535 
    536   // Testing -------------------------------------------------------------------
    537 
    538   // Runs |flushed| after bouncing off the history thread.
    539   void FlushForTest(const base::Closure& flushed);
    540 
    541   // Designed for unit tests, this passes the given task on to the history
    542   // backend to be called once the history backend has terminated. This allows
    543   // callers to know when the history thread is complete and the database files
    544   // can be deleted and the next test run. Otherwise, the history thread may
    545   // still be running, causing problems in subsequent tests.
    546   //
    547   // There can be only one closing task, so this will override any previously
    548   // set task. We will take ownership of the pointer and delete it when done.
    549   // The task will be run on the calling thread (this function is threadsafe).
    550   void SetOnBackendDestroyTask(const base::Closure& task);
    551 
    552   // Used for unit testing and potentially importing to get known information
    553   // into the database. This assumes the URL doesn't exist in the database
    554   //
    555   // Calling this function many times may be slow because each call will
    556   // dispatch to the history thread and will be a separate database
    557   // transaction. If this functionality is needed for importing many URLs,
    558   // callers should use AddPagesWithDetails() instead.
    559   //
    560   // Note that this routine (and AddPageWithDetails()) always adds a single
    561   // visit using the |last_visit| timestamp, and a PageTransition type of LINK,
    562   // if |visit_source| != SYNCED.
    563   void AddPageWithDetails(const GURL& url,
    564                           const base::string16& title,
    565                           int visit_count,
    566                           int typed_count,
    567                           base::Time last_visit,
    568                           bool hidden,
    569                           history::VisitSource visit_source);
    570 
    571   // The same as AddPageWithDetails() but takes a vector.
    572   void AddPagesWithDetails(const history::URLRows& info,
    573                            history::VisitSource visit_source);
    574 
    575   // Returns true if this looks like the type of URL we want to add to the
    576   // history. We filter out some URLs such as JavaScript.
    577   static bool CanAddURL(const GURL& url);
    578 
    579   base::WeakPtr<HistoryService> AsWeakPtr();
    580 
    581   // syncer::SyncableService implementation.
    582   virtual syncer::SyncMergeResult MergeDataAndStartSyncing(
    583       syncer::ModelType type,
    584       const syncer::SyncDataList& initial_sync_data,
    585       scoped_ptr<syncer::SyncChangeProcessor> sync_processor,
    586       scoped_ptr<syncer::SyncErrorFactory> error_handler) OVERRIDE;
    587   virtual void StopSyncing(syncer::ModelType type) OVERRIDE;
    588   virtual syncer::SyncDataList GetAllSyncData(
    589       syncer::ModelType type) const OVERRIDE;
    590   virtual syncer::SyncError ProcessSyncChanges(
    591       const tracked_objects::Location& from_here,
    592       const syncer::SyncChangeList& change_list) OVERRIDE;
    593 
    594  protected:
    595   // These are not currently used, hopefully we can do something in the future
    596   // to ensure that the most important things happen first.
    597   enum SchedulePriority {
    598     PRIORITY_UI,      // The highest priority (must respond to UI events).
    599     PRIORITY_NORMAL,  // Normal stuff like adding a page.
    600     PRIORITY_LOW,     // Low priority things like indexing or expiration.
    601   };
    602 
    603  private:
    604   class BackendDelegate;
    605 #if defined(OS_ANDROID)
    606   friend class AndroidHistoryProviderService;
    607 #endif
    608   friend class base::RefCountedThreadSafe<HistoryService>;
    609   friend class BackendDelegate;
    610   friend class FaviconService;
    611   friend class history::HistoryBackend;
    612   friend class history::HistoryQueryTest;
    613   friend class HistoryOperation;
    614   friend class HistoryQuickProviderTest;
    615   friend class HistoryURLProvider;
    616   friend class HistoryURLProviderTest;
    617   friend class history::InMemoryURLIndexTest;
    618   template<typename Info, typename Callback> friend class DownloadRequest;
    619   friend class PageUsageRequest;
    620   friend class RedirectRequest;
    621   friend class TestingProfile;
    622 
    623   // Implementation of content::NotificationObserver.
    624   virtual void Observe(int type,
    625                        const content::NotificationSource& source,
    626                        const content::NotificationDetails& details) OVERRIDE;
    627 
    628   // Implementation of visitedlink::VisitedLinkDelegate.
    629   virtual void RebuildTable(
    630       const scoped_refptr<URLEnumerator>& enumerator) OVERRIDE;
    631 
    632   // Low-level Init().  Same as the public version, but adds a |no_db| parameter
    633   // that is only set by unittests which causes the backend to not init its DB.
    634   bool Init(const base::FilePath& history_dir,
    635             BookmarkService* bookmark_service,
    636             bool no_db);
    637 
    638   // Called by the HistoryURLProvider class to schedule an autocomplete, it
    639   // will be called back on the internal history thread with the history
    640   // database so it can query. See history_autocomplete.cc for a diagram.
    641   void ScheduleAutocomplete(HistoryURLProvider* provider,
    642                             HistoryURLProviderParams* params);
    643 
    644   // Broadcasts the given notification. This is called by the backend so that
    645   // the notification will be broadcast on the main thread.
    646   //
    647   // Compared to BroadcastNotifications(), this function does not take
    648   // ownership of |details|.
    649   void BroadcastNotificationsHelper(int type,
    650                                     history::HistoryDetails* details);
    651 
    652   // Initializes the backend.
    653   void LoadBackendIfNecessary();
    654 
    655   // Notification from the backend that it has finished loading. Sends
    656   // notification (NOTIFY_HISTORY_LOADED) and sets backend_loaded_ to true.
    657   void OnDBLoaded(int backend_id);
    658 
    659   // Helper function for getting URL information.
    660   // Reads a URLRow from in-memory database. Returns false if database is not
    661   // available or the URL does not exist.
    662   bool GetRowForURL(const GURL& url, history::URLRow* url_row);
    663 
    664   // Favicon -------------------------------------------------------------------
    665 
    666   // These favicon methods are exposed to the FaviconService. Instead of calling
    667   // these methods directly you should call the respective method on the
    668   // FaviconService.
    669 
    670   // Used by FaviconService to get the favicon bitmaps from the history backend
    671   // which most closely match |desired_size_in_dip| x |desired_size_in_dip| and
    672   // |desired_scale_factors| for |icon_types|. If |desired_size_in_dip| is 0,
    673   // the largest favicon bitmap for |icon_types| is returned. The returned
    674   // FaviconBitmapResults will have at most one result for each of
    675   // |desired_scale_factors|. If a favicon bitmap is determined to be the best
    676   // candidate for multiple scale factors there will be less results.
    677   // If |icon_types| has several types, results for only a single type will be
    678   // returned in the priority of TOUCH_PRECOMPOSED_ICON, TOUCH_ICON, and
    679   // FAVICON.
    680   CancelableTaskTracker::TaskId GetFavicons(
    681       const std::vector<GURL>& icon_urls,
    682       int icon_types,
    683       int desired_size_in_dip,
    684       const std::vector<ui::ScaleFactor>& desired_scale_factors,
    685       const FaviconService::FaviconResultsCallback& callback,
    686       CancelableTaskTracker* tracker);
    687 
    688   // Used by the FaviconService to get favicons mapped to |page_url| for
    689   // |icon_types| which most closely match |desired_size_in_dip| and
    690   // |desired_scale_factors|. If |desired_size_in_dip| is 0, the largest favicon
    691   // bitmap for |icon_types| is returned. The returned FaviconBitmapResults will
    692   // have at most one result for each of |desired_scale_factors|. If a favicon
    693   // bitmap is determined to be the best candidate for multiple scale factors
    694   // there will be less results. If |icon_types| has several types, results for
    695   // only a single type will be returned in the priority of
    696   // TOUCH_PRECOMPOSED_ICON, TOUCH_ICON, and FAVICON.
    697   CancelableTaskTracker::TaskId GetFaviconsForURL(
    698       const GURL& page_url,
    699       int icon_types,
    700       int desired_size_in_dip,
    701       const std::vector<ui::ScaleFactor>& desired_scale_factors,
    702       const FaviconService::FaviconResultsCallback& callback,
    703       CancelableTaskTracker* tracker);
    704 
    705   // Used by FaviconService to find the first favicon bitmap whose width and
    706   // height are greater than that of |minimum_size_in_pixels|. This searches
    707   // for icons by IconType. Each element of |icon_types| is a bitmask of
    708   // IconTypes indicating the types to search for.
    709   // If the largest icon of |icon_types[0]| is not larger than
    710   // |minimum_size_in_pixel|, the next icon types of
    711   // |icon_types| will be searched and so on.
    712   // If no icon is larger than |minimum_size_in_pixel|, the largest one of all
    713   // icon types in |icon_types| is returned.
    714   // This feature is especially useful when some types of icon is perfered as
    715   // long as its size is larger than a specific value.
    716   CancelableTaskTracker::TaskId GetLargestFaviconForURL(
    717       const GURL& page_url,
    718       const std::vector<int>& icon_types,
    719       int minimum_size_in_pixels,
    720       const FaviconService::FaviconRawCallback& callback,
    721       CancelableTaskTracker* tracker);
    722 
    723   // Used by the FaviconService to get the favicon bitmap which most closely
    724   // matches |desired_size_in_dip| and |desired_scale_factor| from the favicon
    725   // with |favicon_id| from the history backend. If |desired_size_in_dip| is 0,
    726   // the largest favicon bitmap for |favicon_id| is returned.
    727   CancelableTaskTracker::TaskId GetFaviconForID(
    728       chrome::FaviconID favicon_id,
    729       int desired_size_in_dip,
    730       ui::ScaleFactor desired_scale_factor,
    731       const FaviconService::FaviconResultsCallback& callback,
    732       CancelableTaskTracker* tracker);
    733 
    734   // Used by the FaviconService to replace the favicon mappings to |page_url|
    735   // for |icon_types| on the history backend.
    736   // Sample |icon_urls|:
    737   //  { ICON_URL1 -> TOUCH_ICON, known to the database,
    738   //    ICON_URL2 -> TOUCH_ICON, not known to the database,
    739   //    ICON_URL3 -> TOUCH_PRECOMPOSED_ICON, known to the database }
    740   // The new mappings are computed from |icon_urls| with these rules:
    741   // 1) Any urls in |icon_urls| which are not already known to the database are
    742   //    rejected.
    743   //    Sample new mappings to |page_url|: { ICON_URL1, ICON_URL3 }
    744   // 2) If |icon_types| has multiple types, the mappings are only set for the
    745   //    largest icon type.
    746   //    Sample new mappings to |page_url|: { ICON_URL3 }
    747   // |icon_types| can only have multiple IconTypes if
    748   // |icon_types| == TOUCH_ICON | TOUCH_PRECOMPOSED_ICON.
    749   // The favicon bitmaps which most closely match |desired_size_in_dip|
    750   // and |desired_scale_factors| from the favicons which were just mapped
    751   // to |page_url| are returned. If |desired_size_in_dip| is 0, the
    752   // largest favicon bitmap is returned.
    753   CancelableTaskTracker::TaskId UpdateFaviconMappingsAndFetch(
    754       const GURL& page_url,
    755       const std::vector<GURL>& icon_urls,
    756       int icon_types,
    757       int desired_size_in_dip,
    758       const std::vector<ui::ScaleFactor>& desired_scale_factors,
    759       const FaviconService::FaviconResultsCallback& callback,
    760       CancelableTaskTracker* tracker);
    761 
    762   // Used by FaviconService to set a favicon for |page_url| and |icon_url| with
    763   // |pixel_size|.
    764   // Example:
    765   //   |page_url|: www.google.com
    766   // 2 favicons in history for |page_url|:
    767   //   www.google.com/a.ico  16x16
    768   //   www.google.com/b.ico  32x32
    769   // MergeFavicon(|page_url|, www.google.com/a.ico, ..., ..., 16x16)
    770   //
    771   // Merging occurs in the following manner:
    772   // 1) |page_url| is set to map to only to |icon_url|. In order to not lose
    773   //    data, favicon bitmaps mapped to |page_url| but not to |icon_url| are
    774   //    copied to the favicon at |icon_url|.
    775   //    For the example above, |page_url| will only be mapped to a.ico.
    776   //    The 32x32 favicon bitmap at b.ico is copied to a.ico
    777   // 2) |bitmap_data| is added to the favicon at |icon_url|, overwriting any
    778   //    favicon bitmaps of |pixel_size|.
    779   //    For the example above, |bitmap_data| overwrites the 16x16 favicon
    780   //    bitmap for a.ico.
    781   // TODO(pkotwicz): Remove once no longer required by sync.
    782   void MergeFavicon(const GURL& page_url,
    783                     const GURL& icon_url,
    784                     chrome::IconType icon_type,
    785                     scoped_refptr<base::RefCountedMemory> bitmap_data,
    786                     const gfx::Size& pixel_size);
    787 
    788   // Used by the FaviconService to set the favicons for a page on the history
    789   // backend.
    790   // |favicon_bitmap_data| replaces all the favicon bitmaps mapped to
    791   // |page_url|.
    792   // |expired| and |icon_type| fields in FaviconBitmapData are ignored.
    793   // Use MergeFavicon() if |favicon_bitmap_data| is incomplete, and favicon
    794   // bitmaps in the database should be preserved if possible. For instance,
    795   // favicon bitmaps from sync are 1x only. MergeFavicon() is used to avoid
    796   // deleting the 2x favicon bitmap if it is present in the history backend.
    797   // See HistoryBackend::ValidateSetFaviconsParams() for more details on the
    798   // criteria for |favicon_bitmap_data| to be valid.
    799   void SetFavicons(
    800       const GURL& page_url,
    801       chrome::IconType icon_type,
    802       const std::vector<chrome::FaviconBitmapData>& favicon_bitmap_data);
    803 
    804   // Used by the FaviconService to mark the favicon for the page as being out
    805   // of date.
    806   void SetFaviconsOutOfDateForPage(const GURL& page_url);
    807 
    808   // Used by the FaviconService to clone favicons from one page to another,
    809   // provided that other page does not already have favicons.
    810   void CloneFavicons(const GURL& old_page_url, const GURL& new_page_url);
    811 
    812   // Used by the FaviconService for importing many favicons for many pages at
    813   // once. The pages must exist, any favicon sets for unknown pages will be
    814   // discarded. Existing favicons will not be overwritten.
    815   void SetImportedFavicons(
    816       const std::vector<ImportedFaviconUsage>& favicon_usage);
    817 
    818   // Sets the in-memory URL database. This is called by the backend once the
    819   // database is loaded to make it available.
    820   void SetInMemoryBackend(
    821       int backend_id,
    822       scoped_ptr<history::InMemoryHistoryBackend> mem_backend);
    823 
    824   // Called by our BackendDelegate when there is a problem reading the database.
    825   void NotifyProfileError(int backend_id, sql::InitStatus init_status);
    826 
    827   // Call to schedule a given task for running on the history thread with the
    828   // specified priority. The task will have ownership taken.
    829   void ScheduleTask(SchedulePriority priority, const base::Closure& task);
    830 
    831   // Schedule ------------------------------------------------------------------
    832   //
    833   // Functions for scheduling operations on the history thread that have a
    834   // handle and may be cancelable. For fire-and-forget operations, see
    835   // ScheduleAndForget below.
    836 
    837   template<typename BackendFunc, class RequestType>
    838   Handle Schedule(SchedulePriority priority,
    839                   BackendFunc func,  // Function to call on the HistoryBackend.
    840                   CancelableRequestConsumerBase* consumer,
    841                   RequestType* request) {
    842     DCHECK(thread_) << "History service being called after cleanup";
    843     DCHECK(thread_checker_.CalledOnValidThread());
    844     LoadBackendIfNecessary();
    845     if (consumer)
    846       AddRequest(request, consumer);
    847     ScheduleTask(priority,
    848                  base::Bind(func, history_backend_.get(),
    849                             scoped_refptr<RequestType>(request)));
    850     return request->handle();
    851   }
    852 
    853   template<typename BackendFunc, class RequestType, typename ArgA>
    854   Handle Schedule(SchedulePriority priority,
    855                   BackendFunc func,  // Function to call on the HistoryBackend.
    856                   CancelableRequestConsumerBase* consumer,
    857                   RequestType* request,
    858                   const ArgA& a) {
    859     DCHECK(thread_) << "History service being called after cleanup";
    860     DCHECK(thread_checker_.CalledOnValidThread());
    861     LoadBackendIfNecessary();
    862     if (consumer)
    863       AddRequest(request, consumer);
    864     ScheduleTask(priority,
    865                  base::Bind(func, history_backend_.get(),
    866                             scoped_refptr<RequestType>(request), a));
    867     return request->handle();
    868   }
    869 
    870   template<typename BackendFunc,
    871            class RequestType,  // Descendant of CancelableRequestBase.
    872            typename ArgA,
    873            typename ArgB>
    874   Handle Schedule(SchedulePriority priority,
    875                   BackendFunc func,  // Function to call on the HistoryBackend.
    876                   CancelableRequestConsumerBase* consumer,
    877                   RequestType* request,
    878                   const ArgA& a,
    879                   const ArgB& b) {
    880     DCHECK(thread_) << "History service being called after cleanup";
    881     DCHECK(thread_checker_.CalledOnValidThread());
    882     LoadBackendIfNecessary();
    883     if (consumer)
    884       AddRequest(request, consumer);
    885     ScheduleTask(priority,
    886                  base::Bind(func, history_backend_.get(),
    887                             scoped_refptr<RequestType>(request), a, b));
    888     return request->handle();
    889   }
    890 
    891   template<typename BackendFunc,
    892            class RequestType,  // Descendant of CancelableRequestBase.
    893            typename ArgA,
    894            typename ArgB,
    895            typename ArgC>
    896   Handle Schedule(SchedulePriority priority,
    897                   BackendFunc func,  // Function to call on the HistoryBackend.
    898                   CancelableRequestConsumerBase* consumer,
    899                   RequestType* request,
    900                   const ArgA& a,
    901                   const ArgB& b,
    902                   const ArgC& c) {
    903     DCHECK(thread_) << "History service being called after cleanup";
    904     DCHECK(thread_checker_.CalledOnValidThread());
    905     LoadBackendIfNecessary();
    906     if (consumer)
    907       AddRequest(request, consumer);
    908     ScheduleTask(priority,
    909                  base::Bind(func, history_backend_.get(),
    910                             scoped_refptr<RequestType>(request), a, b, c));
    911     return request->handle();
    912   }
    913 
    914   template<typename BackendFunc,
    915            class RequestType,  // Descendant of CancelableRequestBase.
    916            typename ArgA,
    917            typename ArgB,
    918            typename ArgC,
    919            typename ArgD>
    920   Handle Schedule(SchedulePriority priority,
    921                   BackendFunc func,  // Function to call on the HistoryBackend.
    922                   CancelableRequestConsumerBase* consumer,
    923                   RequestType* request,
    924                   const ArgA& a,
    925                   const ArgB& b,
    926                   const ArgC& c,
    927                   const ArgD& d) {
    928     DCHECK(thread_) << "History service being called after cleanup";
    929     DCHECK(thread_checker_.CalledOnValidThread());
    930     LoadBackendIfNecessary();
    931     if (consumer)
    932       AddRequest(request, consumer);
    933     ScheduleTask(priority,
    934                  base::Bind(func, history_backend_.get(),
    935                             scoped_refptr<RequestType>(request), a, b, c, d));
    936     return request->handle();
    937   }
    938 
    939   // ScheduleAndForget ---------------------------------------------------------
    940   //
    941   // Functions for scheduling operations on the history thread that do not need
    942   // any callbacks and are not cancelable.
    943 
    944   template<typename BackendFunc>
    945   void ScheduleAndForget(SchedulePriority priority,
    946                          BackendFunc func) {  // Function to call on backend.
    947     DCHECK(thread_) << "History service being called after cleanup";
    948     DCHECK(thread_checker_.CalledOnValidThread());
    949     LoadBackendIfNecessary();
    950     ScheduleTask(priority, base::Bind(func, history_backend_.get()));
    951   }
    952 
    953   template<typename BackendFunc, typename ArgA>
    954   void ScheduleAndForget(SchedulePriority priority,
    955                          BackendFunc func,  // Function to call on backend.
    956                          const ArgA& a) {
    957     DCHECK(thread_) << "History service being called after cleanup";
    958     DCHECK(thread_checker_.CalledOnValidThread());
    959     LoadBackendIfNecessary();
    960     ScheduleTask(priority, base::Bind(func, history_backend_.get(), a));
    961   }
    962 
    963   template<typename BackendFunc, typename ArgA, typename ArgB>
    964   void ScheduleAndForget(SchedulePriority priority,
    965                          BackendFunc func,  // Function to call on backend.
    966                          const ArgA& a,
    967                          const ArgB& b) {
    968     DCHECK(thread_) << "History service being called after cleanup";
    969     DCHECK(thread_checker_.CalledOnValidThread());
    970     LoadBackendIfNecessary();
    971     ScheduleTask(priority, base::Bind(func, history_backend_.get(), a, b));
    972   }
    973 
    974   template<typename BackendFunc, typename ArgA, typename ArgB, typename ArgC>
    975   void ScheduleAndForget(SchedulePriority priority,
    976                          BackendFunc func,  // Function to call on backend.
    977                          const ArgA& a,
    978                          const ArgB& b,
    979                          const ArgC& c) {
    980     DCHECK(thread_) << "History service being called after cleanup";
    981     DCHECK(thread_checker_.CalledOnValidThread());
    982     LoadBackendIfNecessary();
    983     ScheduleTask(priority, base::Bind(func, history_backend_.get(), a, b, c));
    984   }
    985 
    986   template<typename BackendFunc,
    987            typename ArgA,
    988            typename ArgB,
    989            typename ArgC,
    990            typename ArgD>
    991   void ScheduleAndForget(SchedulePriority priority,
    992                          BackendFunc func,  // Function to call on backend.
    993                          const ArgA& a,
    994                          const ArgB& b,
    995                          const ArgC& c,
    996                          const ArgD& d) {
    997     DCHECK(thread_) << "History service being called after cleanup";
    998     DCHECK(thread_checker_.CalledOnValidThread());
    999     LoadBackendIfNecessary();
   1000     ScheduleTask(priority, base::Bind(func, history_backend_.get(),
   1001                                       a, b, c, d));
   1002   }
   1003 
   1004   template<typename BackendFunc,
   1005            typename ArgA,
   1006            typename ArgB,
   1007            typename ArgC,
   1008            typename ArgD,
   1009            typename ArgE>
   1010   void ScheduleAndForget(SchedulePriority priority,
   1011                          BackendFunc func,  // Function to call on backend.
   1012                          const ArgA& a,
   1013                          const ArgB& b,
   1014                          const ArgC& c,
   1015                          const ArgD& d,
   1016                          const ArgE& e) {
   1017     DCHECK(thread_) << "History service being called after cleanup";
   1018     DCHECK(thread_checker_.CalledOnValidThread());
   1019     LoadBackendIfNecessary();
   1020     ScheduleTask(priority, base::Bind(func, history_backend_.get(),
   1021                                       a, b, c, d, e));
   1022   }
   1023 
   1024   // All vended weak pointers are invalidated in Cleanup().
   1025   base::WeakPtrFactory<HistoryService> weak_ptr_factory_;
   1026 
   1027   base::ThreadChecker thread_checker_;
   1028 
   1029   content::NotificationRegistrar registrar_;
   1030 
   1031   // Some void primitives require some internal processing in the main thread
   1032   // when done. We use this internal consumer for this purpose.
   1033   CancelableRequestConsumer internal_consumer_;
   1034 
   1035   // The thread used by the history service to run complicated operations.
   1036   // |thread_| is NULL once |Cleanup| is NULL.
   1037   base::Thread* thread_;
   1038 
   1039   // This class has most of the implementation and runs on the 'thread_'.
   1040   // You MUST communicate with this class ONLY through the thread_'s
   1041   // message_loop().
   1042   //
   1043   // This pointer will be NULL once Cleanup() has been called, meaning no
   1044   // more calls should be made to the history thread.
   1045   scoped_refptr<history::HistoryBackend> history_backend_;
   1046 
   1047   // A cache of the user-typed URLs kept in memory that is used by the
   1048   // autocomplete system. This will be NULL until the database has been created
   1049   // on the background thread.
   1050   // TODO(mrossetti): Consider changing ownership. See http://crbug.com/138321
   1051   scoped_ptr<history::InMemoryHistoryBackend> in_memory_backend_;
   1052 
   1053   // The profile, may be null when testing.
   1054   Profile* profile_;
   1055 
   1056   // Used for propagating link highlighting data across renderers. May be null
   1057   // in tests.
   1058   scoped_ptr<visitedlink::VisitedLinkMaster> visitedlink_master_;
   1059 
   1060   // Has the backend finished loading? The backend is loaded once Init has
   1061   // completed.
   1062   bool backend_loaded_;
   1063 
   1064   // The id of the current backend. This is only valid when history_backend_
   1065   // is not NULL.
   1066   int current_backend_id_;
   1067 
   1068   // Cached values from Init(), used whenever we need to reload the backend.
   1069   base::FilePath history_dir_;
   1070   BookmarkService* bookmark_service_;
   1071   bool no_db_;
   1072 
   1073   // The index used for quick history lookups.
   1074   // TODO(mrossetti): Move in_memory_url_index out of history_service.
   1075   // See http://crbug.com/138321
   1076   scoped_ptr<history::InMemoryURLIndex> in_memory_url_index_;
   1077 
   1078   ObserverList<history::VisitDatabaseObserver> visit_database_observers_;
   1079 
   1080   history::DeleteDirectiveHandler delete_directive_handler_;
   1081 
   1082   DISALLOW_COPY_AND_ASSIGN(HistoryService);
   1083 };
   1084 
   1085 #endif  // CHROME_BROWSER_HISTORY_HISTORY_SERVICE_H_
   1086