Bladeren bron

LibWeb: Add DOM::DOMException class and bindings

Linus Groh 4 jaren geleden
bovenliggende
commit
ada71dc71b

+ 3 - 0
Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h

@@ -34,6 +34,8 @@
 #include <LibWeb/Bindings/CharacterDataPrototype.h>
 #include <LibWeb/Bindings/CharacterDataPrototype.h>
 #include <LibWeb/Bindings/CommentConstructor.h>
 #include <LibWeb/Bindings/CommentConstructor.h>
 #include <LibWeb/Bindings/CommentPrototype.h>
 #include <LibWeb/Bindings/CommentPrototype.h>
+#include <LibWeb/Bindings/DOMExceptionConstructor.h>
+#include <LibWeb/Bindings/DOMExceptionPrototype.h>
 #include <LibWeb/Bindings/DOMImplementationConstructor.h>
 #include <LibWeb/Bindings/DOMImplementationConstructor.h>
 #include <LibWeb/Bindings/DOMImplementationPrototype.h>
 #include <LibWeb/Bindings/DOMImplementationPrototype.h>
 #include <LibWeb/Bindings/DocumentConstructor.h>
 #include <LibWeb/Bindings/DocumentConstructor.h>
@@ -237,6 +239,7 @@
     ADD_WINDOW_OBJECT_INTERFACE(DocumentFragment)         \
     ADD_WINDOW_OBJECT_INTERFACE(DocumentFragment)         \
     ADD_WINDOW_OBJECT_INTERFACE(Document)                 \
     ADD_WINDOW_OBJECT_INTERFACE(Document)                 \
     ADD_WINDOW_OBJECT_INTERFACE(DocumentType)             \
     ADD_WINDOW_OBJECT_INTERFACE(DocumentType)             \
+    ADD_WINDOW_OBJECT_INTERFACE(DOMException)             \
     ADD_WINDOW_OBJECT_INTERFACE(DOMImplementation)        \
     ADD_WINDOW_OBJECT_INTERFACE(DOMImplementation)        \
     ADD_WINDOW_OBJECT_INTERFACE(Element)                  \
     ADD_WINDOW_OBJECT_INTERFACE(Element)                  \
     ADD_WINDOW_OBJECT_INTERFACE(Event)                    \
     ADD_WINDOW_OBJECT_INTERFACE(Event)                    \

+ 1 - 0
Userland/Libraries/LibWeb/CMakeLists.txt

@@ -281,6 +281,7 @@ libweb_js_wrapper(DOM/Comment)
 libweb_js_wrapper(DOM/Document)
 libweb_js_wrapper(DOM/Document)
 libweb_js_wrapper(DOM/DocumentFragment)
 libweb_js_wrapper(DOM/DocumentFragment)
 libweb_js_wrapper(DOM/DocumentType)
 libweb_js_wrapper(DOM/DocumentType)
+libweb_js_wrapper(DOM/DOMException)
 libweb_js_wrapper(DOM/DOMImplementation)
 libweb_js_wrapper(DOM/DOMImplementation)
 libweb_js_wrapper(DOM/Element)
 libweb_js_wrapper(DOM/Element)
 libweb_js_wrapper(DOM/Event)
 libweb_js_wrapper(DOM/Event)

+ 7 - 1
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"~~~(
         generator.append(R"~~~(
     set_prototype(&static_cast<WindowObject&>(global_object).ensure_web_prototype<@prototype_base_class@>("@parent_name@"));
     set_prototype(&static_cast<WindowObject&>(global_object).ensure_web_prototype<@prototype_base_class@>("@parent_name@"));
 )~~~");
 )~~~");

+ 157 - 0
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
+
+}

+ 37 - 0
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;
+
+};

+ 2 - 0
Userland/Libraries/LibWeb/Forward.h

@@ -43,6 +43,7 @@ class Comment;
 class Document;
 class Document;
 class DocumentFragment;
 class DocumentFragment;
 class DocumentType;
 class DocumentType;
+class DOMException;
 class DOMImplementation;
 class DOMImplementation;
 class Element;
 class Element;
 class Event;
 class Event;
@@ -205,6 +206,7 @@ class CommentWrapper;
 class DocumentFragmentWrapper;
 class DocumentFragmentWrapper;
 class DocumentTypeWrapper;
 class DocumentTypeWrapper;
 class DocumentWrapper;
 class DocumentWrapper;
+class DOMExceptionWrapper;
 class DOMImplementationWrapper;
 class DOMImplementationWrapper;
 class ElementWrapper;
 class ElementWrapper;
 class EventListenerWrapper;
 class EventListenerWrapper;