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::JSGlobalObject& lexicalGlobalObject, JSC::JSValue value)
{
return WrapperType::toWrapped(JSC::getVM(&lexicalGlobalObject), 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::JSGlobalObject& lexicalGlobalObject, JSC::JSValue value)
{
return WrapperType::toWrapped(lexicalGlobalObject, 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::JSGlobalObject& lexicalGlobalObject, JSC::JSValue value, ExceptionThrower&& exceptionThrower = ExceptionThrower())
{
auto& vm = JSC::getVM(&lexicalGlobalObject);
auto scope = DECLARE_THROW_SCOPE(vm);
ReturnType object = JSToWrappedOverloader<T>::toWrapped(lexicalGlobalObject, value);
if (UNLIKELY(!object))
exceptionThrower(lexicalGlobalObject, 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::JSGlobalObject& lexicalGlobalObject, JSDOMGlobalObject& globalObject, const U& value)
{
return toJS(&lexicalGlobalObject, &globalObject, Detail::getPtrOrRef(value));
}
template<typename U>
static JSC::JSValue convertNewlyCreated(JSC::JSGlobalObject& lexicalGlobalObject, JSDOMGlobalObject& globalObject, U&& value)
{
return toJSNewlyCreated(&lexicalGlobalObject, &globalObject, std::forward<U>(value));
}
};
template<typename T> struct VariadicConverter<IDLInterface<T>> {
using Item = std::reference_wrapper<T>;
static Optional<Item> convert(JSC::JSGlobalObject& lexicalGlobalObject, JSC::JSValue value)
{
auto* result = Converter<IDLInterface<T>>::convert(lexicalGlobalObject, value);
if (!result)
return WTF::nullopt;
return Optional<Item> { *result };
}
};
}