#ifndef JSEventListener_h
#define JSEventListener_h
#include "EventListener.h"
#include <runtime/Protect.h>
namespace WebCore {
class JSDOMGlobalObject;
class JSAbstractEventListener : public EventListener {
public:
bool isInline() const { return m_isInline; }
protected:
JSAbstractEventListener(bool isInline)
: m_isInline(isInline)
{
}
private:
virtual void handleEvent(Event*, bool isWindowEvent);
virtual JSDOMGlobalObject* globalObject() const = 0;
virtual bool virtualIsInline() const;
bool m_isInline;
};
class JSEventListener : public JSAbstractEventListener {
public:
static PassRefPtr<JSEventListener> create(JSC::JSObject* listener, JSDOMGlobalObject* globalObject, bool isInline)
{
return adoptRef(new JSEventListener(listener, globalObject, isInline));
}
virtual ~JSEventListener();
void clearGlobalObject();
private:
JSEventListener(JSC::JSObject* listener, JSDOMGlobalObject*, bool isInline);
virtual JSC::JSObject* function() const;
virtual void mark();
virtual JSDOMGlobalObject* globalObject() const;
JSC::JSObject* m_listener;
JSDOMGlobalObject* m_globalObject;
};
class JSProtectedEventListener : public JSAbstractEventListener {
public:
static PassRefPtr<JSProtectedEventListener> create(JSC::JSObject* listener, JSDOMGlobalObject* globalObject, bool isInline)
{
return adoptRef(new JSProtectedEventListener(listener, globalObject, isInline));
}
virtual ~JSProtectedEventListener();
void clearGlobalObject();
protected:
JSProtectedEventListener(JSC::JSObject* listener, JSDOMGlobalObject*, bool isInline);
mutable JSC::ProtectedPtr<JSC::JSObject> m_listener;
JSC::ProtectedPtr<JSDOMGlobalObject> m_globalObject;
private:
virtual JSC::JSObject* function() const;
virtual JSDOMGlobalObject* globalObject() const;
};
}
#endif // JSEventListener_h