12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CHROME_BROWSER_HISTORY_WEB_HISTORY_SERVICE_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CHROME_BROWSER_HISTORY_WEB_HISTORY_SERVICE_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <set> 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 10ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/memory/weak_ptr.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/history/core/browser/history_types.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/core/keyed_service.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base { 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DictionaryValue; 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace net { 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class URLFetcher; 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace history { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Provides an API for querying Google servers for a signed-in user's 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// synced history visits. It is roughly analogous to HistoryService, and 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// supports a similar API. 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class WebHistoryService : public KeyedService { 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Handles all the work of making an API request. This class encapsulates 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the entire state of the request. When an instance is destroyed, all 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // aspects of the request are cancelled. 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class Request { 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~Request(); 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Returns true if the request is "pending" (i.e., it has been started, but 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // is not yet been complete). 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool is_pending() = 0; 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Request(); 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Callback with the result of a call to QueryHistory(). Currently, the 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // DictionaryValue is just the parsed JSON response from the server. 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(dubroy): Extract the DictionaryValue into a structured results object. 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef base::Callback<void(Request*, const base::DictionaryValue*)> 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QueryWebHistoryCallback; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) typedef base::Callback<void(bool success)> ExpireWebHistoryCallback; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit WebHistoryService(Profile* profile); 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~WebHistoryService(); 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Searches synced history for visits matching |text_query|. The timeframe to 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // search, along with other options, is specified in |options|. If 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |text_query| is empty, all visits in the timeframe will be returned. 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This method is the equivalent of HistoryService::QueryHistory. 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The caller takes ownership of the returned Request. If it is destroyed, the 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // request is cancelled. 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<Request> QueryHistory( 63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text_query, 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const QueryOptions& options, 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const QueryWebHistoryCallback& callback); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Removes all visits to specified URLs in specific time ranges. 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This is the of equivalent HistoryService::ExpireHistory(). 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void ExpireHistory(const std::vector<ExpireHistoryArgs>& expire_list, 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const ExpireWebHistoryCallback& callback); 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Removes all visits to specified URLs in the given time range. 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This is the of equivalent HistoryService::ExpireHistoryBetween(). 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void ExpireHistoryBetween(const std::set<GURL>& restrict_urls, 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Time begin_time, 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Time end_time, 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const ExpireWebHistoryCallback& callback); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Called by |request| when a web history query has completed. Unpacks the 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // response and calls |callback|, which is the original callback that was 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // passed to QueryHistory(). 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static void QueryHistoryCompletionCallback( 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const WebHistoryService::QueryWebHistoryCallback& callback, 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebHistoryService::Request* request, 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool success); 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Called by |request| when a request to delete history from the server has 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // completed. Unpacks the response and calls |callback|, which is the original 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // callback that was passed to ExpireHistory(). 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ExpireHistoryCompletionCallback( 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const WebHistoryService::ExpireWebHistoryCallback& callback, 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebHistoryService::Request* request, 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool success); 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile_; 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Stores the version_info token received from the server in response to 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // a mutation operation (e.g., deleting history). This is used to ensure that 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // subsequent reads see a version of the data that includes the mutation. 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string server_version_info_; 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Pending expiration requests to be canceled if not complete by profile 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // shutdown. 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::set<Request*> pending_expire_requests_; 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::WeakPtrFactory<WebHistoryService> weak_ptr_factory_; 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WebHistoryService); 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace history 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CHROME_BROWSER_HISTORY_WEB_HISTORY_SERVICE_H_ 115