mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 01:12: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/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)                    \ | ||||
|  |  | |||
|  | @ -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) | ||||
|  |  | |||
|  | @ -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@")); | ||||
| )~~~"); | ||||
|  |  | |||
							
								
								
									
										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 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; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Linus Groh
						Linus Groh