// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_HISTORY_API_H_ #define CHROME_BROWSER_EXTENSIONS_EXTENSION_HISTORY_API_H_ #pragma once #include <map> #include <string> #include "base/memory/singleton.h" #include "chrome/browser/extensions/extension_function.h" #include "chrome/browser/history/history.h" #include "chrome/browser/history/history_notifications.h" #include "content/common/notification_registrar.h" // Observes History service and routes the notifications as events to the // extension system. class ExtensionHistoryEventRouter : public NotificationObserver { public: // Single instance of the event router. static ExtensionHistoryEventRouter* GetInstance(); // Safe to call multiple times. void ObserveProfile(Profile* profile); private: friend struct DefaultSingletonTraits<ExtensionHistoryEventRouter>; ExtensionHistoryEventRouter(); virtual ~ExtensionHistoryEventRouter(); // NotificationObserver::Observe. virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); void HistoryUrlVisited(Profile* profile, const history::URLVisitedDetails* details); void HistoryUrlsRemoved(Profile* profile, const history::URLsDeletedDetails* details); void DispatchEvent(Profile* profile, const char* event_name, const std::string& json_args); // Used for tracking registrations to history service notifications. NotificationRegistrar registrar_; // Registered profiles. typedef std::map<uintptr_t, Profile*> ProfileMap; ProfileMap profiles_; DISALLOW_COPY_AND_ASSIGN(ExtensionHistoryEventRouter); }; // Base class for history function APIs. class HistoryFunction : public AsyncExtensionFunction { public: virtual void Run(); virtual bool RunImpl() = 0; bool GetUrlFromValue(Value* value, GURL* url); bool GetTimeFromValue(Value* value, base::Time* time); }; // Base class for history funciton APIs which require async interaction with // chrome services and the extension thread. class HistoryFunctionWithCallback : public HistoryFunction { public: HistoryFunctionWithCallback(); ~HistoryFunctionWithCallback(); // Return true if the async call was completed, false otherwise. virtual bool RunAsyncImpl() = 0; // Call this method to report the results of the async method to the caller. // This method calls Release(). virtual void SendAsyncResponse(); // Override HistoryFunction::RunImpl. virtual bool RunImpl(); protected: // The consumer for the HistoryService callbacks. CancelableRequestConsumer cancelable_consumer_; private: // The actual call to SendResponse. This is required since the semantics for // CancelableRequestConsumerT require it to be accessed after the call. void SendResponseToCallback(); }; class GetVisitsHistoryFunction : public HistoryFunctionWithCallback { public: // Override HistoryFunction. virtual bool RunAsyncImpl(); DECLARE_EXTENSION_FUNCTION_NAME("history.getVisits"); // Callback for the history function to provide results. void QueryComplete(HistoryService::Handle request_service, bool success, const history::URLRow* url_row, history::VisitVector* visits); }; class SearchHistoryFunction : public HistoryFunctionWithCallback { public: virtual bool RunAsyncImpl(); DECLARE_EXTENSION_FUNCTION_NAME("history.search"); // Callback for the history function to provide results. void SearchComplete(HistoryService::Handle request_handle, history::QueryResults* results); }; class AddUrlHistoryFunction : public HistoryFunction { public: virtual bool RunImpl(); DECLARE_EXTENSION_FUNCTION_NAME("history.addUrl"); }; class DeleteAllHistoryFunction : public HistoryFunctionWithCallback { public: virtual bool RunAsyncImpl(); DECLARE_EXTENSION_FUNCTION_NAME("history.deleteAll"); // Callback for the history service to acknowledge deletion. void DeleteComplete(); }; class DeleteUrlHistoryFunction : public HistoryFunction { public: virtual bool RunImpl(); DECLARE_EXTENSION_FUNCTION_NAME("history.deleteUrl"); }; class DeleteRangeHistoryFunction : public HistoryFunctionWithCallback { public: virtual bool RunAsyncImpl(); DECLARE_EXTENSION_FUNCTION_NAME("history.deleteRange"); // Callback for the history service to acknowledge deletion. void DeleteComplete(); }; #endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_HISTORY_API_H_