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