history_types.h revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
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" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string16.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/time.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/snippet.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_id.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/ref_counted_util.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/thumbnail_score.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/page_transition_types.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "googleurl/src/gurl.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PageUsageData; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace history { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Forward declaration for friend statements. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HistoryBackend; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLDatabase; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Structure to hold redirect lists for URLs. For a redirect chain 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A -> B -> C, and entry in the map would look like "A => {B -> C}". 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::map<GURL, scoped_refptr<RefCountedVector<GURL> > > RedirectMap; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Container for a list of URLs. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<GURL> RedirectList; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int64 DownloadID; // Identifier for a download. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int64 FaviconID; // For favicons. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int64 FaviconBitmapID; // Identifier for a bitmap in a favicon. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int64 SegmentID; // URL segments for the most visited view. 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef int64 SegmentDurationID; // Unique identifier for segment_duration. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int64 IconMappingID; // For page url and icon mapping. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URLRow --------------------------------------------------------------------- 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int64 URLID; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Holds all information globally associated with one URL (one row in the 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URL table). 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This keeps track of dirty bits, which are currently unused: 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(brettw) the dirty bits are broken in a number of respects. First, the 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// database will want to update them on a const object, so they need to be 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// mutable. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Second, there is a problem copying. If you make a copy of this structure 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (as we allow since we put this into vectors in various places) then the 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dirty bits will not be in sync for these copies. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRow { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRow(); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit URLRow(const GURL& url); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need to be able to set the id of a URLRow that's being passed through 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // an IPC message. This constructor should probably not be used otherwise. 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRow(const GURL& url, URLID id); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~URLRow(); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRow& operator=(const URLRow& other); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLID id() const { return id_; } 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the id of the row. The id should only be manually set when a row has 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // been retrieved from the history database or other dataset based on criteria 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // other than its id (i.e. by URL) and when the id has not yet been set in the 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // row. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_id(URLID id) { id_ = id; } 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url() const { return url_; } 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& title() const { 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return title_; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_title(const string16& title) { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The title is frequently set to the same thing, so we don't bother 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // updating unless the string has changed. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (title != title_) { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title_ = title; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The number of times this URL has been visited. This will often match the 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // number of entries in the visit table for this URL, but won't always. It's 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // really designed for autocomplete ranking, so some "useless" transitions 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from the visit table aren't counted in this tally. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int visit_count() const { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return visit_count_; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_visit_count(int visit_count) { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visit_count_ = visit_count; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Number of times the URL was typed in the Omnibox. This "should" match 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the number of TYPED transitions in the visit table. It's used primarily 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for faster autocomplete ranking. If you need to know the actual number of 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TYPED transitions, you should query the visit table since there could be 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // something out of sync. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int typed_count() const { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return typed_count_; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_typed_count(int typed_count) { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typed_count_ = typed_count; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time last_visit() const { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return last_visit_; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_last_visit(base::Time last_visit) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_visit_ = last_visit; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this is set, we won't autocomplete this URL. 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool hidden() const { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hidden_; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_hidden(bool hidden) { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hidden_ = hidden; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper functor that determines if an URLRow refers to a given URL. 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class URLRowHasURL { 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit URLRowHasURL(const GURL& url) : url_(url) {} 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator()(const URLRow& row) { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return row.url() == url_; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url_; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Swaps the contents of this URLRow with another, which allows it to be 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // destructively copied without memory allocations. 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Swap(URLRow* other); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This class writes directly into this structure and clears our dirty bits 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when reading out of the DB. 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class URLDatabase; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class HistoryBackend; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initializes all values that need initialization to their defaults. 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This excludes objects which autoinitialize such as strings. 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Initialize(); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The row ID of this URL from the history database. This is immutable except 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when retrieving the row from the database or when determining if the URL 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // referenced by the URLRow already exists in the database. 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLID id_; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The URL of this row. Immutable except for the database which sets it 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when it pulls them out. If clients want to change it, they must use 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the constructor to make a new one. 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url_; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 title_; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Total number of times this URL has been visited. 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int visit_count_; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Number of times this URL has been manually entered in the URL bar. 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int typed_count_; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The date of the last visit of this URL, which saves us from having to 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // loop up in the visit table for things like autocomplete and expiration. 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time last_visit_; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Indicates this entry should now be shown in typical UI or queries, this 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is usually for subframes. 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool hidden_; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We support the implicit copy constuctor and operator=. 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<URLRow> URLRows; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The enumeration of all possible sources of visits is listed below. 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The source will be propagated along with a URL or a visit item 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and eventually be stored in the history database, 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// visit_source table specifically. 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Different from page transition types, they describe the origins of visits. 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (Warning): Please don't change any existing values while it is ok to add 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// new values when needed. 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum VisitSource { 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SOURCE_SYNCED = 0, // Synchronized from somewhere else. 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SOURCE_BROWSED = 1, // User browsed. 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SOURCE_EXTENSION = 2, // Added by an extension. 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SOURCE_FIREFOX_IMPORTED = 3, 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SOURCE_IE_IMPORTED = 4, 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SOURCE_SAFARI_IMPORTED = 5, 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int64 VisitID; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Structure to hold the mapping between each visit's id and its source. 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::map<VisitID, VisitSource> VisitSourceMap; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// VisitRow ------------------------------------------------------------------- 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Holds all information associated with a specific visit. A visit holds time 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and referrer information for one time a URL is visited. 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VisitRow { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitRow(); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitRow(URLID arg_url_id, 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time arg_visit_time, 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitID arg_referring_visit, 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PageTransition arg_transition, 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SegmentID arg_segment_id); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~VisitRow(); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ID of this row (visit ID, used a a referrer for other visits). 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitID visit_id; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Row ID into the URL table of the URL that this page is. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLID url_id; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time visit_time; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Indicates another visit that was the referring page for this one. 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 0 indicates no referrer. 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitID referring_visit; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A combination of bits from PageTransition. 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PageTransition transition; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The segment id (see visitsegment_database.*). 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If 0, the segment id is null in the table. 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SegmentID segment_id; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True when this visit has indexed data for it. We try to keep this in sync 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with the full text index: when we add or remove things from there, we will 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // update the visit table as well. However, that file could get deleted, or 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // out of sync in various ways, so this flag should be false when things 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // change. 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_indexed; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Record how much time a user has this visit starting from the user 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // opened this visit to the user closed or ended this visit. 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This includes both active and inactive time as long as 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the visit was present. 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta visit_duration; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Compares two visits based on dates, for sorting. 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator<(const VisitRow& other) { 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return visit_time < other.visit_time; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We allow the implicit copy constuctor and operator=. 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We pass around vectors of visits a lot 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<VisitRow> VisitVector; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The basic information associated with a visit (timestamp, type of visit), 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// used by HistoryBackend::AddVisits() to create new visits for a URL. 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::pair<base::Time, content::PageTransition> VisitInfo; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PageVisit ------------------------------------------------------------------ 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Represents a simplified version of a visit for external users. Normally, 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// views are only interested in the time, and not the other information 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// associated with a VisitRow. 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct PageVisit { 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLID page_id; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time visit_time; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URLResult ------------------------------------------------------------------- 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLResult : public URLRow { 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLResult(); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLResult(const GURL& url, base::Time visit_time); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Constructor that create a URLResult from the specified URL and title match 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // positions from title_matches. 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLResult(const GURL& url, const Snippet::MatchPositions& title_matches); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~URLResult(); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time visit_time() const { return visit_time_; } 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_visit_time(base::Time visit_time) { visit_time_ = visit_time; } 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Snippet& snippet() const { return snippet_; } 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool blocked_visit() const { return blocked_visit_; } 305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void set_blocked_visit(bool blocked_visit) { 306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) blocked_visit_ = blocked_visit; 307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this is a title match, title_match_positions contains an entry for 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // every word in the title that matched one of the query parameters. Each 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // entry contains the start and end of the match. 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Snippet::MatchPositions& title_match_positions() const { 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return title_match_positions_; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SwapResult(URLResult* other); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class HistoryBackend; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The time that this result corresponds to. 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time visit_time_; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These values are typically set by HistoryBackend. 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Snippet snippet_; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Snippet::MatchPositions title_match_positions_; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Whether a managed user was blocked when attempting to visit this URL. 329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool blocked_visit_; 330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We support the implicit copy constructor and operator=. 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// QueryResults ---------------------------------------------------------------- 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Encapsulates the results of a history query. It supports an ordered list of 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URLResult objects, plus an efficient way of looking up the index of each time 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a given URL appears in those results. 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class QueryResults { 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::vector<URLResult*> URLResultVector; 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueryResults(); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~QueryResults(); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Indicates the first time that the query includes results for (queries are 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // clipped at the beginning, so it will always include to the end of the time 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // queried). 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the number of results was clipped as a result of the max count, this 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will be the time of the first query returned. If there were fewer results 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // than we were allowed to return, this represents the first date considered 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the query (this will be before the first result if there was time 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // queried with no results). 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(brettw): bug 1203054: This field is not currently set properly! Do 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not use until the bug is fixed. 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time first_time_searched() const { return first_time_searched_; } 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_first_time_searched(base::Time t) { first_time_searched_ = t; } 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: If you need end_time_searched, it can be added. 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_reached_beginning(bool reached) { reached_beginning_ = reached; } 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool reached_beginning() { return reached_beginning_; } 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t size() const { return results_.size(); } 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool empty() const { return results_.empty(); } 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLResult& back() { return *results_.back(); } 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const URLResult& back() const { return *results_.back(); } 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLResult& operator[](size_t i) { return *results_[i]; } 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const URLResult& operator[](size_t i) const { return *results_[i]; } 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLResultVector::const_iterator begin() const { return results_.begin(); } 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLResultVector::const_iterator end() const { return results_.end(); } 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLResultVector::const_reverse_iterator rbegin() const { 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return results_.rbegin(); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLResultVector::const_reverse_iterator rend() const { 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return results_.rend(); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a pointer to the beginning of an array of all matching indices 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for entries with the given URL. The array will be |*num_matches| long. 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |num_matches| can be NULL if the caller is not interested in the number of 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // results (commonly it will only be interested in the first one and can test 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the pointer for NULL). 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When there is no match, it will return NULL and |*num_matches| will be 0. 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t* MatchesForURL(const GURL& url, size_t* num_matches) const; 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Swaps the current result with another. This allows ownership to be 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // efficiently transferred without copying. 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Swap(QueryResults* other); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds the given result to the map, using swap() on the members to avoid 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // copying (there are a lot of strings and vectors). This means the parameter 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // object will be cleared after this call. 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AppendURLBySwapping(URLResult* result); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removes all instances of the given URL from the result set. 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DeleteURL(const GURL& url); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Deletes the given range of items in the result set. 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DeleteRange(size_t begin, size_t end); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Maps the given URL to a list of indices into results_ which identify each 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // time an entry with that URL appears. Normally, each URL will have one or 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // very few indices after it, so we optimize this to use statically allocated 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // memory when possible. 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::map<GURL, base::StackVector<size_t, 4> > URLToResultIndices; 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Inserts an entry into the |url_to_results_| map saying that the given URL 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is at the given index in the results_. 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddURLUsageAtIndex(const GURL& url, size_t index); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds |delta| to each index in url_to_results_ in the range [begin,end] 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (this is inclusive). This is used when inserting or deleting. 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AdjustResultMap(size_t begin, size_t end, ptrdiff_t delta); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time first_time_searched_; 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether the query reaches the beginning of the database. 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool reached_beginning_; 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The ordered list of results. The pointers inside this are owned by this 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // QueryResults object. 429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScopedVector<URLResult> results_; 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Maps URLs to entries in results_. 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLToResultIndices url_to_results_; 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(QueryResults); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// QueryOptions ---------------------------------------------------------------- 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct QueryOptions { 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueryOptions(); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The time range to search for matches in. The beginning is inclusive and 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the ending is exclusive. Either one (or both) may be null. 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This will match only the one recent visit of a URL. For text search 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // queries, if the URL was visited in the given time period, but has also 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // been visited more recently than that, it will not be returned. When the 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // text query is empty, this will return the most recent visit within the 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // time range. 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time begin_time; 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time end_time; 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the query time to the last |days_ago| days to the present time. 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetRecentDayRange(int days_ago); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The maximum number of results to return. The results will be sorted with 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the most recent first, so older results may not be returned if there is not 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // enough room. When 0, this will return everything (the default). 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_count; 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only search within the page body if true, otherwise search all columns 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // including url and time. Defaults to false. 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool body_only; 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum DuplicateHandling { 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Omit visits for which there is a more recent visit to the same URL. 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Each URL in the results will appear only once. 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) REMOVE_ALL_DUPLICATES, 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Omit visits for which there is a more recent visit to the same URL on 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the same day. Each URL will appear no more than once per day, where the 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // day is defined by the local timezone. 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) REMOVE_DUPLICATES_PER_DAY, 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Return all visits without deduping. 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) KEEP_ALL_DUPLICATES 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Allows the caller to specify how duplicate URLs in the result set should 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // be handled. The default is REMOVE_DUPLICATES. 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DuplicateHandling duplicate_policy; 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Helpers to get the effective parameters values, since a value of 0 means 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // "unspecified". 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int EffectiveMaxCount() const; 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 EffectiveBeginTime() const; 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 EffectiveEndTime() const; 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// KeywordSearchTermVisit ----------------------------------------------------- 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// KeywordSearchTermVisit is returned from GetMostRecentKeywordSearchTerms. It 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// gives the time and search term of the keyword visit. 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct KeywordSearchTermVisit { 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KeywordSearchTermVisit(); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~KeywordSearchTermVisit(); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 term; // The search term that was used. 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int visits; // The visit count. 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time time; // The time of the most recent visit. 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// KeywordSearchTermRow -------------------------------------------------------- 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used for URLs that have a search term associated with them. 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct KeywordSearchTermRow { 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KeywordSearchTermRow(); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~KeywordSearchTermRow(); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TemplateURLID keyword_id; // ID of the keyword. 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLID url_id; // ID of the url. 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 term; // The search term that was used. 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MostVisitedURL -------------------------------------------------------------- 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Holds the per-URL information of the most visited query. 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct MostVisitedURL { 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MostVisitedURL(); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MostVisitedURL(const GURL& url, const string16& title); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~MostVisitedURL(); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url; 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 title; 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RedirectList redirects; 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator==(const MostVisitedURL& other) { 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return url == other.url; 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FilteredURL ----------------------------------------------------------------- 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Holds the per-URL information of the filterd url query. 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FilteredURL { 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ExtendedInfo { 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtendedInfo(); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The absolute number of visits. 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int total_visits; 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The number of visits, as seen by the Most Visited NTP pane. 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int visits; 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The total number of seconds that the page was open. 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 duration_opened; 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The time when the page was last visited. 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time last_visit_time; 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FilteredURL(); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit FilteredURL(const PageUsageData& data); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~FilteredURL(); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url; 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 title; 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double score; 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtendedInfo extended_info; 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Navigation ----------------------------------------------------------------- 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Marshalling structure for AddPage. 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct HistoryAddPageArgs { 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The default constructor is equivalent to: 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // HistoryAddPageArgs( 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GURL(), base::Time(), NULL, 0, GURL(), 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // history::RedirectList(), content::PAGE_TRANSITION_LINK, 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SOURCE_BROWSED, false) 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryAddPageArgs(); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryAddPageArgs(const GURL& url, 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time time, 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void* id_scope, 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 page_id, 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& referrer, 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const history::RedirectList& redirects, 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PageTransition transition, 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitSource source, 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_replace_entry); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~HistoryAddPageArgs(); 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url; 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time time; 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void* id_scope; 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 page_id; 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL referrer; 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::RedirectList redirects; 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PageTransition transition; 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitSource visit_source; 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_replace_entry; 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TopSites ------------------------------------------------------------------- 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<MostVisitedURL> MostVisitedURLList; 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<FilteredURL> FilteredURLList; 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used by TopSites to store the thumbnails. 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Images { 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Images(); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~Images(); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedBytes> thumbnail; 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailScore thumbnail_score; 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(brettw): this will eventually store the favicon. 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // scoped_refptr<base::RefCountedBytes> favicon; 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<MostVisitedURL> MostVisitedURLList; 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct MostVisitedURLWithRank { 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MostVisitedURL url; 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rank; 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<MostVisitedURLWithRank> MostVisitedURLWithRankList; 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct TopSitesDelta { 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TopSitesDelta(); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~TopSitesDelta(); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MostVisitedURLList deleted; 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MostVisitedURLWithRankList added; 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MostVisitedURLWithRankList moved; 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::map<GURL, scoped_refptr<base::RefCountedBytes> > URLToThumbnailMap; 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used when migrating most visited thumbnails out of history and into topsites. 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ThumbnailMigration { 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailMigration(); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ThumbnailMigration(); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MostVisitedURLList most_visited; 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLToThumbnailMap url_to_thumbnail_map; 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::map<GURL, Images> URLToImagesMap; 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MostVisitedThumbnails 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public base::RefCountedThreadSafe<MostVisitedThumbnails> { 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MostVisitedThumbnails(); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MostVisitedURLList most_visited; 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLToImagesMap url_to_images_map; 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCountedThreadSafe<MostVisitedThumbnails>; 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MostVisitedThumbnails(); 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MostVisitedThumbnails); 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Autocomplete thresholds ----------------------------------------------------- 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Constants which specify, when considered altogether, 'significant' 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// history items. These are used to filter out insignificant items 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for consideration as autocomplete candidates. 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern const int kLowQualityMatchTypedLimit; 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern const int kLowQualityMatchVisitLimit; 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern const int kLowQualityMatchAgeLimitInDays; 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the date threshold for considering an history item as significant. 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::Time AutocompleteAgeThreshold(); 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return true if |row| qualifies as an autocomplete candidate. If |time_cache| 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is_null() then this function determines a new time threshold each time it is 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// called. Since getting system time can be costly (such as for cases where 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this function will be called in a loop over many history items), you can 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// provide a non-null |time_cache| by simply initializing |time_cache| with 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AutocompleteAgeThreshold() (or any other desired time in the past). 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RowQualifiesAsSignificant(const URLRow& row, const base::Time& threshold); 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Favicons ------------------------------------------------------------------- 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Defines the icon types. They are also stored in icon_type field of favicons 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// table. 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The values of the IconTypes are used to select the priority in which favicon 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// data is returned in HistoryBackend and ThumbnailDatabase. Data for the 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// largest IconType takes priority if data for multiple IconTypes is available. 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum IconType { 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INVALID_ICON = 0x0, 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FAVICON = 1 << 0, 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TOUCH_ICON = 1 << 1, 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TOUCH_PRECOMPOSED_ICON = 1 << 2 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used for the mapping between the page and icon. 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct IconMapping { 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IconMapping(); 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~IconMapping(); 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The unique id of the mapping. 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IconMappingID mapping_id; 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The url of a web page. 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL page_url; 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The unique id of the icon. 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconID icon_id; 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The url of the icon. 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL icon_url; 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The type of icon. 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IconType icon_type; 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Defines a favicon bitmap which best matches the desired DIP size and one of 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the desired scale factors. 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FaviconBitmapResult { 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconBitmapResult(); 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~FaviconBitmapResult(); 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if |bitmap_data| contains a valid bitmap. 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_valid() const { return bitmap_data.get() && bitmap_data->size(); } 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Indicates whether |bitmap_data| is expired. 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool expired; 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The bits of the bitmap. 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedMemory> bitmap_data; 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The pixel dimensions of |bitmap_data|. 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size pixel_size; 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The URL of the containing favicon. 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL icon_url; 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The icon type of the containing favicon. 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IconType icon_type; 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Define type with same structure as FaviconBitmapResult for passing data to 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HistoryBackend::SetFavicons(). 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef FaviconBitmapResult FaviconBitmapData; 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Defines a gfx::Image of size desired_size_in_dip composed of image 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// representations for each of the desired scale factors. 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FaviconImageResult { 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconImageResult(); 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~FaviconImageResult(); 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The resulting image. 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Image image; 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The URL of the favicon which contains all of the image representations of 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |image|. 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(pkotwicz): Return multiple |icon_urls| to allow |image| to have 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // representations from several favicons once content::FaviconStatus supports 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // multiple URLs. 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL icon_url; 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FaviconSizes represents the sizes that the thumbnail database knows a 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// favicon is available from the web. FaviconSizes has several entries 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// only if FaviconSizes is for an .ico file. FaviconSizes can be different 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from the pixel sizes of the entries in the |favicon_bitmaps| table. For 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// instance, if a web page has a .ico favicon with bitmaps of pixel sizes 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (16x16, 32x32), FaviconSizes will have both sizes regardless of whether 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// either of these bitmaps is cached in the favicon_bitmaps database table. 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<gfx::Size> FaviconSizes; 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the default FaviconSizes to use if the favicon sizes for a FaviconID 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are unknown. 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const FaviconSizes& GetDefaultFaviconSizes(); 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Defines a favicon bitmap and its associated pixel size. 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FaviconBitmapIDSize { 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconBitmapIDSize(); 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~FaviconBitmapIDSize(); 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The unique id of the favicon bitmap. 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconBitmapID bitmap_id; 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The pixel dimensions of the associated bitmap. 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size pixel_size; 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Defines a favicon bitmap stored in the history backend. 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FaviconBitmap { 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconBitmap(); 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~FaviconBitmap(); 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The unique id of the bitmap. 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconBitmapID bitmap_id; 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The id of the favicon to which the bitmap belongs to. 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconID icon_id; 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Time at which |bitmap_data| was last updated. 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time last_updated; 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The bits of the bitmap. 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedMemory> bitmap_data; 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The pixel dimensions of bitmap_data. 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size pixel_size; 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used by the importer to set favicons for imported bookmarks. 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ImportedFaviconUsage { 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ImportedFaviconUsage(); 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ImportedFaviconUsage(); 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The URL of the favicon. 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL favicon_url; 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The raw png-encoded data. 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> png_data; 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The list of URLs using this favicon. 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<GURL> urls; 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Abbreviated information about a visit. 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct BriefVisitInfo { 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLID url_id; 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time time; 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PageTransition transition; 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An observer of VisitDatabase. 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VisitDatabaseObserver { 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~VisitDatabaseObserver(); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnAddVisit(const BriefVisitInfo& info) = 0; 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct ExpireHistoryArgs { 8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExpireHistoryArgs(); 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~ExpireHistoryArgs(); 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sets |begin_time| and |end_time| to the beginning and end of the day (in 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // local time) on which |time| occurs. 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetTimeRangeForOneDay(base::Time time); 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::set<GURL> urls; 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time begin_time; 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time end_time; 8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace history 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_HISTORY_HISTORY_TYPES_H_ 849