15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_HISTORY_HISTORY_TYPES_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_HISTORY_HISTORY_TYPES_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <deque>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/containers/stack_container.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted_memory.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_vector.h"
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/snippet.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_id.h"
229ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "chrome/common/favicon/favicon_types.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/ref_counted_util.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/thumbnail_score.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/page_transition_types.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h"
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PageUsageData;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace history {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Forward declaration for friend statements.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HistoryBackend;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLDatabase;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Structure to hold redirect lists for URLs.  For a redirect chain
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A -> B -> C, and entry in the map would look like "A => {B -> C}".
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::map<GURL, scoped_refptr<RefCountedVector<GURL> > > RedirectMap;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Container for a list of URLs.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<GURL> RedirectList;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int64 FaviconBitmapID; // Identifier for a bitmap in a favicon.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int64 SegmentID;  // URL segments for the most visited view.
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef int64 SegmentDurationID;  // Unique identifier for segment_duration.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int64 IconMappingID; // For page url and icon mapping.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URLRow ---------------------------------------------------------------------
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int64 URLID;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Holds all information globally associated with one URL (one row in the
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URL table).
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This keeps track of dirty bits, which are currently unused:
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(brettw) the dirty bits are broken in a number of respects. First, the
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// database will want to update them on a const object, so they need to be
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// mutable.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Second, there is a problem copying. If you make a copy of this structure
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (as we allow since we put this into vectors in various places) then the
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dirty bits will not be in sync for these copies.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRow {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRow();
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit URLRow(const GURL& url);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We need to be able to set the id of a URLRow that's being passed through
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // an IPC message.  This constructor should probably not be used otherwise.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRow(const GURL& url, URLID id);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~URLRow();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRow& operator=(const URLRow& other);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLID id() const { return id_; }
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the id of the row. The id should only be manually set when a row has
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // been retrieved from the history database or other dataset based on criteria
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // other than its id (i.e. by URL) and when the id has not yet been set in the
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // row.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_id(URLID id) { id_ = id; }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL& url() const { return url_; }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16& title() const {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return title_;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_title(const string16& title) {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The title is frequently set to the same thing, so we don't bother
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // updating unless the string has changed.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (title != title_) {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      title_ = title;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The number of times this URL has been visited. This will often match the
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // number of entries in the visit table for this URL, but won't always. It's
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // really designed for autocomplete ranking, so some "useless" transitions
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // from the visit table aren't counted in this tally.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int visit_count() const {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return visit_count_;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_visit_count(int visit_count) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    visit_count_ = visit_count;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Number of times the URL was typed in the Omnibox. This "should" match
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the number of TYPED transitions in the visit table. It's used primarily
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for faster autocomplete ranking. If you need to know the actual number of
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TYPED transitions, you should query the visit table since there could be
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // something out of sync.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int typed_count() const {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return typed_count_;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_typed_count(int typed_count) {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typed_count_ = typed_count;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time last_visit() const {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return last_visit_;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_last_visit(base::Time last_visit) {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_visit_ = last_visit;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If this is set, we won't autocomplete this URL.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool hidden() const {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return hidden_;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_hidden(bool hidden) {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    hidden_ = hidden;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper functor that determines if an URLRow refers to a given URL.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class URLRowHasURL {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit URLRowHasURL(const GURL& url) : url_(url) {}
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool operator()(const URLRow& row) {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return row.url() == url_;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url_;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Swaps the contents of this URLRow with another, which allows it to be
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // destructively copied without memory allocations.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Swap(URLRow* other);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This class writes directly into this structure and clears our dirty bits
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when reading out of the DB.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class URLDatabase;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class HistoryBackend;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initializes all values that need initialization to their defaults.
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This excludes objects which autoinitialize such as strings.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Initialize();
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The row ID of this URL from the history database. This is immutable except
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when retrieving the row from the database or when determining if the URL
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // referenced by the URLRow already exists in the database.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLID id_;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The URL of this row. Immutable except for the database which sets it
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when it pulls them out. If clients want to change it, they must use
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the constructor to make a new one.
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url_;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 title_;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Total number of times this URL has been visited.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int visit_count_;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Number of times this URL has been manually entered in the URL bar.
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int typed_count_;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The date of the last visit of this URL, which saves us from having to
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // loop up in the visit table for things like autocomplete and expiration.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time last_visit_;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Indicates this entry should now be shown in typical UI or queries, this
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is usually for subframes.
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool hidden_;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We support the implicit copy constuctor and operator=.
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<URLRow> URLRows;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The enumeration of all possible sources of visits is listed below.
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The source will be propagated along with a URL or a visit item
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and eventually be stored in the history database,
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// visit_source table specifically.
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Different from page transition types, they describe the origins of visits.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (Warning): Please don't change any existing values while it is ok to add
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// new values when needed.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum VisitSource {
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SOURCE_SYNCED = 0,         // Synchronized from somewhere else.
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SOURCE_BROWSED = 1,        // User browsed.
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SOURCE_EXTENSION = 2,      // Added by an extension.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SOURCE_FIREFOX_IMPORTED = 3,
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SOURCE_IE_IMPORTED = 4,
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SOURCE_SAFARI_IMPORTED = 5,
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int64 VisitID;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Structure to hold the mapping between each visit's id and its source.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::map<VisitID, VisitSource> VisitSourceMap;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// VisitRow -------------------------------------------------------------------
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Holds all information associated with a specific visit. A visit holds time
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and referrer information for one time a URL is visited.
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VisitRow {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitRow();
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitRow(URLID arg_url_id,
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           base::Time arg_visit_time,
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           VisitID arg_referring_visit,
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           content::PageTransition arg_transition,
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           SegmentID arg_segment_id);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~VisitRow();
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ID of this row (visit ID, used a a referrer for other visits).
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitID visit_id;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Row ID into the URL table of the URL that this page is.
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLID url_id;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time visit_time;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Indicates another visit that was the referring page for this one.
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 0 indicates no referrer.
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitID referring_visit;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A combination of bits from PageTransition.
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::PageTransition transition;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The segment id (see visitsegment_database.*).
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If 0, the segment id is null in the table.
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SegmentID segment_id;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Record how much time a user has this visit starting from the user
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // opened this visit to the user closed or ended this visit.
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This includes both active and inactive time as long as
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the visit was present.
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta visit_duration;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Compares two visits based on dates, for sorting.
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator<(const VisitRow& other) {
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return visit_time < other.visit_time;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We allow the implicit copy constuctor and operator=.
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We pass around vectors of visits a lot
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<VisitRow> VisitVector;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The basic information associated with a visit (timestamp, type of visit),
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// used by HistoryBackend::AddVisits() to create new visits for a URL.
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::pair<base::Time, content::PageTransition> VisitInfo;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PageVisit ------------------------------------------------------------------
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Represents a simplified version of a visit for external users. Normally,
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// views are only interested in the time, and not the other information
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// associated with a VisitRow.
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct PageVisit {
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLID page_id;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time visit_time;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URLResult -------------------------------------------------------------------
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLResult : public URLRow {
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLResult();
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLResult(const GURL& url, base::Time visit_time);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Constructor that create a URLResult from the specified URL and title match
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // positions from title_matches.
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLResult(const GURL& url, const Snippet::MatchPositions& title_matches);
289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  explicit URLResult(const URLRow& url_row);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~URLResult();
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time visit_time() const { return visit_time_; }
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_visit_time(base::Time visit_time) { visit_time_ = visit_time; }
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Snippet& snippet() const { return snippet_; }
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool blocked_visit() const { return blocked_visit_; }
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void set_blocked_visit(bool blocked_visit) {
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    blocked_visit_ = blocked_visit;
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If this is a title match, title_match_positions contains an entry for
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // every word in the title that matched one of the query parameters. Each
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // entry contains the start and end of the match.
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Snippet::MatchPositions& title_match_positions() const {
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return title_match_positions_;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SwapResult(URLResult* other);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
311eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  static bool CompareVisitTime(const URLResult& lhs, const URLResult& rhs);
312eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class HistoryBackend;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The time that this result corresponds to.
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time visit_time_;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These values are typically set by HistoryBackend.
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Snippet snippet_;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Snippet::MatchPositions title_match_positions_;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Whether a managed user was blocked when attempting to visit this URL.
324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool blocked_visit_;
325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We support the implicit copy constructor and operator=.
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// QueryResults ----------------------------------------------------------------
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Encapsulates the results of a history query. It supports an ordered list of
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URLResult objects, plus an efficient way of looking up the index of each time
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a given URL appears in those results.
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class QueryResults {
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::vector<URLResult*> URLResultVector;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QueryResults();
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~QueryResults();
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Indicates the first time that the query includes results for (queries are
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // clipped at the beginning, so it will always include to the end of the time
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // queried).
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the number of results was clipped as a result of the max count, this
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // will be the time of the first query returned. If there were fewer results
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // than we were allowed to return, this represents the first date considered
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in the query (this will be before the first result if there was time
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // queried with no results).
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(brettw): bug 1203054: This field is not currently set properly! Do
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // not use until the bug is fixed.
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time first_time_searched() const { return first_time_searched_; }
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_first_time_searched(base::Time t) { first_time_searched_ = t; }
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: If you need end_time_searched, it can be added.
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_reached_beginning(bool reached) { reached_beginning_ = reached; }
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool reached_beginning() { return reached_beginning_; }
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t size() const { return results_.size(); }
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool empty() const { return results_.empty(); }
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  URLResult& back() { return *results_.back(); }
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const URLResult& back() const { return *results_.back(); }
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLResult& operator[](size_t i) { return *results_[i]; }
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const URLResult& operator[](size_t i) const { return *results_[i]; }
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLResultVector::const_iterator begin() const { return results_.begin(); }
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLResultVector::const_iterator end() const { return results_.end(); }
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLResultVector::const_reverse_iterator rbegin() const {
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return results_.rbegin();
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLResultVector::const_reverse_iterator rend() const {
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return results_.rend();
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a pointer to the beginning of an array of all matching indices
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for entries with the given URL. The array will be |*num_matches| long.
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |num_matches| can be NULL if the caller is not interested in the number of
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // results (commonly it will only be interested in the first one and can test
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the pointer for NULL).
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When there is no match, it will return NULL and |*num_matches| will be 0.
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t* MatchesForURL(const GURL& url, size_t* num_matches) const;
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Swaps the current result with another. This allows ownership to be
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // efficiently transferred without copying.
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Swap(QueryResults* other);
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds the given result to the map, using swap() on the members to avoid
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // copying (there are a lot of strings and vectors). This means the parameter
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // object will be cleared after this call.
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AppendURLBySwapping(URLResult* result);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removes all instances of the given URL from the result set.
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeleteURL(const GURL& url);
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Deletes the given range of items in the result set.
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeleteRange(size_t begin, size_t end);
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Maps the given URL to a list of indices into results_ which identify each
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // time an entry with that URL appears. Normally, each URL will have one or
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // very few indices after it, so we optimize this to use statically allocated
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // memory when possible.
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<GURL, base::StackVector<size_t, 4> > URLToResultIndices;
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Inserts an entry into the |url_to_results_| map saying that the given URL
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is at the given index in the results_.
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddURLUsageAtIndex(const GURL& url, size_t index);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds |delta| to each index in url_to_results_ in the range [begin,end]
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (this is inclusive). This is used when inserting or deleting.
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AdjustResultMap(size_t begin, size_t end, ptrdiff_t delta);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time first_time_searched_;
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether the query reaches the beginning of the database.
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool reached_beginning_;
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The ordered list of results. The pointers inside this are owned by this
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // QueryResults object.
424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ScopedVector<URLResult> results_;
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Maps URLs to entries in results_.
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLToResultIndices url_to_results_;
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QueryResults);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// QueryOptions ----------------------------------------------------------------
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct QueryOptions {
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QueryOptions();
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The time range to search for matches in. The beginning is inclusive and
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the ending is exclusive. Either one (or both) may be null.
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This will match only the one recent visit of a URL. For text search
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // queries, if the URL was visited in the given time period, but has also
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // been visited more recently than that, it will not be returned. When the
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // text query is empty, this will return the most recent visit within the
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // time range.
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time begin_time;
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time end_time;
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the query time to the last |days_ago| days to the present time.
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetRecentDayRange(int days_ago);
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The maximum number of results to return. The results will be sorted with
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the most recent first, so older results may not be returned if there is not
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // enough room. When 0, this will return everything (the default).
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int max_count;
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum DuplicateHandling {
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Omit visits for which there is a more recent visit to the same URL.
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Each URL in the results will appear only once.
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    REMOVE_ALL_DUPLICATES,
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Omit visits for which there is a more recent visit to the same URL on
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // the same day. Each URL will appear no more than once per day, where the
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // day is defined by the local timezone.
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    REMOVE_DUPLICATES_PER_DAY,
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Return all visits without deduping.
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    KEEP_ALL_DUPLICATES
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Allows the caller to specify how duplicate URLs in the result set should
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // be handled. The default is REMOVE_DUPLICATES.
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DuplicateHandling duplicate_policy;
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Helpers to get the effective parameters values, since a value of 0 means
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // "unspecified".
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int EffectiveMaxCount() const;
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int64 EffectiveBeginTime() const;
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int64 EffectiveEndTime() const;
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// KeywordSearchTermVisit -----------------------------------------------------
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// KeywordSearchTermVisit is returned from GetMostRecentKeywordSearchTerms. It
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// gives the time and search term of the keyword visit.
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct KeywordSearchTermVisit {
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  KeywordSearchTermVisit();
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~KeywordSearchTermVisit();
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 term;    // The search term that was used.
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int visits;       // The visit count.
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time time;  // The time of the most recent visit.
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// KeywordSearchTermRow --------------------------------------------------------
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used for URLs that have a search term associated with them.
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct KeywordSearchTermRow {
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  KeywordSearchTermRow();
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~KeywordSearchTermRow();
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURLID keyword_id;  // ID of the keyword.
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLID url_id;              // ID of the url.
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 term;             // The search term that was used.
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MostVisitedURL --------------------------------------------------------------
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Holds the per-URL information of the most visited query.
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct MostVisitedURL {
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURL();
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURL(const GURL& url, const string16& title);
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~MostVisitedURL();
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url;
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 title;
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RedirectList redirects;
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator==(const MostVisitedURL& other) {
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return url == other.url;
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FilteredURL -----------------------------------------------------------------
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Holds the per-URL information of the filterd url query.
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FilteredURL {
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct ExtendedInfo {
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtendedInfo();
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The absolute number of visits.
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int total_visits;
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The number of visits, as seen by the Most Visited NTP pane.
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int visits;
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The total number of seconds that the page was open.
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 duration_opened;
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The time when the page was last visited.
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Time last_visit_time;
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilteredURL();
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit FilteredURL(const PageUsageData& data);
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~FilteredURL();
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url;
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 title;
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double score;
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtendedInfo extended_info;
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Navigation -----------------------------------------------------------------
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Marshalling structure for AddPage.
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct HistoryAddPageArgs {
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The default constructor is equivalent to:
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   HistoryAddPageArgs(
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //       GURL(), base::Time(), NULL, 0, GURL(),
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //       history::RedirectList(), content::PAGE_TRANSITION_LINK,
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //       SOURCE_BROWSED, false)
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HistoryAddPageArgs();
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HistoryAddPageArgs(const GURL& url,
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     base::Time time,
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const void* id_scope,
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     int32 page_id,
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const GURL& referrer,
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const history::RedirectList& redirects,
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     content::PageTransition transition,
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     VisitSource source,
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     bool did_replace_entry);
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~HistoryAddPageArgs();
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url;
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time time;
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const void* id_scope;
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 page_id;
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL referrer;
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  history::RedirectList redirects;
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::PageTransition transition;
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitSource visit_source;
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool did_replace_entry;
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TopSites -------------------------------------------------------------------
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<MostVisitedURL> MostVisitedURLList;
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<FilteredURL> FilteredURLList;
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used by TopSites to store the thumbnails.
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Images {
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Images();
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~Images();
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  scoped_refptr<base::RefCountedMemory> thumbnail;
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ThumbnailScore thumbnail_score;
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(brettw): this will eventually store the favicon.
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // scoped_refptr<base::RefCountedBytes> favicon;
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct MostVisitedURLWithRank {
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURL url;
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rank;
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<MostVisitedURLWithRank> MostVisitedURLWithRankList;
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct TopSitesDelta {
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TopSitesDelta();
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~TopSitesDelta();
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURLList deleted;
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURLWithRankList added;
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURLWithRankList moved;
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::map<GURL, scoped_refptr<base::RefCountedBytes> > URLToThumbnailMap;
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used when migrating most visited thumbnails out of history and into topsites.
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ThumbnailMigration {
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ThumbnailMigration();
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ThumbnailMigration();
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURLList most_visited;
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLToThumbnailMap url_to_thumbnail_map;
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::map<GURL, Images> URLToImagesMap;
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MostVisitedThumbnails
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public base::RefCountedThreadSafe<MostVisitedThumbnails> {
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedThumbnails();
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURLList most_visited;
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLToImagesMap url_to_images_map;
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::RefCountedThreadSafe<MostVisitedThumbnails>;
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MostVisitedThumbnails();
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MostVisitedThumbnails);
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Autocomplete thresholds -----------------------------------------------------
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Constants which specify, when considered altogether, 'significant'
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// history items. These are used to filter out insignificant items
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for consideration as autocomplete candidates.
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern const int kLowQualityMatchTypedLimit;
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern const int kLowQualityMatchVisitLimit;
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern const int kLowQualityMatchAgeLimitInDays;
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the date threshold for considering an history item as significant.
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::Time AutocompleteAgeThreshold();
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return true if |row| qualifies as an autocomplete candidate. If |time_cache|
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is_null() then this function determines a new time threshold each time it is
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// called. Since getting system time can be costly (such as for cases where
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this function will be called in a loop over many history items), you can
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// provide a non-null |time_cache| by simply initializing |time_cache| with
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AutocompleteAgeThreshold() (or any other desired time in the past).
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RowQualifiesAsSignificant(const URLRow& row, const base::Time& threshold);
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Favicons -------------------------------------------------------------------
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used for the mapping between the page and icon.
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct IconMapping {
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IconMapping();
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~IconMapping();
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The unique id of the mapping.
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IconMappingID mapping_id;
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The url of a web page.
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL page_url;
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The unique id of the icon.
68090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  chrome::FaviconID icon_id;
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The url of the icon.
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL icon_url;
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The type of icon.
68690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  chrome::IconType icon_type;
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Defines a favicon bitmap and its associated pixel size.
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FaviconBitmapIDSize {
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FaviconBitmapIDSize();
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~FaviconBitmapIDSize();
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The unique id of the favicon bitmap.
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FaviconBitmapID bitmap_id;
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The pixel dimensions of the associated bitmap.
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size pixel_size;
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Defines a favicon bitmap stored in the history backend.
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FaviconBitmap {
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FaviconBitmap();
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~FaviconBitmap();
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The unique id of the bitmap.
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FaviconBitmapID bitmap_id;
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The id of the favicon to which the bitmap belongs to.
71090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  chrome::FaviconID icon_id;
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Time at which |bitmap_data| was last updated.
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time last_updated;
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The bits of the bitmap.
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::RefCountedMemory> bitmap_data;
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The pixel dimensions of bitmap_data.
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size pixel_size;
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Abbreviated information about a visit.
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct BriefVisitInfo {
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLID url_id;
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time time;
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::PageTransition transition;
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An observer of VisitDatabase.
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VisitDatabaseObserver {
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~VisitDatabaseObserver();
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnAddVisit(const BriefVisitInfo& info) = 0;
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct ExpireHistoryArgs {
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExpireHistoryArgs();
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~ExpireHistoryArgs();
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sets |begin_time| and |end_time| to the beginning and end of the day (in
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // local time) on which |time| occurs.
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetTimeRangeForOneDay(base::Time time);
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::set<GURL> urls;
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Time begin_time;
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Time end_time;
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace history
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_HISTORY_HISTORY_TYPES_H_
752