#ifndef Dictionary_h
#define Dictionary_h
#include "JSDictionary.h"
#include "JSEventListener.h"
#include "NotImplemented.h"
#include "ScriptValue.h"
#include <wtf/text/CString.h>
#include <wtf/text/WTFString.h>
namespace JSC {
class JSValue;
}
namespace WebCore {
class EventListener;
class Dictionary {
public:
Dictionary(JSC::ExecState*, JSC::JSValue);
template <typename Result>
bool get(const char* propertyName, Result&) const;
template <typename Result>
bool get(const String& propertyName, Result&) const;
template <typename T>
PassRefPtr<EventListener> getEventListener(const char* propertyName, T* target) const;
template <typename T>
PassRefPtr<EventListener> getEventListener(const String& propertyName, T* target) const;
bool isObject() const { return m_dictionary.isValid(); }
bool isUndefinedOrNull() const { return !m_dictionary.isValid(); }
bool getWithUndefinedOrNullCheck(const String&, String&) const { notImplemented(); return false; }
private:
template <typename T>
JSC::JSObject* asJSObject(T*) const;
JSDictionary m_dictionary;
};
template <typename Result>
bool Dictionary::get(const char* propertyName, Result& result) const
{
if (!m_dictionary.isValid())
return false;
return m_dictionary.get(propertyName, result);
}
template <typename Result>
bool Dictionary::get(const String& propertyName, Result& result) const
{
return get(propertyName.utf8().data(), result);
}
template <typename T>
PassRefPtr<EventListener> Dictionary::getEventListener(const char* propertyName, T* target) const
{
if (!m_dictionary.isValid())
return 0;
ScriptValue eventListener;
if (!m_dictionary.tryGetProperty(propertyName, eventListener))
return 0;
if (eventListener.hasNoValue())
return 0;
return JSEventListener::create(asObject(eventListener.jsValue()), asJSObject(target), true, currentWorld(m_dictionary.execState()));
}
template <typename T>
PassRefPtr<EventListener> Dictionary::getEventListener(const String& propertyName, T* target) const
{
return getEventListener(propertyName.utf8().data(), target);
}
}
#endif // Dictionary_h