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