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_UI_WEBUI_HISTORY_UI_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_WEBUI_HISTORY_UI_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <string> 958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/weak_ptr.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/task/cancelable_task_tracker.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/history_service.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/web_history_service.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui_controller.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui_message_handler.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BookmarkModel; 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ProfileSyncService; 23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class SupervisedUserService; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The handler for Javascript messages related to the "history" view. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowsingHistoryHandler : public content::WebUIMessageHandler, 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public content::NotificationObserver { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Represents a history entry to be shown to the user, representing either 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // a local or remote visit. A single entry can represent multiple visits, 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // since only the most recent visit on a particular day is shown. 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct HistoryEntry { 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Values indicating whether an entry represents only local visits, only 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // remote visits, or a mixture of both. 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum EntryType { 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EMPTY_ENTRY = 0, 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOCAL_ENTRY, 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) REMOTE_ENTRY, 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) COMBINED_ENTRY 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) HistoryEntry(EntryType type, const GURL& url, const base::string16& title, 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Time time, const std::string& client_id, 44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool is_search_result, const base::string16& snippet, 4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool blocked_visit, const std::string& accept_languages); 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HistoryEntry(); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~HistoryEntry(); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Formats this entry's URL and title and adds them to |result|. 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SetUrlAndTitle(base::DictionaryValue* result) const; 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Converts the entry to a DictionaryValue to be owned by the caller. 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::DictionaryValue> ToValue( 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BookmarkModel* bookmark_model, 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserService* supervised_user_service, 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const ProfileSyncService* sync_service) const; 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Comparison function for sorting HistoryEntries from newest to oldest. 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static bool SortByTimeDescending( 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const HistoryEntry& entry1, const HistoryEntry& entry2); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The type of visits this entry represents: local, remote, or both. 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EntryType entry_type; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL url; 66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 title; // Title of the entry. May be empty. 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The time of the entry. Usually this will be the time of the most recent 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // visit to |url| on a particular day as defined in the local timezone. 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time time; 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The sync ID of the client on which the most recent visit occurred. 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string client_id; 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Timestamps of all local or remote visits the same URL on the same day. 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::set<int64> all_timestamps; 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If true, this entry is a search result. 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_search_result; 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The entry's search snippet, if this entry is a search result. 82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 snippet; 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Whether this entry was blocked when it was attempted. 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool blocked_visit; 8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // kAcceptLanguages pref value. 8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string accept_languages; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingHistoryHandler(); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BrowsingHistoryHandler(); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebUIMessageHandler implementation. 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RegisterMessages() OVERRIDE; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handler for the "queryHistory" message. 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void HandleQueryHistory(const base::ListValue* args); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Handler for the "removeVisits" message. 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void HandleRemoveVisits(const base::ListValue* args); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handler for "clearBrowsingData" message. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void HandleClearBrowsingData(const base::ListValue* args); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handler for "removeBookmark" message. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void HandleRemoveBookmark(const base::ListValue* args); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // content::NotificationObserver implementation. 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) OVERRIDE; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Merges duplicate entries from the query results, only retaining the most 11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // recent visit to a URL on a particular day. That visit contains the 11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // timestamps of the other visits. 11790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) static void MergeDuplicateResults( 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<BrowsingHistoryHandler::HistoryEntry>* results); 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The range for which to return results: 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // - ALLTIME: allows access to all the results in a paginated way. 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // - WEEK: the last 7 days. 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // - MONTH: the last calendar month. 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum Range { 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ALL_TIME = 0, 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WEEK = 1, 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MONTH = 2 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Core implementation of history querying. 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void QueryHistory(base::string16 search_text, 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const history::QueryOptions& options); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Combines the query results from the local history database and the history 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // server, and sends the combined results to the front end. 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ReturnResultsToFrontEnd(); 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Callback from |web_history_timer_| when a response from web history has 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // not been received in time. 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void WebHistoryTimeout(); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback from the history system when a history query has completed. 144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void QueryComplete(const base::string16& search_text, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const history::QueryOptions& options, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::QueryResults* results); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Callback from the WebHistoryService when a query has completed. 149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void WebHistoryQueryComplete(const base::string16& search_text, 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const history::QueryOptions& options, 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks start_time, 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) history::WebHistoryService::Request* request, 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* results_value); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback from the history system when visits were deleted. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveComplete(); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Callback from history server when visits were deleted. 159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void RemoveWebHistoryComplete(bool success); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ExtractIntegerValueAtIndex( 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::ListValue* value, int index, int* out_int); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sets the query options for a week-wide query, |offset| weeks ago. 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetQueryTimeInWeeks(int offset, history::QueryOptions* options); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sets the query options for a monthly query, |offset| months ago. 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetQueryTimeInMonths(int offset, history::QueryOptions* options); 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // kAcceptLanguages pref value. 17158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string GetAcceptLanguages() const; 17258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationRegistrar registrar_; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Tracker for search requests to the history service. 176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::CancelableTaskTracker query_task_tracker_; 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The currently-executing request for synced history results. 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Deleting the request will cancel it. 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<history::WebHistoryService::Request> web_history_request_; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // True if there is a pending delete requests to the history service. 183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool has_pending_delete_request_; 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Tracker for delete requests to the history service. 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::CancelableTaskTracker delete_task_tracker_; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The list of URLs that are in the process of being deleted. 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<GURL> urls_to_be_deleted_; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The info value that is returned to the front end with the query results. 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue results_info_value_; 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The list of query results received from the history service. 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<HistoryEntry> query_results_; 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The list of query results received from the history server. 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<HistoryEntry> web_history_query_results_; 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Timer used to implement a timeout on a Web History response. 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::OneShotTimer<BrowsingHistoryHandler> web_history_timer_; 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::WeakPtrFactory<BrowsingHistoryHandler> weak_factory_; 204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BrowsingHistoryHandler); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HistoryUI : public content::WebUIController { 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit HistoryUI(content::WebUI* web_ui); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static base::RefCountedMemory* GetFaviconResourceBytes( 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ScaleFactor scale_factor); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(HistoryUI); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_UI_WEBUI_HISTORY_UI_H_ 220