Home | History | Annotate | Download | only in history
      1 // Copyright (c) 2012 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_API_HISTORY_HISTORY_API_H_
      6 #define CHROME_BROWSER_EXTENSIONS_API_HISTORY_HISTORY_API_H_
      7 
      8 #include <string>
      9 #include <vector>
     10 
     11 #include "base/compiler_specific.h"
     12 #include "chrome/browser/extensions/api/profile_keyed_api_factory.h"
     13 #include "chrome/browser/extensions/chrome_extension_function.h"
     14 #include "chrome/browser/history/history_notifications.h"
     15 #include "chrome/browser/history/history_service.h"
     16 #include "chrome/common/cancelable_task_tracker.h"
     17 #include "chrome/common/extensions/api/history.h"
     18 #include "content/public/browser/notification_registrar.h"
     19 #include "extensions/browser/event_router.h"
     20 
     21 namespace base {
     22 class ListValue;
     23 }
     24 
     25 namespace extensions {
     26 
     27 // Observes History service and routes the notifications as events to the
     28 // extension system.
     29 class HistoryEventRouter : public content::NotificationObserver {
     30  public:
     31   explicit HistoryEventRouter(Profile* profile);
     32   virtual ~HistoryEventRouter();
     33 
     34  private:
     35   // content::NotificationObserver::Observe.
     36   virtual void Observe(int type,
     37                        const content::NotificationSource& source,
     38                        const content::NotificationDetails& details) OVERRIDE;
     39 
     40   void HistoryUrlVisited(Profile* profile,
     41                          const history::URLVisitedDetails* details);
     42 
     43   void HistoryUrlsRemoved(Profile* profile,
     44                           const history::URLsDeletedDetails* details);
     45 
     46   void DispatchEvent(Profile* profile,
     47                      const std::string& event_name,
     48                      scoped_ptr<base::ListValue> event_args);
     49 
     50   // Used for tracking registrations to history service notifications.
     51   content::NotificationRegistrar registrar_;
     52 
     53   DISALLOW_COPY_AND_ASSIGN(HistoryEventRouter);
     54 };
     55 
     56 class HistoryAPI : public ProfileKeyedAPI,
     57                    public EventRouter::Observer {
     58  public:
     59   explicit HistoryAPI(Profile* profile);
     60   virtual ~HistoryAPI();
     61 
     62   // BrowserContextKeyedService implementation.
     63   virtual void Shutdown() OVERRIDE;
     64 
     65   // ProfileKeyedAPI implementation.
     66   static ProfileKeyedAPIFactory<HistoryAPI>* GetFactoryInstance();
     67 
     68   // EventRouter::Observer implementation.
     69   virtual void OnListenerAdded(const EventListenerInfo& details) OVERRIDE;
     70 
     71  private:
     72   friend class ProfileKeyedAPIFactory<HistoryAPI>;
     73 
     74   Profile* profile_;
     75 
     76   // ProfileKeyedAPI implementation.
     77   static const char* service_name() {
     78     return "HistoryAPI";
     79   }
     80   static const bool kServiceIsNULLWhileTesting = true;
     81 
     82   // Created lazily upon OnListenerAdded.
     83   scoped_ptr<HistoryEventRouter> history_event_router_;
     84 };
     85 
     86 template<>
     87 void ProfileKeyedAPIFactory<HistoryAPI>::DeclareFactoryDependencies();
     88 
     89 // Base class for history function APIs.
     90 class HistoryFunction : public ChromeAsyncExtensionFunction {
     91  protected:
     92   virtual ~HistoryFunction() {}
     93   virtual void Run() OVERRIDE;
     94 
     95   bool ValidateUrl(const std::string& url_string, GURL* url);
     96   bool VerifyDeleteAllowed();
     97   base::Time GetTime(double ms_from_epoch);
     98 };
     99 
    100 // Base class for history funciton APIs which require async interaction with
    101 // chrome services and the extension thread.
    102 class HistoryFunctionWithCallback : public HistoryFunction {
    103  public:
    104   HistoryFunctionWithCallback();
    105 
    106  protected:
    107   virtual ~HistoryFunctionWithCallback();
    108 
    109   // ExtensionFunction:
    110   virtual bool RunImpl() OVERRIDE;
    111 
    112   // Return true if the async call was completed, false otherwise.
    113   virtual bool RunAsyncImpl() = 0;
    114 
    115   // Call this method to report the results of the async method to the caller.
    116   // This method calls Release().
    117   virtual void SendAsyncResponse();
    118 
    119   // The consumer for the HistoryService callbacks.
    120   CancelableRequestConsumer cancelable_consumer_;
    121   CancelableTaskTracker task_tracker_;
    122 
    123  private:
    124   // The actual call to SendResponse.  This is required since the semantics for
    125   // CancelableRequestConsumerT require it to be accessed after the call.
    126   void SendResponseToCallback();
    127 };
    128 
    129 class HistoryGetVisitsFunction : public HistoryFunctionWithCallback {
    130  public:
    131   DECLARE_EXTENSION_FUNCTION("history.getVisits", HISTORY_GETVISITS)
    132 
    133  protected:
    134   virtual ~HistoryGetVisitsFunction() {}
    135 
    136   // HistoryFunctionWithCallback:
    137   virtual bool RunAsyncImpl() OVERRIDE;
    138 
    139   // Callback for the history function to provide results.
    140   void QueryComplete(HistoryService::Handle request_service,
    141                      bool success,
    142                      const history::URLRow* url_row,
    143                      history::VisitVector* visits);
    144 };
    145 
    146 class HistorySearchFunction : public HistoryFunctionWithCallback {
    147  public:
    148   DECLARE_EXTENSION_FUNCTION("history.search", HISTORY_SEARCH)
    149 
    150  protected:
    151   virtual ~HistorySearchFunction() {}
    152 
    153   // HistoryFunctionWithCallback:
    154   virtual bool RunAsyncImpl() OVERRIDE;
    155 
    156   // Callback for the history function to provide results.
    157   void SearchComplete(HistoryService::Handle request_handle,
    158                       history::QueryResults* results);
    159 };
    160 
    161 class HistoryAddUrlFunction : public HistoryFunction {
    162  public:
    163   DECLARE_EXTENSION_FUNCTION("history.addUrl", HISTORY_ADDURL)
    164 
    165  protected:
    166   virtual ~HistoryAddUrlFunction() {}
    167 
    168   // HistoryFunctionWithCallback:
    169   virtual bool RunImpl() OVERRIDE;
    170 };
    171 
    172 class HistoryDeleteAllFunction : public HistoryFunctionWithCallback {
    173  public:
    174   DECLARE_EXTENSION_FUNCTION("history.deleteAll", HISTORY_DELETEALL)
    175 
    176  protected:
    177   virtual ~HistoryDeleteAllFunction() {}
    178 
    179   // HistoryFunctionWithCallback:
    180   virtual bool RunAsyncImpl() OVERRIDE;
    181 
    182   // Callback for the history service to acknowledge deletion.
    183   void DeleteComplete();
    184 };
    185 
    186 
    187 class HistoryDeleteUrlFunction : public HistoryFunction {
    188  public:
    189   DECLARE_EXTENSION_FUNCTION("history.deleteUrl", HISTORY_DELETEURL)
    190 
    191  protected:
    192   virtual ~HistoryDeleteUrlFunction() {}
    193 
    194   // HistoryFunctionWithCallback:
    195   virtual bool RunImpl() OVERRIDE;
    196 };
    197 
    198 class HistoryDeleteRangeFunction : public HistoryFunctionWithCallback {
    199  public:
    200   DECLARE_EXTENSION_FUNCTION("history.deleteRange", HISTORY_DELETERANGE)
    201 
    202  protected:
    203   virtual ~HistoryDeleteRangeFunction() {}
    204 
    205   // HistoryFunctionWithCallback:
    206   virtual bool RunAsyncImpl() OVERRIDE;
    207 
    208   // Callback for the history service to acknowledge deletion.
    209   void DeleteComplete();
    210 };
    211 
    212 }  // namespace extensions
    213 
    214 #endif  // CHROME_BROWSER_EXTENSIONS_API_HISTORY_HISTORY_API_H_
    215