mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 09:07:45 +00:00
LibWeb: Move DOMException from DOM/ to WebIDL/
This commit is contained in:
parent
ad04d7ac9b
commit
bbaa05fcf9
49 changed files with 206 additions and 203 deletions
|
@ -44,7 +44,7 @@ void AbortSignal::signal_abort(JS::Value reason)
|
|||
if (!reason.is_undefined())
|
||||
m_abort_reason = reason;
|
||||
else
|
||||
m_abort_reason = AbortError::create(global_object(), "Aborted without reason").ptr();
|
||||
m_abort_reason = WebIDL::AbortError::create(global_object(), "Aborted without reason").ptr();
|
||||
|
||||
// 3. For each algorithm in signal’s abort algorithms: run algorithm.
|
||||
for (auto& algorithm : m_abort_algorithms)
|
||||
|
|
|
@ -38,7 +38,7 @@ WebIDL::ExceptionOr<String> CharacterData::substring_data(size_t offset, size_t
|
|||
|
||||
// 2. If offset is greater than length, then throw an "IndexSizeError" DOMException.
|
||||
if (offset > length)
|
||||
return DOM::IndexSizeError::create(global_object(), "Substring offset out of range.");
|
||||
return WebIDL::IndexSizeError::create(global_object(), "Substring offset out of range.");
|
||||
|
||||
// 3. If offset plus count is greater than length, return a string whose value is the code units from the offsetth code unit
|
||||
// to the end of node’s data, and then return.
|
||||
|
@ -57,7 +57,7 @@ WebIDL::ExceptionOr<void> CharacterData::replace_data(size_t offset, size_t coun
|
|||
|
||||
// 2. If offset is greater than length, then throw an "IndexSizeError" DOMException.
|
||||
if (offset > length)
|
||||
return DOM::IndexSizeError::create(global_object(), "Replacement offset out of range.");
|
||||
return WebIDL::IndexSizeError::create(global_object(), "Replacement offset out of range.");
|
||||
|
||||
// 3. If offset plus count is greater than length, then set count to length minus offset.
|
||||
if (offset + count > length)
|
||||
|
|
|
@ -1,34 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Andreas Kling <kling@serenityos.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#include <LibWeb/DOM/DOMException.h>
|
||||
#include <LibWeb/HTML/Window.h>
|
||||
|
||||
namespace Web::DOM {
|
||||
|
||||
JS::NonnullGCPtr<DOMException> DOMException::create(JS::Object& global_object, FlyString const& name, FlyString const& message)
|
||||
{
|
||||
auto& window = verify_cast<HTML::Window>(global_object);
|
||||
return *window.heap().allocate<DOMException>(window.realm(), window, name, message);
|
||||
}
|
||||
|
||||
JS::NonnullGCPtr<DOMException> DOMException::create_with_global_object(JS::Object& global_object, FlyString const& message, FlyString const& name)
|
||||
{
|
||||
auto& window = verify_cast<HTML::Window>(global_object);
|
||||
return *window.heap().allocate<DOMException>(window.realm(), window, name, message);
|
||||
}
|
||||
|
||||
DOMException::DOMException(HTML::Window& window, FlyString const& name, FlyString const& message)
|
||||
: PlatformObject(window.realm())
|
||||
, m_name(name)
|
||||
, m_message(message)
|
||||
{
|
||||
set_prototype(&window.cached_web_prototype("DOMException"));
|
||||
}
|
||||
|
||||
DOMException::~DOMException() = default;
|
||||
|
||||
}
|
|
@ -1,147 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2021, Linus Groh <linusg@serenityos.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AK/FlyString.h>
|
||||
#include <LibJS/Runtime/VM.h>
|
||||
#include <LibWeb/Bindings/PlatformObject.h>
|
||||
|
||||
namespace Web::DOM {
|
||||
|
||||
#define TRY_OR_RETURN_OOM(global_object, expression) \
|
||||
({ \
|
||||
auto _temporary_result = (expression); \
|
||||
if (_temporary_result.is_error()) { \
|
||||
VERIFY(_temporary_result.error().code() == ENOMEM); \
|
||||
return DOM::UnknownError::create(global_object, "Out of memory."sv); \
|
||||
} \
|
||||
_temporary_result.release_value(); \
|
||||
})
|
||||
|
||||
// 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://webidl.spec.whatwg.org/#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(FlyString const& name)
|
||||
{
|
||||
#define __ENUMERATE(ErrorName, code) \
|
||||
if (name == #ErrorName) \
|
||||
return code;
|
||||
ENUMERATE_DOM_EXCEPTION_LEGACY_CODES
|
||||
#undef __ENUMERATE
|
||||
return 0;
|
||||
}
|
||||
|
||||
// https://webidl.spec.whatwg.org/#idl-DOMException
|
||||
class DOMException final : public Bindings::PlatformObject {
|
||||
WEB_PLATFORM_OBJECT(DOMException, Bindings::PlatformObject);
|
||||
|
||||
public:
|
||||
static JS::NonnullGCPtr<DOMException> create(JS::Object& global_object, FlyString const& name, FlyString const& message);
|
||||
|
||||
// JS constructor has message first, name second
|
||||
// FIXME: This is a completely pointless footgun, let's use the same order for both factories.
|
||||
static JS::NonnullGCPtr<DOMException> create_with_global_object(JS::Object& global_object, FlyString const& message, FlyString const& name);
|
||||
|
||||
static JS::NonnullGCPtr<DOMException> create(JS::Realm& realm, FlyString const& message);
|
||||
|
||||
virtual ~DOMException() override;
|
||||
|
||||
FlyString const& name() const { return m_name; }
|
||||
FlyString const& message() const { return m_message; }
|
||||
u16 code() const { return get_legacy_code_for_name(m_name); }
|
||||
|
||||
protected:
|
||||
DOMException(HTML::Window&, FlyString const& name, FlyString const& message);
|
||||
|
||||
private:
|
||||
FlyString m_name;
|
||||
FlyString m_message;
|
||||
};
|
||||
|
||||
#define __ENUMERATE(ErrorName) \
|
||||
class ErrorName final { \
|
||||
public: \
|
||||
static JS::NonnullGCPtr<DOMException> create(JS::Object& global_object, FlyString const& message) \
|
||||
{ \
|
||||
return DOMException::create(global_object, #ErrorName, message); \
|
||||
} \
|
||||
};
|
||||
ENUMERATE_DOM_EXCEPTION_ERROR_NAMES
|
||||
#undef __ENUMERATE
|
||||
|
||||
}
|
||||
|
||||
namespace Web {
|
||||
|
||||
inline JS::Completion throw_completion(JS::NonnullGCPtr<DOM::DOMException> exception)
|
||||
{
|
||||
return JS::throw_completion(JS::Value(static_cast<JS::Object*>(exception.ptr())));
|
||||
}
|
||||
|
||||
}
|
|
@ -1,35 +0,0 @@
|
|||
interface DOMException {
|
||||
|
||||
constructor(optional DOMString message = "", optional DOMString name = "Error");
|
||||
|
||||
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;
|
||||
|
||||
};
|
|
@ -7,11 +7,11 @@
|
|||
|
||||
#include <AK/CharacterTypes.h>
|
||||
#include <AK/StringBuilder.h>
|
||||
#include <LibWeb/DOM/DOMException.h>
|
||||
#include <LibWeb/DOM/DOMTokenList.h>
|
||||
#include <LibWeb/DOM/Document.h>
|
||||
#include <LibWeb/DOM/Element.h>
|
||||
#include <LibWeb/HTML/Window.h>
|
||||
#include <LibWeb/WebIDL/DOMException.h>
|
||||
|
||||
namespace {
|
||||
|
||||
|
@ -234,9 +234,9 @@ void DOMTokenList::set_value(String value)
|
|||
WebIDL::ExceptionOr<void> DOMTokenList::validate_token(StringView token) const
|
||||
{
|
||||
if (token.is_empty())
|
||||
return SyntaxError::create(global_object(), "Non-empty DOM tokens are not allowed");
|
||||
return WebIDL::SyntaxError::create(global_object(), "Non-empty DOM tokens are not allowed");
|
||||
if (any_of(token, is_ascii_space))
|
||||
return InvalidCharacterError::create(global_object(), "DOM tokens containing ASCII whitespace are not allowed");
|
||||
return WebIDL::InvalidCharacterError::create(global_object(), "DOM tokens containing ASCII whitespace are not allowed");
|
||||
return {};
|
||||
}
|
||||
|
||||
|
|
|
@ -20,7 +20,6 @@
|
|||
#include <LibWeb/Cookie/ParsedCookie.h>
|
||||
#include <LibWeb/DOM/Comment.h>
|
||||
#include <LibWeb/DOM/CustomEvent.h>
|
||||
#include <LibWeb/DOM/DOMException.h>
|
||||
#include <LibWeb/DOM/DOMImplementation.h>
|
||||
#include <LibWeb/DOM/Document.h>
|
||||
#include <LibWeb/DOM/DocumentFragment.h>
|
||||
|
@ -72,6 +71,7 @@
|
|||
#include <LibWeb/UIEvents/FocusEvent.h>
|
||||
#include <LibWeb/UIEvents/KeyboardEvent.h>
|
||||
#include <LibWeb/UIEvents/MouseEvent.h>
|
||||
#include <LibWeb/WebIDL/DOMException.h>
|
||||
#include <LibWeb/WebIDL/ExceptionOr.h>
|
||||
|
||||
namespace Web::DOM {
|
||||
|
@ -374,11 +374,11 @@ WebIDL::ExceptionOr<void> Document::run_the_document_write_steps(String input)
|
|||
{
|
||||
// 1. If document is an XML document, then throw an "InvalidStateError" DOMException.
|
||||
if (m_type == Type::XML)
|
||||
return DOM::InvalidStateError::create(global_object(), "write() called on XML document.");
|
||||
return WebIDL::InvalidStateError::create(global_object(), "write() called on XML document.");
|
||||
|
||||
// 2. If document's throw-on-dynamic-markup-insertion counter is greater than 0, then throw an "InvalidStateError" DOMException.
|
||||
if (m_throw_on_dynamic_markup_insertion_counter > 0)
|
||||
return DOM::InvalidStateError::create(global_object(), "throw-on-dynamic-markup-insertion-counter greater than zero.");
|
||||
return WebIDL::InvalidStateError::create(global_object(), "throw-on-dynamic-markup-insertion-counter greater than zero.");
|
||||
|
||||
// 3. If document's active parser was aborted is true, then return.
|
||||
if (m_active_parser_was_aborted)
|
||||
|
@ -409,18 +409,18 @@ WebIDL::ExceptionOr<Document*> Document::open(String const&, String const&)
|
|||
{
|
||||
// 1. If document is an XML document, then throw an "InvalidStateError" DOMException exception.
|
||||
if (m_type == Type::XML)
|
||||
return DOM::InvalidStateError::create(global_object(), "open() called on XML document.");
|
||||
return WebIDL::InvalidStateError::create(global_object(), "open() called on XML document.");
|
||||
|
||||
// 2. If document's throw-on-dynamic-markup-insertion counter is greater than 0, then throw an "InvalidStateError" DOMException.
|
||||
if (m_throw_on_dynamic_markup_insertion_counter > 0)
|
||||
return DOM::InvalidStateError::create(global_object(), "throw-on-dynamic-markup-insertion-counter greater than zero.");
|
||||
return WebIDL::InvalidStateError::create(global_object(), "throw-on-dynamic-markup-insertion-counter greater than zero.");
|
||||
|
||||
// FIXME: 3. Let entryDocument be the entry global object's associated Document.
|
||||
auto& entry_document = *this;
|
||||
|
||||
// 4. If document's origin is not same origin to entryDocument's origin, then throw a "SecurityError" DOMException.
|
||||
if (origin() != entry_document.origin())
|
||||
return DOM::SecurityError::create(global_object(), "Document.origin() not the same as entryDocument's.");
|
||||
return WebIDL::SecurityError::create(global_object(), "Document.origin() not the same as entryDocument's.");
|
||||
|
||||
// 5. If document has an active parser whose script nesting level is greater than 0, then return document.
|
||||
if (m_parser && m_parser->script_nesting_level() > 0)
|
||||
|
@ -480,11 +480,11 @@ WebIDL::ExceptionOr<void> Document::close()
|
|||
{
|
||||
// 1. If document is an XML document, then throw an "InvalidStateError" DOMException exception.
|
||||
if (m_type == Type::XML)
|
||||
return DOM::InvalidStateError::create(global_object(), "close() called on XML document.");
|
||||
return WebIDL::InvalidStateError::create(global_object(), "close() called on XML document.");
|
||||
|
||||
// 2. If document's throw-on-dynamic-markup-insertion counter is greater than 0, then throw an "InvalidStateError" DOMException.
|
||||
if (m_throw_on_dynamic_markup_insertion_counter > 0)
|
||||
return DOM::InvalidStateError::create(global_object(), "throw-on-dynamic-markup-insertion-counter greater than zero.");
|
||||
return WebIDL::InvalidStateError::create(global_object(), "throw-on-dynamic-markup-insertion-counter greater than zero.");
|
||||
|
||||
// 3. If there is no script-created parser associated with the document, then return.
|
||||
if (!m_parser)
|
||||
|
@ -588,7 +588,7 @@ HTML::HTMLElement* Document::body()
|
|||
WebIDL::ExceptionOr<void> Document::set_body(HTML::HTMLElement* new_body)
|
||||
{
|
||||
if (!is<HTML::HTMLBodyElement>(new_body) && !is<HTML::HTMLFrameSetElement>(new_body))
|
||||
return DOM::HierarchyRequestError::create(global_object(), "Invalid document body element, must be 'body' or 'frameset'");
|
||||
return WebIDL::HierarchyRequestError::create(global_object(), "Invalid document body element, must be 'body' or 'frameset'");
|
||||
|
||||
auto* existing_body = body();
|
||||
if (existing_body) {
|
||||
|
@ -598,7 +598,7 @@ WebIDL::ExceptionOr<void> Document::set_body(HTML::HTMLElement* new_body)
|
|||
|
||||
auto* document_element = this->document_element();
|
||||
if (!document_element)
|
||||
return DOM::HierarchyRequestError::create(global_object(), "Missing document element");
|
||||
return WebIDL::HierarchyRequestError::create(global_object(), "Missing document element");
|
||||
|
||||
(void)TRY(document_element->append_child(*new_body));
|
||||
return {};
|
||||
|
@ -1114,7 +1114,7 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<Element>> Document::create_element(FlyStrin
|
|||
|
||||
// 1. If localName does not match the Name production, then throw an "InvalidCharacterError" DOMException.
|
||||
if (!is_valid_name(local_name))
|
||||
return DOM::InvalidCharacterError::create(global_object(), "Invalid character in tag name.");
|
||||
return WebIDL::InvalidCharacterError::create(global_object(), "Invalid character in tag name.");
|
||||
|
||||
// 2. If this is an HTML document, then set localName to localName in ASCII lowercase.
|
||||
if (document_type() == Type::HTML)
|
||||
|
@ -1219,7 +1219,7 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<Event>> Document::create_event(String const
|
|||
|
||||
// 3. If constructor is null, then throw a "NotSupportedError" DOMException.
|
||||
if (!event) {
|
||||
return DOM::NotSupportedError::create(global_object(), "No constructor for interface found");
|
||||
return WebIDL::NotSupportedError::create(global_object(), "No constructor for interface found");
|
||||
}
|
||||
|
||||
// FIXME: 4. If the interface indicated by constructor is not exposed on the relevant global object of this, then throw a "NotSupportedError" DOMException.
|
||||
|
@ -1289,7 +1289,7 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<Node>> Document::import_node(JS::NonnullGCP
|
|||
{
|
||||
// 1. If node is a document or shadow root, then throw a "NotSupportedError" DOMException.
|
||||
if (is<Document>(*node) || is<ShadowRoot>(*node))
|
||||
return DOM::NotSupportedError::create(global_object(), "Cannot import a document or shadow root.");
|
||||
return WebIDL::NotSupportedError::create(global_object(), "Cannot import a document or shadow root.");
|
||||
|
||||
// 2. Return a clone of node, with this and the clone children flag set if deep is true.
|
||||
return node->clone_node(this, deep);
|
||||
|
@ -1336,10 +1336,10 @@ void Document::adopt_node(Node& node)
|
|||
WebIDL::ExceptionOr<JS::NonnullGCPtr<Node>> Document::adopt_node_binding(JS::NonnullGCPtr<Node> node)
|
||||
{
|
||||
if (is<Document>(*node))
|
||||
return DOM::NotSupportedError::create(global_object(), "Cannot adopt a document into a document");
|
||||
return WebIDL::NotSupportedError::create(global_object(), "Cannot adopt a document into a document");
|
||||
|
||||
if (is<ShadowRoot>(*node))
|
||||
return DOM::HierarchyRequestError::create(global_object(), "Cannot adopt a shadow root into a document");
|
||||
return WebIDL::HierarchyRequestError::create(global_object(), "Cannot adopt a shadow root into a document");
|
||||
|
||||
if (is<DocumentFragment>(*node) && verify_cast<DocumentFragment>(*node).host())
|
||||
return node;
|
||||
|
@ -1801,11 +1801,11 @@ bool Document::is_valid_name(String const& name)
|
|||
WebIDL::ExceptionOr<Document::PrefixAndTagName> Document::validate_qualified_name(JS::Object& global_object, String const& qualified_name)
|
||||
{
|
||||
if (qualified_name.is_empty())
|
||||
return InvalidCharacterError::create(global_object, "Empty string is not a valid qualified name.");
|
||||
return WebIDL::InvalidCharacterError::create(global_object, "Empty string is not a valid qualified name.");
|
||||
|
||||
Utf8View utf8view { qualified_name };
|
||||
if (!utf8view.validate())
|
||||
return InvalidCharacterError::create(global_object, "Invalid qualified name.");
|
||||
return WebIDL::InvalidCharacterError::create(global_object, "Invalid qualified name.");
|
||||
|
||||
Optional<size_t> colon_offset;
|
||||
|
||||
|
@ -1815,19 +1815,19 @@ WebIDL::ExceptionOr<Document::PrefixAndTagName> Document::validate_qualified_nam
|
|||
auto code_point = *it;
|
||||
if (code_point == ':') {
|
||||
if (colon_offset.has_value())
|
||||
return InvalidCharacterError::create(global_object, "More than one colon (:) in qualified name.");
|
||||
return WebIDL::InvalidCharacterError::create(global_object, "More than one colon (:) in qualified name.");
|
||||
colon_offset = utf8view.byte_offset_of(it);
|
||||
at_start_of_name = true;
|
||||
continue;
|
||||
}
|
||||
if (at_start_of_name) {
|
||||
if (!is_valid_name_start_character(code_point))
|
||||
return InvalidCharacterError::create(global_object, "Invalid start of qualified name.");
|
||||
return WebIDL::InvalidCharacterError::create(global_object, "Invalid start of qualified name.");
|
||||
at_start_of_name = false;
|
||||
continue;
|
||||
}
|
||||
if (!is_valid_name_character(code_point))
|
||||
return InvalidCharacterError::create(global_object, "Invalid character in qualified name.");
|
||||
return WebIDL::InvalidCharacterError::create(global_object, "Invalid character in qualified name.");
|
||||
}
|
||||
|
||||
if (!colon_offset.has_value())
|
||||
|
@ -1837,10 +1837,10 @@ WebIDL::ExceptionOr<Document::PrefixAndTagName> Document::validate_qualified_nam
|
|||
};
|
||||
|
||||
if (*colon_offset == 0)
|
||||
return InvalidCharacterError::create(global_object, "Qualified name can't start with colon (:).");
|
||||
return WebIDL::InvalidCharacterError::create(global_object, "Qualified name can't start with colon (:).");
|
||||
|
||||
if (*colon_offset >= (qualified_name.length() - 1))
|
||||
return InvalidCharacterError::create(global_object, "Qualified name can't end with colon (:).");
|
||||
return WebIDL::InvalidCharacterError::create(global_object, "Qualified name can't end with colon (:).");
|
||||
|
||||
return Document::PrefixAndTagName {
|
||||
.prefix = qualified_name.substring_view(0, *colon_offset),
|
||||
|
|
|
@ -12,7 +12,6 @@
|
|||
#include <LibWeb/CSS/PropertyID.h>
|
||||
#include <LibWeb/CSS/ResolvedCSSStyleDeclaration.h>
|
||||
#include <LibWeb/CSS/SelectorEngine.h>
|
||||
#include <LibWeb/DOM/DOMException.h>
|
||||
#include <LibWeb/DOM/DOMTokenList.h>
|
||||
#include <LibWeb/DOM/Document.h>
|
||||
#include <LibWeb/DOM/Element.h>
|
||||
|
@ -38,6 +37,7 @@
|
|||
#include <LibWeb/Layout/TreeBuilder.h>
|
||||
#include <LibWeb/Namespace.h>
|
||||
#include <LibWeb/Painting/PaintableBox.h>
|
||||
#include <LibWeb/WebIDL/DOMException.h>
|
||||
#include <LibWeb/WebIDL/ExceptionOr.h>
|
||||
|
||||
namespace Web::DOM {
|
||||
|
@ -87,7 +87,7 @@ WebIDL::ExceptionOr<void> Element::set_attribute(FlyString const& name, String c
|
|||
// 1. If qualifiedName does not match the Name production in XML, then throw an "InvalidCharacterError" DOMException.
|
||||
// FIXME: Proper name validation
|
||||
if (name.is_empty())
|
||||
return InvalidCharacterError::create(global_object(), "Attribute name must not be empty");
|
||||
return WebIDL::InvalidCharacterError::create(global_object(), "Attribute name must not be empty");
|
||||
|
||||
// 2. If this is in the HTML namespace and its node document is an HTML document, then set qualifiedName to qualifiedName in ASCII lowercase.
|
||||
// FIXME: Handle the second condition, assume it is an HTML document for now.
|
||||
|
@ -142,19 +142,19 @@ WebIDL::ExceptionOr<QualifiedName> validate_and_extract(JS::Object& global_objec
|
|||
|
||||
// 6. If prefix is non-null and namespace is null, then throw a "NamespaceError" DOMException.
|
||||
if (!prefix.is_null() && namespace_.is_null())
|
||||
return NamespaceError::create(global_object, "Prefix is non-null and namespace is null.");
|
||||
return WebIDL::NamespaceError::create(global_object, "Prefix is non-null and namespace is null.");
|
||||
|
||||
// 7. If prefix is "xml" and namespace is not the XML namespace, then throw a "NamespaceError" DOMException.
|
||||
if (prefix == "xml"sv && namespace_ != Namespace::XML)
|
||||
return NamespaceError::create(global_object, "Prefix is 'xml' and namespace is not the XML namespace.");
|
||||
return WebIDL::NamespaceError::create(global_object, "Prefix is 'xml' and namespace is not the XML namespace.");
|
||||
|
||||
// 8. If either qualifiedName or prefix is "xmlns" and namespace is not the XMLNS namespace, then throw a "NamespaceError" DOMException.
|
||||
if ((qualified_name == "xmlns"sv || prefix == "xmlns"sv) && namespace_ != Namespace::XMLNS)
|
||||
return NamespaceError::create(global_object, "Either qualifiedName or prefix is 'xmlns' and namespace is not the XMLNS namespace.");
|
||||
return WebIDL::NamespaceError::create(global_object, "Either qualifiedName or prefix is 'xmlns' and namespace is not the XMLNS namespace.");
|
||||
|
||||
// 9. If namespace is the XMLNS namespace and neither qualifiedName nor prefix is "xmlns", then throw a "NamespaceError" DOMException.
|
||||
if (namespace_ == Namespace::XMLNS && !(qualified_name == "xmlns"sv || prefix == "xmlns"sv))
|
||||
return NamespaceError::create(global_object, "Namespace is the XMLNS namespace and neither qualifiedName nor prefix is 'xmlns'.");
|
||||
return WebIDL::NamespaceError::create(global_object, "Namespace is the XMLNS namespace and neither qualifiedName nor prefix is 'xmlns'.");
|
||||
|
||||
// 10. Return namespace, prefix, and localName.
|
||||
return QualifiedName { local_name, prefix, namespace_ };
|
||||
|
@ -195,7 +195,7 @@ WebIDL::ExceptionOr<bool> Element::toggle_attribute(FlyString const& name, Optio
|
|||
// 1. If qualifiedName does not match the Name production in XML, then throw an "InvalidCharacterError" DOMException.
|
||||
// FIXME: Proper name validation
|
||||
if (name.is_empty())
|
||||
return InvalidCharacterError::create(global_object(), "Attribute name must not be empty");
|
||||
return WebIDL::InvalidCharacterError::create(global_object(), "Attribute name must not be empty");
|
||||
|
||||
// 2. If this is in the HTML namespace and its node document is an HTML document, then set qualifiedName to qualifiedName in ASCII lowercase.
|
||||
// FIXME: Handle the second condition, assume it is an HTML document for now.
|
||||
|
@ -443,7 +443,7 @@ WebIDL::ExceptionOr<bool> Element::matches(StringView selectors) const
|
|||
{
|
||||
auto maybe_selectors = parse_selector(CSS::Parser::ParsingContext(static_cast<ParentNode&>(const_cast<Element&>(*this))), selectors);
|
||||
if (!maybe_selectors.has_value())
|
||||
return DOM::SyntaxError::create(global_object(), "Failed to parse selector");
|
||||
return WebIDL::SyntaxError::create(global_object(), "Failed to parse selector");
|
||||
|
||||
auto sel = maybe_selectors.value();
|
||||
for (auto& s : sel) {
|
||||
|
@ -458,7 +458,7 @@ WebIDL::ExceptionOr<DOM::Element const*> Element::closest(StringView selectors)
|
|||
{
|
||||
auto maybe_selectors = parse_selector(CSS::Parser::ParsingContext(static_cast<ParentNode&>(const_cast<Element&>(*this))), selectors);
|
||||
if (!maybe_selectors.has_value())
|
||||
return DOM::SyntaxError::create(global_object(), "Failed to parse selector");
|
||||
return WebIDL::SyntaxError::create(global_object(), "Failed to parse selector");
|
||||
|
||||
auto matches_selectors = [](CSS::SelectorList const& selector_list, Element const* element) {
|
||||
for (auto& selector : selector_list) {
|
||||
|
@ -741,7 +741,7 @@ WebIDL::ExceptionOr<void> Element::insert_adjacent_html(String position, String
|
|||
|
||||
// If context is null or a Document, throw a "NoModificationAllowedError" DOMException.
|
||||
if (!context || context->is_document())
|
||||
return NoModificationAllowedError::create(window(), "insertAdjacentHTML: context is null or a Document"sv);
|
||||
return WebIDL::NoModificationAllowedError::create(window(), "insertAdjacentHTML: context is null or a Document"sv);
|
||||
}
|
||||
// - If position is an ASCII case-insensitive match for the string "afterbegin"
|
||||
// - If position is an ASCII case-insensitive match for the string "beforeend"
|
||||
|
@ -752,7 +752,7 @@ WebIDL::ExceptionOr<void> Element::insert_adjacent_html(String position, String
|
|||
// Otherwise
|
||||
else {
|
||||
// Throw a "SyntaxError" DOMException.
|
||||
return SyntaxError::create(window(), "insertAdjacentHTML: invalid position argument"sv);
|
||||
return WebIDL::SyntaxError::create(window(), "insertAdjacentHTML: invalid position argument"sv);
|
||||
}
|
||||
|
||||
// 2. If context is not an Element or the following are all true:
|
||||
|
|
|
@ -227,10 +227,10 @@ WebIDL::ExceptionOr<bool> EventTarget::dispatch_event_binding(Event& event)
|
|||
{
|
||||
// 1. If event’s dispatch flag is set, or if its initialized flag is not set, then throw an "InvalidStateError" DOMException.
|
||||
if (event.dispatched())
|
||||
return DOM::InvalidStateError::create(global_object(), "The event is already being dispatched.");
|
||||
return WebIDL::InvalidStateError::create(global_object(), "The event is already being dispatched.");
|
||||
|
||||
if (!event.initialized())
|
||||
return DOM::InvalidStateError::create(global_object(), "Cannot dispatch an uninitialized event.");
|
||||
return WebIDL::InvalidStateError::create(global_object(), "Cannot dispatch an uninitialized event.");
|
||||
|
||||
// 2. Initialize event’s isTrusted attribute to false.
|
||||
event.set_is_trusted(false);
|
||||
|
|
|
@ -93,7 +93,7 @@ WebIDL::ExceptionOr<Attr const*> NamedNodeMap::remove_named_item(StringView qual
|
|||
|
||||
// 2. If attr is null, then throw a "NotFoundError" DOMException.
|
||||
if (!attribute)
|
||||
return NotFoundError::create(global_object(), String::formatted("Attribute with name '{}' not found", qualified_name));
|
||||
return WebIDL::NotFoundError::create(global_object(), String::formatted("Attribute with name '{}' not found", qualified_name));
|
||||
|
||||
// 3. Return attr.
|
||||
return nullptr;
|
||||
|
@ -137,7 +137,7 @@ WebIDL::ExceptionOr<Attr const*> NamedNodeMap::set_attribute(Attr& attribute)
|
|||
{
|
||||
// 1. If attr’s element is neither null nor element, throw an "InUseAttributeError" DOMException.
|
||||
if ((attribute.owner_element() != nullptr) && (attribute.owner_element() != &associated_element()))
|
||||
return InUseAttributeError::create(global_object(), "Attribute must not already be in use"sv);
|
||||
return WebIDL::InUseAttributeError::create(global_object(), "Attribute must not already be in use"sv);
|
||||
|
||||
// 2. Let oldAttr be the result of getting an attribute given attr’s namespace, attr’s local name, and element.
|
||||
// FIXME: When getNamedItemNS is implemented, use that instead.
|
||||
|
|
|
@ -315,24 +315,24 @@ WebIDL::ExceptionOr<void> Node::ensure_pre_insertion_validity(JS::NonnullGCPtr<N
|
|||
{
|
||||
// 1. If parent is not a Document, DocumentFragment, or Element node, then throw a "HierarchyRequestError" DOMException.
|
||||
if (!is<Document>(this) && !is<DocumentFragment>(this) && !is<Element>(this))
|
||||
return DOM::HierarchyRequestError::create(global_object(), "Can only insert into a document, document fragment or element");
|
||||
return WebIDL::HierarchyRequestError::create(global_object(), "Can only insert into a document, document fragment or element");
|
||||
|
||||
// 2. If node is a host-including inclusive ancestor of parent, then throw a "HierarchyRequestError" DOMException.
|
||||
if (node->is_host_including_inclusive_ancestor_of(*this))
|
||||
return DOM::HierarchyRequestError::create(global_object(), "New node is an ancestor of this node");
|
||||
return WebIDL::HierarchyRequestError::create(global_object(), "New node is an ancestor of this node");
|
||||
|
||||
// 3. If child is non-null and its parent is not parent, then throw a "NotFoundError" DOMException.
|
||||
if (child && child->parent() != this)
|
||||
return DOM::NotFoundError::create(global_object(), "This node is not the parent of the given child");
|
||||
return WebIDL::NotFoundError::create(global_object(), "This node is not the parent of the given child");
|
||||
|
||||
// FIXME: All the following "Invalid node type for insertion" messages could be more descriptive.
|
||||
// 4. If node is not a DocumentFragment, DocumentType, Element, or CharacterData node, then throw a "HierarchyRequestError" DOMException.
|
||||
if (!is<DocumentFragment>(*node) && !is<DocumentType>(*node) && !is<Element>(*node) && !is<Text>(*node) && !is<Comment>(*node) && !is<ProcessingInstruction>(*node))
|
||||
return DOM::HierarchyRequestError::create(global_object(), "Invalid node type for insertion");
|
||||
return WebIDL::HierarchyRequestError::create(global_object(), "Invalid node type for insertion");
|
||||
|
||||
// 5. If either node is a Text node and parent is a document, or node is a doctype and parent is not a document, then throw a "HierarchyRequestError" DOMException.
|
||||
if ((is<Text>(*node) && is<Document>(this)) || (is<DocumentType>(*node) && !is<Document>(this)))
|
||||
return DOM::HierarchyRequestError::create(global_object(), "Invalid node type for insertion");
|
||||
return WebIDL::HierarchyRequestError::create(global_object(), "Invalid node type for insertion");
|
||||
|
||||
// 6. If parent is a document, and any of the statements below, switched on the interface node implements, are true, then throw a "HierarchyRequestError" DOMException.
|
||||
if (is<Document>(this)) {
|
||||
|
@ -343,18 +343,18 @@ WebIDL::ExceptionOr<void> Node::ensure_pre_insertion_validity(JS::NonnullGCPtr<N
|
|||
auto node_element_child_count = verify_cast<DocumentFragment>(*node).child_element_count();
|
||||
if ((node_element_child_count > 1 || node->has_child_of_type<Text>())
|
||||
|| (node_element_child_count == 1 && (has_child_of_type<Element>() || is<DocumentType>(child.ptr()) || (child && child->has_following_node_of_type_in_tree_order<DocumentType>())))) {
|
||||
return DOM::HierarchyRequestError::create(global_object(), "Invalid node type for insertion");
|
||||
return WebIDL::HierarchyRequestError::create(global_object(), "Invalid node type for insertion");
|
||||
}
|
||||
} else if (is<Element>(*node)) {
|
||||
// Element
|
||||
// If parent has an element child, child is a doctype, or child is non-null and a doctype is following child.
|
||||
if (has_child_of_type<Element>() || is<DocumentType>(child.ptr()) || (child && child->has_following_node_of_type_in_tree_order<DocumentType>()))
|
||||
return DOM::HierarchyRequestError::create(global_object(), "Invalid node type for insertion");
|
||||
return WebIDL::HierarchyRequestError::create(global_object(), "Invalid node type for insertion");
|
||||
} else if (is<DocumentType>(*node)) {
|
||||
// DocumentType
|
||||
// parent has a doctype child, child is non-null and an element is preceding child, or child is null and parent has an element child.
|
||||
if (has_child_of_type<DocumentType>() || (child && child->has_preceding_node_of_type_in_tree_order<Element>()) || (!child && has_child_of_type<Element>()))
|
||||
return DOM::HierarchyRequestError::create(global_object(), "Invalid node type for insertion");
|
||||
return WebIDL::HierarchyRequestError::create(global_object(), "Invalid node type for insertion");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -487,7 +487,7 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<Node>> Node::pre_remove(JS::NonnullGCPtr<No
|
|||
{
|
||||
// 1. If child’s parent is not parent, then throw a "NotFoundError" DOMException.
|
||||
if (child->parent() != this)
|
||||
return DOM::NotFoundError::create(global_object(), "Child does not belong to this node");
|
||||
return WebIDL::NotFoundError::create(global_object(), "Child does not belong to this node");
|
||||
|
||||
// 2. Remove child.
|
||||
child->remove();
|
||||
|
@ -612,25 +612,25 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<Node>> Node::replace_child(JS::NonnullGCPtr
|
|||
{
|
||||
// If parent is not a Document, DocumentFragment, or Element node, then throw a "HierarchyRequestError" DOMException.
|
||||
if (!is<Document>(this) && !is<DocumentFragment>(this) && !is<Element>(this))
|
||||
return DOM::HierarchyRequestError::create(global_object(), "Can only insert into a document, document fragment or element");
|
||||
return WebIDL::HierarchyRequestError::create(global_object(), "Can only insert into a document, document fragment or element");
|
||||
|
||||
// 2. If node is a host-including inclusive ancestor of parent, then throw a "HierarchyRequestError" DOMException.
|
||||
if (node->is_host_including_inclusive_ancestor_of(*this))
|
||||
return DOM::HierarchyRequestError::create(global_object(), "New node is an ancestor of this node");
|
||||
return WebIDL::HierarchyRequestError::create(global_object(), "New node is an ancestor of this node");
|
||||
|
||||
// 3. If child’s parent is not parent, then throw a "NotFoundError" DOMException.
|
||||
if (child->parent() != this)
|
||||
return DOM::NotFoundError::create(global_object(), "This node is not the parent of the given child");
|
||||
return WebIDL::NotFoundError::create(global_object(), "This node is not the parent of the given child");
|
||||
|
||||
// FIXME: All the following "Invalid node type for insertion" messages could be more descriptive.
|
||||
|
||||
// 4. If node is not a DocumentFragment, DocumentType, Element, or CharacterData node, then throw a "HierarchyRequestError" DOMException.
|
||||
if (!is<DocumentFragment>(*node) && !is<DocumentType>(*node) && !is<Element>(*node) && !is<Text>(*node) && !is<Comment>(*node) && !is<ProcessingInstruction>(*node))
|
||||
return DOM::HierarchyRequestError::create(global_object(), "Invalid node type for insertion");
|
||||
return WebIDL::HierarchyRequestError::create(global_object(), "Invalid node type for insertion");
|
||||
|
||||
// 5. If either node is a Text node and parent is a document, or node is a doctype and parent is not a document, then throw a "HierarchyRequestError" DOMException.
|
||||
if ((is<Text>(*node) && is<Document>(this)) || (is<DocumentType>(*node) && !is<Document>(this)))
|
||||
return DOM::HierarchyRequestError::create(global_object(), "Invalid node type for insertion");
|
||||
return WebIDL::HierarchyRequestError::create(global_object(), "Invalid node type for insertion");
|
||||
|
||||
// If parent is a document, and any of the statements below, switched on the interface node implements, are true, then throw a "HierarchyRequestError" DOMException.
|
||||
if (is<Document>(this)) {
|
||||
|
@ -641,18 +641,18 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<Node>> Node::replace_child(JS::NonnullGCPtr
|
|||
auto node_element_child_count = verify_cast<DocumentFragment>(*node).child_element_count();
|
||||
if ((node_element_child_count > 1 || node->has_child_of_type<Text>())
|
||||
|| (node_element_child_count == 1 && (first_child_of_type<Element>() != child || child->has_following_node_of_type_in_tree_order<DocumentType>()))) {
|
||||
return DOM::HierarchyRequestError::create(global_object(), "Invalid node type for insertion");
|
||||
return WebIDL::HierarchyRequestError::create(global_object(), "Invalid node type for insertion");
|
||||
}
|
||||
} else if (is<Element>(*node)) {
|
||||
// Element
|
||||
// parent has an element child that is not child or a doctype is following child.
|
||||
if (first_child_of_type<Element>() != child || child->has_following_node_of_type_in_tree_order<DocumentType>())
|
||||
return DOM::HierarchyRequestError::create(global_object(), "Invalid node type for insertion");
|
||||
return WebIDL::HierarchyRequestError::create(global_object(), "Invalid node type for insertion");
|
||||
} else if (is<DocumentType>(*node)) {
|
||||
// DocumentType
|
||||
// parent has a doctype child that is not child, or an element is preceding child.
|
||||
if (first_child_of_type<DocumentType>() != node || child->has_preceding_node_of_type_in_tree_order<Element>())
|
||||
return DOM::HierarchyRequestError::create(global_object(), "Invalid node type for insertion");
|
||||
return WebIDL::HierarchyRequestError::create(global_object(), "Invalid node type for insertion");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -796,7 +796,7 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<Node>> Node::clone_node_binding(bool deep)
|
|||
{
|
||||
// 1. If this is a shadow root, then throw a "NotSupportedError" DOMException.
|
||||
if (is<ShadowRoot>(*this))
|
||||
return NotSupportedError::create(global_object(), "Cannot clone shadow root");
|
||||
return WebIDL::NotSupportedError::create(global_object(), "Cannot clone shadow root");
|
||||
|
||||
// 2. Return a clone of this, with the clone children flag set if deep is true.
|
||||
return clone_node(nullptr, deep);
|
||||
|
|
|
@ -130,7 +130,7 @@ JS::ThrowCompletionOr<NodeFilter::Result> NodeIterator::filter(Node& node)
|
|||
{
|
||||
// 1. If traverser’s active flag is set, then throw an "InvalidStateError" DOMException.
|
||||
if (m_active)
|
||||
return throw_completion(InvalidStateError::create(global_object(), "NodeIterator is already active"));
|
||||
return throw_completion(WebIDL::InvalidStateError::create(global_object(), "NodeIterator is already active"));
|
||||
|
||||
// 2. Let n be node’s nodeType attribute value − 1.
|
||||
auto n = node.node_type() - 1;
|
||||
|
|
|
@ -22,7 +22,7 @@ WebIDL::ExceptionOr<JS::GCPtr<Element>> ParentNode::query_selector(StringView se
|
|||
{
|
||||
auto maybe_selectors = parse_selector(CSS::Parser::ParsingContext(*this), selector_text);
|
||||
if (!maybe_selectors.has_value())
|
||||
return DOM::SyntaxError::create(global_object(), "Failed to parse selector");
|
||||
return WebIDL::SyntaxError::create(global_object(), "Failed to parse selector");
|
||||
|
||||
auto selectors = maybe_selectors.value();
|
||||
|
||||
|
@ -45,7 +45,7 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<NodeList>> ParentNode::query_selector_all(S
|
|||
{
|
||||
auto maybe_selectors = parse_selector(CSS::Parser::ParsingContext(*this), selector_text);
|
||||
if (!maybe_selectors.has_value())
|
||||
return DOM::SyntaxError::create(global_object(), "Failed to parse selector");
|
||||
return WebIDL::SyntaxError::create(global_object(), "Failed to parse selector");
|
||||
|
||||
auto selectors = maybe_selectors.value();
|
||||
|
||||
|
|
|
@ -137,11 +137,11 @@ WebIDL::ExceptionOr<void> Range::set_start_or_end(Node& node, u32 offset, StartO
|
|||
|
||||
// 1. If node is a doctype, then throw an "InvalidNodeTypeError" DOMException.
|
||||
if (is<DocumentType>(node))
|
||||
return InvalidNodeTypeError::create(global_object(), "Node cannot be a DocumentType.");
|
||||
return WebIDL::InvalidNodeTypeError::create(global_object(), "Node cannot be a DocumentType.");
|
||||
|
||||
// 2. If offset is greater than node’s length, then throw an "IndexSizeError" DOMException.
|
||||
if (offset > node.length())
|
||||
return IndexSizeError::create(global_object(), String::formatted("Node does not contain a child at offset {}", offset));
|
||||
return WebIDL::IndexSizeError::create(global_object(), String::formatted("Node does not contain a child at offset {}", offset));
|
||||
|
||||
// 3. Let bp be the boundary point (node, offset).
|
||||
|
||||
|
@ -196,7 +196,7 @@ WebIDL::ExceptionOr<void> Range::set_start_before(Node& node)
|
|||
|
||||
// 2. If parent is null, then throw an "InvalidNodeTypeError" DOMException.
|
||||
if (!parent)
|
||||
return InvalidNodeTypeError::create(global_object(), "Given node has no parent.");
|
||||
return WebIDL::InvalidNodeTypeError::create(global_object(), "Given node has no parent.");
|
||||
|
||||
// 3. Set the start of this to boundary point (parent, node’s index).
|
||||
return set_start_or_end(*parent, node.index(), StartOrEnd::Start);
|
||||
|
@ -210,7 +210,7 @@ WebIDL::ExceptionOr<void> Range::set_start_after(Node& node)
|
|||
|
||||
// 2. If parent is null, then throw an "InvalidNodeTypeError" DOMException.
|
||||
if (!parent)
|
||||
return InvalidNodeTypeError::create(global_object(), "Given node has no parent.");
|
||||
return WebIDL::InvalidNodeTypeError::create(global_object(), "Given node has no parent.");
|
||||
|
||||
// 3. Set the start of this to boundary point (parent, node’s index plus 1).
|
||||
return set_start_or_end(*parent, node.index() + 1, StartOrEnd::Start);
|
||||
|
@ -224,7 +224,7 @@ WebIDL::ExceptionOr<void> Range::set_end_before(Node& node)
|
|||
|
||||
// 2. If parent is null, then throw an "InvalidNodeTypeError" DOMException.
|
||||
if (!parent)
|
||||
return InvalidNodeTypeError::create(global_object(), "Given node has no parent.");
|
||||
return WebIDL::InvalidNodeTypeError::create(global_object(), "Given node has no parent.");
|
||||
|
||||
// 3. Set the end of this to boundary point (parent, node’s index).
|
||||
return set_start_or_end(*parent, node.index(), StartOrEnd::End);
|
||||
|
@ -238,7 +238,7 @@ WebIDL::ExceptionOr<void> Range::set_end_after(Node& node)
|
|||
|
||||
// 2. If parent is null, then throw an "InvalidNodeTypeError" DOMException.
|
||||
if (!parent)
|
||||
return InvalidNodeTypeError::create(global_object(), "Given node has no parent.");
|
||||
return WebIDL::InvalidNodeTypeError::create(global_object(), "Given node has no parent.");
|
||||
|
||||
// 3. Set the end of this to boundary point (parent, node’s index plus 1).
|
||||
return set_start_or_end(*parent, node.index() + 1, StartOrEnd::End);
|
||||
|
@ -254,11 +254,11 @@ WebIDL::ExceptionOr<i16> Range::compare_boundary_points(u16 how, Range const& so
|
|||
// - END_TO_START,
|
||||
// then throw a "NotSupportedError" DOMException.
|
||||
if (how != HowToCompareBoundaryPoints::START_TO_START && how != HowToCompareBoundaryPoints::START_TO_END && how != HowToCompareBoundaryPoints::END_TO_END && how != HowToCompareBoundaryPoints::END_TO_START)
|
||||
return NotSupportedError::create(global_object(), String::formatted("Expected 'how' to be one of START_TO_START (0), START_TO_END (1), END_TO_END (2) or END_TO_START (3), got {}", how));
|
||||
return WebIDL::NotSupportedError::create(global_object(), String::formatted("Expected 'how' to be one of START_TO_START (0), START_TO_END (1), END_TO_END (2) or END_TO_START (3), got {}", how));
|
||||
|
||||
// 2. If this’s root is not the same as sourceRange’s root, then throw a "WrongDocumentError" DOMException.
|
||||
if (&root() != &source_range.root())
|
||||
return WrongDocumentError::create(global_object(), "This range is not in the same tree as the source range.");
|
||||
return WebIDL::WrongDocumentError::create(global_object(), "This range is not in the same tree as the source range.");
|
||||
|
||||
JS::GCPtr<Node> this_point_node;
|
||||
u32 this_point_offset = 0;
|
||||
|
@ -339,7 +339,7 @@ WebIDL::ExceptionOr<void> Range::select(Node& node)
|
|||
|
||||
// 2. If parent is null, then throw an "InvalidNodeTypeError" DOMException.
|
||||
if (!parent)
|
||||
return InvalidNodeTypeError::create(global_object(), "Given node has no parent.");
|
||||
return WebIDL::InvalidNodeTypeError::create(global_object(), "Given node has no parent.");
|
||||
|
||||
// 3. Let index be node’s index.
|
||||
auto index = node.index();
|
||||
|
@ -381,7 +381,7 @@ WebIDL::ExceptionOr<void> Range::select_node_contents(Node const& node)
|
|||
{
|
||||
// 1. If node is a doctype, throw an "InvalidNodeTypeError" DOMException.
|
||||
if (is<DocumentType>(node))
|
||||
return InvalidNodeTypeError::create(global_object(), "Node cannot be a DocumentType.");
|
||||
return WebIDL::InvalidNodeTypeError::create(global_object(), "Node cannot be a DocumentType.");
|
||||
|
||||
// 2. Let length be the length of node.
|
||||
auto length = node.length();
|
||||
|
@ -474,11 +474,11 @@ WebIDL::ExceptionOr<bool> Range::is_point_in_range(Node const& node, u32 offset)
|
|||
|
||||
// 2. If node is a doctype, then throw an "InvalidNodeTypeError" DOMException.
|
||||
if (is<DocumentType>(node))
|
||||
return InvalidNodeTypeError::create(global_object(), "Node cannot be a DocumentType.");
|
||||
return WebIDL::InvalidNodeTypeError::create(global_object(), "Node cannot be a DocumentType.");
|
||||
|
||||
// 3. If offset is greater than node’s length, then throw an "IndexSizeError" DOMException.
|
||||
if (offset > node.length())
|
||||
return IndexSizeError::create(global_object(), String::formatted("Node does not contain a child at offset {}", offset));
|
||||
return WebIDL::IndexSizeError::create(global_object(), String::formatted("Node does not contain a child at offset {}", offset));
|
||||
|
||||
// 4. If (node, offset) is before start or after end, return false.
|
||||
auto relative_position_to_start = position_of_boundary_point_relative_to_other_boundary_point(node, offset, m_start_container, m_start_offset);
|
||||
|
@ -495,15 +495,15 @@ WebIDL::ExceptionOr<i16> Range::compare_point(Node const& node, u32 offset) cons
|
|||
{
|
||||
// 1. If node’s root is different from this’s root, then throw a "WrongDocumentError" DOMException.
|
||||
if (&node.root() != &root())
|
||||
return WrongDocumentError::create(global_object(), "Given node is not in the same document as the range.");
|
||||
return WebIDL::WrongDocumentError::create(global_object(), "Given node is not in the same document as the range.");
|
||||
|
||||
// 2. If node is a doctype, then throw an "InvalidNodeTypeError" DOMException.
|
||||
if (is<DocumentType>(node))
|
||||
return InvalidNodeTypeError::create(global_object(), "Node cannot be a DocumentType.");
|
||||
return WebIDL::InvalidNodeTypeError::create(global_object(), "Node cannot be a DocumentType.");
|
||||
|
||||
// 3. If offset is greater than node’s length, then throw an "IndexSizeError" DOMException.
|
||||
if (offset > node.length())
|
||||
return IndexSizeError::create(global_object(), String::formatted("Node does not contain a child at offset {}", offset));
|
||||
return WebIDL::IndexSizeError::create(global_object(), String::formatted("Node does not contain a child at offset {}", offset));
|
||||
|
||||
// 4. If (node, offset) is before start, return −1.
|
||||
auto relative_position_to_start = position_of_boundary_point_relative_to_other_boundary_point(node, offset, m_start_container, m_start_offset);
|
||||
|
@ -636,7 +636,7 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<DocumentFragment>> Range::extract()
|
|||
// 12. If any member of contained children is a doctype, then throw a "HierarchyRequestError" DOMException.
|
||||
for (auto const& child : contained_children) {
|
||||
if (is<DocumentType>(*child))
|
||||
return DOM::HierarchyRequestError::create(global_object(), "Contained child is a DocumentType");
|
||||
return WebIDL::HierarchyRequestError::create(global_object(), "Contained child is a DocumentType");
|
||||
}
|
||||
|
||||
JS::GCPtr<Node> new_node;
|
||||
|
@ -783,7 +783,7 @@ WebIDL::ExceptionOr<void> Range::insert(JS::NonnullGCPtr<Node> node)
|
|||
if ((is<ProcessingInstruction>(*m_start_container) || is<Comment>(*m_start_container))
|
||||
|| (is<Text>(*m_start_container) && !m_start_container->parent_node())
|
||||
|| m_start_container.ptr() == node.ptr()) {
|
||||
return DOM::HierarchyRequestError::create(global_object(), "Range has inappropriate start node for insertion");
|
||||
return WebIDL::HierarchyRequestError::create(global_object(), "Range has inappropriate start node for insertion");
|
||||
}
|
||||
|
||||
// 2. Let referenceNode be null.
|
||||
|
@ -854,11 +854,11 @@ WebIDL::ExceptionOr<void> Range::surround_contents(JS::NonnullGCPtr<Node> new_pa
|
|||
if (is<Text>(*end_non_text_node))
|
||||
end_non_text_node = end_non_text_node->parent_node();
|
||||
if (start_non_text_node != end_non_text_node)
|
||||
return InvalidStateError::create(global_object(), "Non-Text node is partially contained in range.");
|
||||
return WebIDL::InvalidStateError::create(global_object(), "Non-Text node is partially contained in range.");
|
||||
|
||||
// 2. If newParent is a Document, DocumentType, or DocumentFragment node, then throw an "InvalidNodeTypeError" DOMException.
|
||||
if (is<Document>(*new_parent) || is<DocumentType>(*new_parent) || is<DocumentFragment>(*new_parent))
|
||||
return InvalidNodeTypeError::create(global_object(), "Invalid parent node type");
|
||||
return WebIDL::InvalidNodeTypeError::create(global_object(), "Invalid parent node type");
|
||||
|
||||
// 3. Let fragment be the result of extracting this.
|
||||
auto fragment = TRY(extract());
|
||||
|
@ -962,7 +962,7 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<DocumentFragment>> Range::clone_the_content
|
|||
// 12. If any member of contained children is a doctype, then throw a "HierarchyRequestError" DOMException.
|
||||
for (auto const& child : contained_children) {
|
||||
if (is<DocumentType>(*child))
|
||||
return DOM::HierarchyRequestError::create(global_object(), "Contained child is a DocumentType");
|
||||
return WebIDL::HierarchyRequestError::create(global_object(), "Contained child is a DocumentType");
|
||||
}
|
||||
|
||||
// 13. If first partially contained child is a CharacterData node, then:
|
||||
|
|
|
@ -27,10 +27,10 @@ WebIDL::ExceptionOr<StaticRange*> StaticRange::create_with_global_object(HTML::W
|
|||
{
|
||||
// 1. If init["startContainer"] or init["endContainer"] is a DocumentType or Attr node, then throw an "InvalidNodeTypeError" DOMException.
|
||||
if (is<DocumentType>(*init.start_container) || is<Attr>(*init.start_container))
|
||||
return DOM::InvalidNodeTypeError::create(window, "startContainer cannot be a DocumentType or Attribute node.");
|
||||
return WebIDL::InvalidNodeTypeError::create(window, "startContainer cannot be a DocumentType or Attribute node.");
|
||||
|
||||
if (is<DocumentType>(*init.end_container) || is<Attr>(*init.end_container))
|
||||
return DOM::InvalidNodeTypeError::create(window, "endContainer cannot be a DocumentType or Attribute node.");
|
||||
return WebIDL::InvalidNodeTypeError::create(window, "endContainer cannot be a DocumentType or Attribute node.");
|
||||
|
||||
// 2. Set this’s start to (init["startContainer"], init["startOffset"]) and end to (init["endContainer"], init["endOffset"]).
|
||||
return window.heap().allocate<StaticRange>(window.realm(), *init.start_container, init.start_offset, *init.end_container, init.end_offset);
|
||||
|
|
|
@ -50,7 +50,7 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<Text>> Text::split_text(size_t offset)
|
|||
|
||||
// 2. If offset is greater than length, then throw an "IndexSizeError" DOMException.
|
||||
if (offset > length)
|
||||
return DOM::IndexSizeError::create(global_object(), "Split offset is greater than length");
|
||||
return WebIDL::IndexSizeError::create(global_object(), "Split offset is greater than length");
|
||||
|
||||
// 3. Let count be length minus offset.
|
||||
auto count = length - offset;
|
||||
|
|
|
@ -4,12 +4,12 @@
|
|||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#include <LibWeb/DOM/DOMException.h>
|
||||
#include <LibWeb/DOM/Document.h>
|
||||
#include <LibWeb/DOM/Node.h>
|
||||
#include <LibWeb/DOM/NodeFilter.h>
|
||||
#include <LibWeb/DOM/TreeWalker.h>
|
||||
#include <LibWeb/WebIDL/AbstractOperations.h>
|
||||
#include <LibWeb/WebIDL/DOMException.h>
|
||||
|
||||
namespace Web::DOM {
|
||||
|
||||
|
@ -231,7 +231,7 @@ JS::ThrowCompletionOr<NodeFilter::Result> TreeWalker::filter(Node& node)
|
|||
{
|
||||
// 1. If traverser’s active flag is set, then throw an "InvalidStateError" DOMException.
|
||||
if (m_active)
|
||||
return throw_completion(InvalidStateError::create(global_object(), "NodeIterator is already active"));
|
||||
return throw_completion(WebIDL::InvalidStateError::create(global_object(), "NodeIterator is already active"));
|
||||
|
||||
// 2. Let n be node’s nodeType attribute value − 1.
|
||||
auto n = node.node_type() - 1;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue