#ifndef CHROME_BROWSER_EXTENSIONS_ACTIVITY_LOG_H_
#define CHROME_BROWSER_EXTENSIONS_ACTIVITY_LOG_H_
#include <map>
#include <string>
#include "base/memory/singleton.h"
#include "base/observer_list_threadsafe.h"
#include "base/synchronization/lock.h"
namespace extensions {
class Extension;
class ActivityLog {
public:
enum Activity {
ACTIVITY_EXTENSION_API_CALL,
ACTIVITY_EXTENSION_API_BLOCK
};
class Observer {
public:
virtual void OnExtensionActivity(const Extension* extension,
Activity activity,
const std::string& msg) = 0;
};
~ActivityLog();
static ActivityLog* GetInstance();
void AddObserver(const Extension* extension, Observer* observer);
void RemoveObserver(const Extension* extension,
Observer* observer);
bool HasObservers(const Extension* extension) const;
void Log(const Extension* extension,
Activity activity,
const std::string& msg) const;
private:
ActivityLog();
friend struct DefaultSingletonTraits<ActivityLog>;
static const char* ActivityToString(Activity activity);
mutable base::Lock lock_;
bool log_activity_to_stdout_;
typedef ObserverListThreadSafe<Observer> ObserverList;
typedef std::map<const Extension*, scoped_refptr<ObserverList> >
ObserverMap;
ObserverMap observers_;
DISALLOW_COPY_AND_ASSIGN(ActivityLog);
};
}
#endif