mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 09:52:44 +00:00 
			
		
		
		
	LibWeb: Add DOM::DOMException class and bindings
This commit is contained in:
		
							parent
							
								
									cc0f5917d3
								
							
						
					
					
						commit
						ada71dc71b
					
				
					 6 changed files with 207 additions and 1 deletions
				
			
		|  | @ -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)                    \ | ||||||
|  |  | ||||||
|  | @ -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) | ||||||
|  |  | ||||||
|  | @ -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
									
								
								Userland/Libraries/LibWeb/DOM/DOMException.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										157
									
								
								Userland/Libraries/LibWeb/DOM/DOMException.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -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
									
								
								Userland/Libraries/LibWeb/DOM/DOMException.idl
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								Userland/Libraries/LibWeb/DOM/DOMException.idl
									
										
									
									
									
										Normal file
									
								
							|  | @ -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; | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | @ -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; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Linus Groh
						Linus Groh