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