// 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_