JSDOMConvertInterface.h [plain text]
#pragma once
#include "IDLTypes.h"
#include "JSDOMConvertBase.h"
#include <JavaScriptCore/Error.h>
namespace WebCore {
template<typename ImplementationClass> struct JSDOMWrapperConverterTraits;
template<typename T, typename Enable = void>
struct JSToWrappedOverloader {
using ReturnType = typename JSDOMWrapperConverterTraits<T>::ToWrappedReturnType;
using WrapperType = typename JSDOMWrapperConverterTraits<T>::WrapperClass;
static ReturnType toWrapped(JSC::ExecState& state, JSC::JSValue value)
{
return WrapperType::toWrapped(state.vm(), value);
}
};
template<typename T>
struct JSToWrappedOverloader<T, typename std::enable_if<JSDOMWrapperConverterTraits<T>::needsState>::type> {
using ReturnType = typename JSDOMWrapperConverterTraits<T>::ToWrappedReturnType;
using WrapperType = typename JSDOMWrapperConverterTraits<T>::WrapperClass;
static ReturnType toWrapped(JSC::ExecState& state, JSC::JSValue value)
{
return WrapperType::toWrapped(state, value);
}
};
template<typename T> struct Converter<IDLInterface<T>> : DefaultConverter<IDLInterface<T>> {
using ReturnType = typename JSDOMWrapperConverterTraits<T>::ToWrappedReturnType;
using WrapperType = typename JSDOMWrapperConverterTraits<T>::WrapperClass;
template<typename ExceptionThrower = DefaultExceptionThrower>
static ReturnType convert(JSC::ExecState& state, JSC::JSValue value, ExceptionThrower&& exceptionThrower = ExceptionThrower())
{
auto& vm = state.vm();
auto scope = DECLARE_THROW_SCOPE(vm);
ReturnType object = JSToWrappedOverloader<T>::toWrapped(state, value);
if (UNLIKELY(!object))
exceptionThrower(state, scope);
return object;
}
};
template<typename T> struct JSConverter<IDLInterface<T>> {
static constexpr bool needsState = true;
static constexpr bool needsGlobalObject = true;
template <typename U>
static JSC::JSValue convert(JSC::ExecState& state, JSDOMGlobalObject& globalObject, const U& value)
{
return toJS(&state, &globalObject, Detail::getPtrOrRef(value));
}
template<typename U>
static JSC::JSValue convertNewlyCreated(JSC::ExecState& state, JSDOMGlobalObject& globalObject, U&& value)
{
return toJSNewlyCreated(&state, &globalObject, std::forward<U>(value));
}
};
template<typename T> struct VariadicConverter<IDLInterface<T>> {
using Item = std::reference_wrapper<T>;
static std::optional<Item> convert(JSC::ExecState& state, JSC::JSValue value)
{
auto* result = Converter<IDLInterface<T>>::convert(state, value);
if (!result)
return std::nullopt;
return std::optional<Item> { *result };
}
};
}