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. 20 class 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. 61 class 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. 72 class 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 97 class 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 110 class 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 120 class AddUrlHistoryFunction : public HistoryFunction { 121 public: 122 virtual bool RunImpl(); 123 DECLARE_EXTENSION_FUNCTION_NAME("history.addUrl"); 124 }; 125 126 class 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 136 class DeleteUrlHistoryFunction : public HistoryFunction { 137 public: 138 virtual bool RunImpl(); 139 DECLARE_EXTENSION_FUNCTION_NAME("history.deleteUrl"); 140 }; 141 142 class 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