diff options
-rw-r--r-- | Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h | 3 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/CMakeLists.txt | 1 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp | 8 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/DOM/DOMException.h | 157 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/DOM/DOMException.idl | 37 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/Forward.h | 2 |
6 files changed, 207 insertions, 1 deletions
diff --git a/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h b/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h index 82c4184f64..070fe82b03 100644 --- a/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h +++ b/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h @@ -34,6 +34,8 @@ #include <LibWeb/Bindings/CharacterDataPrototype.h> #include <LibWeb/Bindings/CommentConstructor.h> #include <LibWeb/Bindings/CommentPrototype.h> +#include <LibWeb/Bindings/DOMExceptionConstructor.h> +#include <LibWeb/Bindings/DOMExceptionPrototype.h> #include <LibWeb/Bindings/DOMImplementationConstructor.h> #include <LibWeb/Bindings/DOMImplementationPrototype.h> #include <LibWeb/Bindings/DocumentConstructor.h> @@ -237,6 +239,7 @@ ADD_WINDOW_OBJECT_INTERFACE(DocumentFragment) \ ADD_WINDOW_OBJECT_INTERFACE(Document) \ ADD_WINDOW_OBJECT_INTERFACE(DocumentType) \ + ADD_WINDOW_OBJECT_INTERFACE(DOMException) \ ADD_WINDOW_OBJECT_INTERFACE(DOMImplementation) \ ADD_WINDOW_OBJECT_INTERFACE(Element) \ ADD_WINDOW_OBJECT_INTERFACE(Event) \ diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index d93195bd41..563f3f743e 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -281,6 +281,7 @@ libweb_js_wrapper(DOM/Comment) libweb_js_wrapper(DOM/Document) libweb_js_wrapper(DOM/DocumentFragment) libweb_js_wrapper(DOM/DocumentType) +libweb_js_wrapper(DOM/DOMException) libweb_js_wrapper(DOM/DOMImplementation) libweb_js_wrapper(DOM/Element) libweb_js_wrapper(DOM/Event) diff --git a/Userland/Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp b/Userland/Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp index 2cd040f43f..ae90f88fee 100644 --- a/Userland/Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp +++ b/Userland/Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp @@ -1153,7 +1153,13 @@ namespace Web::Bindings { { )~~~"); - if (!interface.parent_name.is_empty()) { + if (interface.name == "DOMException") { + // https://heycam.github.io/webidl/#es-DOMException-specialness + // Object.getPrototypeOf(DOMException.prototype) === Error.prototype + generator.append(R"~~~( + set_prototype(global_object.error_prototype()); +)~~~"); + } else if (!interface.parent_name.is_empty()) { generator.append(R"~~~( set_prototype(&static_cast<WindowObject&>(global_object).ensure_web_prototype<@prototype_base_class@>("@parent_name@")); )~~~"); diff --git a/Userland/Libraries/LibWeb/DOM/DOMException.h b/Userland/Libraries/LibWeb/DOM/DOMException.h new file mode 100644 index 0000000000..a5776b7988 --- /dev/null +++ b/Userland/Libraries/LibWeb/DOM/DOMException.h @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2021, Linus Groh <mail@linusgroh.de> + * 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 <AK/FlyString.h> +#include <AK/NonnullRefPtr.h> +#include <AK/RefCounted.h> +#include <LibWeb/Bindings/WindowObject.h> +#include <LibWeb/Bindings/Wrappable.h> + +namespace Web::DOM { + +// The following have a legacy code value but *don't* produce it as +// DOMException.code value when used as name (and are therefore omitted here): +// - DOMStringSizeError (DOMSTRING_SIZE_ERR = 2) +// - NoDataAllowedError (NO_DATA_ALLOWED_ERR = 6) +// - ValidationError (VALIDATION_ERR = 16) +#define ENUMERATE_DOM_EXCEPTION_LEGACY_CODES \ + __ENUMERATE(IndexSizeError, 1) \ + __ENUMERATE(HierarchyRequestError, 3) \ + __ENUMERATE(WrongDocumentError, 4) \ + __ENUMERATE(InvalidCharacterError, 5) \ + __ENUMERATE(NoModificationAllowedError, 7) \ + __ENUMERATE(NotFoundError, 8) \ + __ENUMERATE(NotSupportedError, 9) \ + __ENUMERATE(InUseAttributeError, 10) \ + __ENUMERATE(InvalidStateError, 11) \ + __ENUMERATE(SyntaxError, 12) \ + __ENUMERATE(InvalidModificationError, 13) \ + __ENUMERATE(NamespaceError, 14) \ + __ENUMERATE(InvalidAccessError, 15) \ + __ENUMERATE(TypeMismatchError, 17) \ + __ENUMERATE(SecurityError, 18) \ + __ENUMERATE(NetworkError, 19) \ + __ENUMERATE(AbortError, 20) \ + __ENUMERATE(URLMismatchError, 21) \ + __ENUMERATE(QuotaExceededError, 22) \ + __ENUMERATE(TimeoutError, 23) \ + __ENUMERATE(InvalidNodeTypeError, 24) \ + __ENUMERATE(DataCloneError, 25) + +// https://heycam.github.io/webidl/#idl-DOMException-error-names +// Same order as in the spec document, also matches the legacy codes order above. +#define ENUMERATE_DOM_EXCEPTION_ERROR_NAMES \ + __ENUMERATE(IndexSizeError) /* Deprecated */ \ + __ENUMERATE(HierarchyRequestError) \ + __ENUMERATE(WrongDocumentError) \ + __ENUMERATE(InvalidCharacterError) \ + __ENUMERATE(NoModificationAllowedError) \ + __ENUMERATE(NotFoundError) \ + __ENUMERATE(NotSupportedError) \ + __ENUMERATE(InUseAttributeError) \ + __ENUMERATE(InvalidStateError) \ + __ENUMERATE(SyntaxError) \ + __ENUMERATE(InvalidModificationError) \ + __ENUMERATE(NamespaceError) \ + __ENUMERATE(InvalidAccessError) /* Deprecated */ \ + __ENUMERATE(TypeMismatchError) /* Deprecated */ \ + __ENUMERATE(SecurityError) \ + __ENUMERATE(NetworkError) \ + __ENUMERATE(AbortError) \ + __ENUMERATE(URLMismatchError) \ + __ENUMERATE(QuotaExceededError) \ + __ENUMERATE(TimeoutError) \ + __ENUMERATE(InvalidNodeTypeError) \ + __ENUMERATE(DataCloneError) \ + __ENUMERATE(EncodingError) \ + __ENUMERATE(NotReadableError) \ + __ENUMERATE(UnknownError) \ + __ENUMERATE(ConstraintError) \ + __ENUMERATE(DataError) \ + __ENUMERATE(TransactionInactiveError) \ + __ENUMERATE(ReadOnlyError) \ + __ENUMERATE(VersionError) \ + __ENUMERATE(OperationError) \ + __ENUMERATE(NotAllowedError) + +static u16 get_legacy_code_for_name(const FlyString& name) +{ +#define __ENUMERATE(ErrorName, code) \ + if (name == #ErrorName) \ + return code; + ENUMERATE_DOM_EXCEPTION_LEGACY_CODES +#undef __ENUMERATE + return 0; +} + +// https://heycam.github.io/webidl/#idl-DOMException +class DOMException final + : public RefCounted<DOMException> + , public Bindings::Wrappable { +public: + using WrapperType = Bindings::DOMExceptionWrapper; + + static NonnullRefPtr<DOMException> create(const FlyString& name, const FlyString& message) + { + return adopt(*new DOMException(name, message)); + } + + // JS constructor has message first, name second + static NonnullRefPtr<DOMException> create_with_global_object(Bindings::WindowObject&, const FlyString& message, const FlyString& name) + { + return adopt(*new DOMException(name, message)); + } + + const FlyString& name() const { return m_name; } + const FlyString& message() const { return m_message; } + u16 code() const { return get_legacy_code_for_name(m_name); } + +protected: + DOMException(const FlyString& name, const FlyString& message) + : m_name(name) + , m_message(message) + { + } + +private: + FlyString m_name; + FlyString m_message; +}; + +#define __ENUMERATE(ErrorName) \ + class ErrorName final { \ + public: \ + static NonnullRefPtr<DOMException> create(const FlyString& message) \ + { \ + return DOMException::create(#ErrorName, message); \ + } \ + }; +ENUMERATE_DOM_EXCEPTION_ERROR_NAMES +#undef __ENUMERATE + +} diff --git a/Userland/Libraries/LibWeb/DOM/DOMException.idl b/Userland/Libraries/LibWeb/DOM/DOMException.idl new file mode 100644 index 0000000000..b5e9d5d0d4 --- /dev/null +++ b/Userland/Libraries/LibWeb/DOM/DOMException.idl @@ -0,0 +1,37 @@ +interface DOMException { + + // FIXME: Support parameter default values in WrapperGenerator + // constructor(optional DOMString message = "", optional DOMString name = "Error"); + constructor(optional DOMString message, optional DOMString name); + + readonly attribute DOMString name; + readonly attribute DOMString message; + readonly attribute unsigned short code; + + const unsigned short INDEX_SIZE_ERR = 1; + const unsigned short DOMSTRING_SIZE_ERR = 2; + const unsigned short HIERARCHY_REQUEST_ERR = 3; + const unsigned short WRONG_DOCUMENT_ERR = 4; + const unsigned short INVALID_CHARACTER_ERR = 5; + const unsigned short NO_DATA_ALLOWED_ERR = 6; + const unsigned short NO_MODIFICATION_ALLOWED_ERR = 7; + const unsigned short NOT_FOUND_ERR = 8; + const unsigned short NOT_SUPPORTED_ERR = 9; + const unsigned short INUSE_ATTRIBUTE_ERR = 10; + const unsigned short INVALID_STATE_ERR = 11; + const unsigned short SYNTAX_ERR = 12; + const unsigned short INVALID_MODIFICATION_ERR = 13; + const unsigned short NAMESPACE_ERR = 14; + const unsigned short INVALID_ACCESS_ERR = 15; + const unsigned short VALIDATION_ERR = 16; + const unsigned short TYPE_MISMATCH_ERR = 17; + const unsigned short SECURITY_ERR = 18; + const unsigned short NETWORK_ERR = 19; + const unsigned short ABORT_ERR = 20; + const unsigned short URL_MISMATCH_ERR = 21; + const unsigned short QUOTA_EXCEEDED_ERR = 22; + const unsigned short TIMEOUT_ERR = 23; + const unsigned short INVALID_NODE_TYPE_ERR = 24; + const unsigned short DATA_CLONE_ERR = 25; + +}; diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h index 157b921fc4..cf5664944a 100644 --- a/Userland/Libraries/LibWeb/Forward.h +++ b/Userland/Libraries/LibWeb/Forward.h @@ -43,6 +43,7 @@ class Comment; class Document; class DocumentFragment; class DocumentType; +class DOMException; class DOMImplementation; class Element; class Event; @@ -205,6 +206,7 @@ class CommentWrapper; class DocumentFragmentWrapper; class DocumentTypeWrapper; class DocumentWrapper; +class DOMExceptionWrapper; class DOMImplementationWrapper; class ElementWrapper; class EventListenerWrapper; |