#ifndef JSDOMPromise_h
#define JSDOMPromise_h
#if ENABLE(PROMISES)
#include "JSCryptoKey.h"
#include "JSCryptoKeyPair.h"
#include "JSDOMBinding.h"
#include <heap/StrongInlines.h>
#include <runtime/JSPromiseDeferred.h>
namespace WebCore {
class DeferredWrapper {
public:
DeferredWrapper(JSC::ExecState*, JSDOMGlobalObject*);
template<class ResolveResultType>
void resolve(const ResolveResultType&);
template<class RejectResultType>
void reject(const RejectResultType&);
JSC::JSObject* promise() const;
private:
void resolve(JSC::ExecState*, JSC::JSValue);
void reject(JSC::ExecState*, JSC::JSValue);
JSC::Strong<JSDOMGlobalObject> m_globalObject;
JSC::Strong<JSC::JSPromiseDeferred> m_deferred;
};
template<class ResolveResultType>
inline void DeferredWrapper::resolve(const ResolveResultType& result)
{
JSC::ExecState* exec = m_globalObject->globalExec();
JSC::JSLockHolder locker(exec);
resolve(exec, toJS(exec, m_globalObject.get(), result));
}
template<class RejectResultType>
inline void DeferredWrapper::reject(const RejectResultType& result)
{
JSC::ExecState* exec = m_globalObject->globalExec();
JSC::JSLockHolder locker(exec);
reject(exec, toJS(exec, m_globalObject.get(), result));
}
template<>
inline void DeferredWrapper::reject(const std::nullptr_t&)
{
JSC::ExecState* exec = m_globalObject->globalExec();
JSC::JSLockHolder locker(exec);
reject(exec, JSC::jsNull());
}
template<>
inline void DeferredWrapper::resolve<String>(const String& result)
{
JSC::ExecState* exec = m_globalObject->globalExec();
JSC::JSLockHolder locker(exec);
resolve(exec, jsString(exec, result));
}
template<>
inline void DeferredWrapper::resolve<bool>(const bool& result)
{
JSC::ExecState* exec = m_globalObject->globalExec();
JSC::JSLockHolder locker(exec);
resolve(exec, JSC::jsBoolean(result));
}
template<>
inline void DeferredWrapper::resolve<Vector<unsigned char>>(const Vector<unsigned char>& result)
{
JSC::ExecState* exec = m_globalObject->globalExec();
JSC::JSLockHolder locker(exec);
RefPtr<ArrayBuffer> buffer = ArrayBuffer::create(result.data(), result.size());
resolve(exec, toJS(exec, m_globalObject.get(), buffer.get()));
}
template<>
inline void DeferredWrapper::reject<String>(const String& result)
{
JSC::ExecState* exec = m_globalObject->globalExec();
JSC::JSLockHolder locker(exec);
reject(exec, jsString(exec, result));
}
}
#endif // ENABLE(PROMISES)
#endif // JSDOMPromise_h