1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_HISTORY_API_H_
6#define CHROME_BROWSER_EXTENSIONS_EXTENSION_HISTORY_API_H_
7#pragma once
8
9#include <map>
10#include <string>
11
12#include "base/memory/singleton.h"
13#include "chrome/browser/extensions/extension_function.h"
14#include "chrome/browser/history/history.h"
15#include "chrome/browser/history/history_notifications.h"
16#include "content/common/notification_registrar.h"
17
18// Observes History service and routes the notifications as events to the
19// extension system.
20class ExtensionHistoryEventRouter : public NotificationObserver {
21 public:
22  // Single instance of the event router.
23  static ExtensionHistoryEventRouter* GetInstance();
24
25  // Safe to call multiple times.
26  void ObserveProfile(Profile* profile);
27
28 private:
29  friend struct DefaultSingletonTraits<ExtensionHistoryEventRouter>;
30
31  ExtensionHistoryEventRouter();
32  virtual ~ExtensionHistoryEventRouter();
33
34  // NotificationObserver::Observe.
35  virtual void Observe(NotificationType type,
36                       const NotificationSource& source,
37                       const NotificationDetails& details);
38
39  void HistoryUrlVisited(Profile* profile,
40                         const history::URLVisitedDetails* details);
41
42  void HistoryUrlsRemoved(Profile* profile,
43                          const history::URLsDeletedDetails* details);
44
45  void DispatchEvent(Profile* profile,
46                     const char* event_name,
47                     const std::string& json_args);
48
49  // Used for tracking registrations to history service notifications.
50  NotificationRegistrar registrar_;
51
52  // Registered profiles.
53  typedef std::map<uintptr_t, Profile*> ProfileMap;
54  ProfileMap profiles_;
55
56  DISALLOW_COPY_AND_ASSIGN(ExtensionHistoryEventRouter);
57};
58
59
60// Base class for history function APIs.
61class HistoryFunction : public AsyncExtensionFunction {
62 public:
63  virtual void Run();
64  virtual bool RunImpl() = 0;
65
66  bool GetUrlFromValue(Value* value, GURL* url);
67  bool GetTimeFromValue(Value* value, base::Time* time);
68};
69
70// Base class for history funciton APIs which require async interaction with
71// chrome services and the extension thread.
72class HistoryFunctionWithCallback : public HistoryFunction {
73 public:
74  HistoryFunctionWithCallback();
75  ~HistoryFunctionWithCallback();
76
77  // Return true if the async call was completed, false otherwise.
78  virtual bool RunAsyncImpl() = 0;
79
80  // Call this method to report the results of the async method to the caller.
81  // This method calls Release().
82  virtual void SendAsyncResponse();
83
84  // Override HistoryFunction::RunImpl.
85  virtual bool RunImpl();
86
87 protected:
88  // The consumer for the HistoryService callbacks.
89  CancelableRequestConsumer cancelable_consumer_;
90
91 private:
92  // The actual call to SendResponse.  This is required since the semantics for
93  // CancelableRequestConsumerT require it to be accessed after the call.
94  void SendResponseToCallback();
95};
96
97class GetVisitsHistoryFunction : public HistoryFunctionWithCallback {
98 public:
99  // Override HistoryFunction.
100  virtual bool RunAsyncImpl();
101  DECLARE_EXTENSION_FUNCTION_NAME("history.getVisits");
102
103  // Callback for the history function to provide results.
104  void QueryComplete(HistoryService::Handle request_service,
105                     bool success,
106                     const history::URLRow* url_row,
107                     history::VisitVector* visits);
108};
109
110class SearchHistoryFunction : public HistoryFunctionWithCallback {
111 public:
112  virtual bool RunAsyncImpl();
113  DECLARE_EXTENSION_FUNCTION_NAME("history.search");
114
115  // Callback for the history function to provide results.
116  void SearchComplete(HistoryService::Handle request_handle,
117                      history::QueryResults* results);
118};
119
120class AddUrlHistoryFunction : public HistoryFunction {
121 public:
122  virtual bool RunImpl();
123  DECLARE_EXTENSION_FUNCTION_NAME("history.addUrl");
124};
125
126class DeleteAllHistoryFunction : public HistoryFunctionWithCallback {
127 public:
128  virtual bool RunAsyncImpl();
129  DECLARE_EXTENSION_FUNCTION_NAME("history.deleteAll");
130
131  // Callback for the history service to acknowledge deletion.
132  void DeleteComplete();
133};
134
135
136class DeleteUrlHistoryFunction : public HistoryFunction {
137 public:
138  virtual bool RunImpl();
139  DECLARE_EXTENSION_FUNCTION_NAME("history.deleteUrl");
140};
141
142class DeleteRangeHistoryFunction : public HistoryFunctionWithCallback {
143 public:
144  virtual bool RunAsyncImpl();
145  DECLARE_EXTENSION_FUNCTION_NAME("history.deleteRange");
146
147  // Callback for the history service to acknowledge deletion.
148  void DeleteComplete();
149};
150
151#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_HISTORY_API_H_
152