diff --git a/Userland/Libraries/LibWeb/Bindings/ExceptionOrUtils.h b/Userland/Libraries/LibWeb/Bindings/ExceptionOrUtils.h new file mode 100644 index 0000000000..dc75dd123c --- /dev/null +++ b/Userland/Libraries/LibWeb/Bindings/ExceptionOrUtils.h @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2021, the SerenityOS developers. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#include +#include +#include +#include + +namespace Web::Bindings { + +template +struct IsExceptionOr : AK::FalseType { +}; + +template +struct IsExceptionOr> : AK::TrueType { +}; + +template +ALWAYS_INLINE bool throw_dom_exception(JS::VM& vm, JS::GlobalObject& global_object, DOM::ExceptionOr& result) +{ + if (result.is_exception()) { + vm.throw_exception(global_object, DOMExceptionWrapper::create(global_object, const_cast(result.exception()))); + return true; + } + return false; +} + +template()()), typename Ret = typename Conditional::value && !IsVoid::value, T, JS::Value>::Type> +Ret throw_dom_exception_if_needed(auto&& vm, auto&& global_object, F&& fn) +{ + if constexpr (IsExceptionOr::value) { + auto&& result = fn(); + if (throw_dom_exception(vm, global_object, result)) + return JS::Value(); + if constexpr (requires(T v) { v.value(); }) + return result.value(); + return JS::Value(); + } else if constexpr (IsVoid::value) { + fn(); + return JS::js_undefined(); + } else { + return fn(); + } +} + +template +bool should_return_empty(T&& value) +{ + if constexpr (IsSame::value) + return value.is_empty(); + return false; +} + +} diff --git a/Userland/Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp b/Userland/Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp index 99bc6f24cb..149914c902 100644 --- a/Userland/Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp +++ b/Userland/Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp @@ -1091,7 +1091,6 @@ void generate_prototype_implementation(const IDL::Interface& interface) generator.append(R"~~~( #include -#include #include #include #include @@ -1101,12 +1100,12 @@ void generate_prototype_implementation(const IDL::Interface& interface) #include #include #include -#include #include #include #include #include #include +#include #include #include #include @@ -1117,7 +1116,6 @@ void generate_prototype_implementation(const IDL::Interface& interface) #include #include #include -#include #include #include #include @@ -1410,55 +1408,6 @@ JS_DEFINE_NATIVE_SETTER(@prototype_class@::@attribute.setter_callback@) function_generator.set("function.name:snakecase", snake_name(function.name)); function_generator.append(R"~~~( -#ifndef EXCEPTION_OR_TEMPLATES -#define EXCEPTION_OR_TEMPLATES - -template -struct IsExceptionOr : AK::FalseType { -}; - -template -struct IsExceptionOr> : AK::TrueType { -}; - -template -ALWAYS_INLINE bool throw_dom_exception(JS::VM& vm, JS::GlobalObject& global_object, ExceptionOr& result) -{ - if (result.is_exception()) { - vm.throw_exception(global_object, DOMExceptionWrapper::create(global_object, const_cast(result.exception()))); - return true; - } - return false; -} - -template()()), typename Ret = typename Conditional::value && !IsVoid::value, T, JS::Value>::Type> -Ret throw_dom_exception_if_needed(auto&& vm, auto&& global_object, F&& fn) { - if constexpr (IsExceptionOr::value) { - auto&& result = fn(); - if (throw_dom_exception(vm, global_object, result)) - return JS::Value(); - if constexpr (requires(T v) { v.value(); }) - return result.value(); - return JS::Value(); - } else if constexpr (IsVoid::value) { - fn(); - return JS::js_undefined(); - } else { - return fn(); - } -} - -template -bool should_return_empty(T&& value) -{ - if constexpr (IsSame::value) - return value.is_empty(); - return false; -} - - -#endif - JS_DEFINE_NATIVE_FUNCTION(@prototype_class@::@function.name:snakecase@) { auto* impl = impl_from(vm, global_object);