#ifndef Dictionary_h
#define Dictionary_h
#include "JSDictionary.h"
#include "JSEventListener.h"
#include <bindings/ScriptValue.h>
#include <wtf/HashMap.h>
#include <wtf/text/CString.h>
#include <wtf/text/WTFString.h>
namespace JSC {
class JSValue;
}
namespace WebCore {
class EventListener;
class Dictionary {
public:
Dictionary();
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 getOwnPropertiesAsStringHashMap(HashMap<String, String>&) const;
bool getOwnPropertyNames(Vector<String>&) const;
bool getWithUndefinedOrNullCheck(const char* propertyName, String& value) const;
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;
Deprecated::ScriptValue eventListener;
if (!m_dictionary.tryGetProperty(propertyName, eventListener))
return 0;
if (eventListener.hasNoValue())
return 0;
if (!eventListener.isObject())
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