diff --git a/Userland/Libraries/LibWeb/Bindings/ExceptionOrUtils.h b/Userland/Libraries/LibWeb/Bindings/ExceptionOrUtils.h index 60935a0dc66..ab0b4879e83 100644 --- a/Userland/Libraries/LibWeb/Bindings/ExceptionOrUtils.h +++ b/Userland/Libraries/LibWeb/Bindings/ExceptionOrUtils.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2022, the SerenityOS developers. + * Copyright (c) 2021-2023, the SerenityOS developers. * * SPDX-License-Identifier: BSD-2-Clause */ @@ -60,10 +60,11 @@ ALWAYS_INLINE JS::Completion dom_exception_to_throw_completion(JS::VM& vm, auto& { return exception.visit( [&](WebIDL::SimpleException const& exception) { + auto message = exception.message.visit([](auto const& s) -> StringView { return s; }); switch (exception.type) { #define E(x) \ case WebIDL::SimpleExceptionType::x: \ - return vm.template throw_completion(exception.message); + return vm.template throw_completion(message); ENUMERATE_SIMPLE_WEBIDL_EXCEPTION_TYPES(E) diff --git a/Userland/Libraries/LibWeb/DOM/DOMTokenList.cpp b/Userland/Libraries/LibWeb/DOM/DOMTokenList.cpp index 991700d0769..ba0fddd7a18 100644 --- a/Userland/Libraries/LibWeb/DOM/DOMTokenList.cpp +++ b/Userland/Libraries/LibWeb/DOM/DOMTokenList.cpp @@ -216,10 +216,7 @@ WebIDL::ExceptionOr DOMTokenList::supports([[maybe_unused]] StringView tok // FIXME: Implement this fully when any use case defines supported tokens. // 1. If the associated attribute’s local name does not define supported tokens, throw a TypeError. - return WebIDL::SimpleException { - WebIDL::SimpleExceptionType::TypeError, - DeprecatedString::formatted("Attribute {} does not define any supported tokens", m_associated_attribute) - }; + return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, String::formatted("Attribute {} does not define any supported tokens", m_associated_attribute).release_value_but_fixme_should_propagate_errors() }; // 2. Let lowercase token be a copy of token, in ASCII lowercase. // 3. If lowercase token is present in supported tokens, return true. diff --git a/Userland/Libraries/LibWeb/Encoding/TextDecoder.cpp b/Userland/Libraries/LibWeb/Encoding/TextDecoder.cpp index 1420352dbc1..d975b7f8b58 100644 --- a/Userland/Libraries/LibWeb/Encoding/TextDecoder.cpp +++ b/Userland/Libraries/LibWeb/Encoding/TextDecoder.cpp @@ -14,9 +14,11 @@ namespace Web::Encoding { WebIDL::ExceptionOr> TextDecoder::construct_impl(JS::Realm& realm, DeprecatedFlyString encoding) { + auto& vm = realm.vm(); + auto decoder = TextCodec::decoder_for(encoding); if (!decoder.has_value()) - return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, DeprecatedString::formatted("Invalid encoding {}", encoding) }; + return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, TRY_OR_THROW_OOM(vm, String::formatted("Invalid encoding {}", encoding)) }; return MUST_OR_THROW_OOM(realm.heap().allocate(realm, realm, *decoder, move(encoding), false, false)); } diff --git a/Userland/Libraries/LibWeb/Geometry/DOMMatrix.cpp b/Userland/Libraries/LibWeb/Geometry/DOMMatrix.cpp index 80c584807e5..94426f3465c 100644 --- a/Userland/Libraries/LibWeb/Geometry/DOMMatrix.cpp +++ b/Userland/Libraries/LibWeb/Geometry/DOMMatrix.cpp @@ -12,13 +12,15 @@ namespace Web::Geometry { WebIDL::ExceptionOr> DOMMatrix::construct_impl(JS::Realm& realm, Optional>> const& init) { + auto& vm = realm.vm(); + // https://drafts.fxtf.org/geometry/#dom-dommatrix-dommatrix if (init.has_value()) { // -> Otherwise // Throw a TypeError exception. // The only condition where this can be met is with a sequence type which doesn't have exactly 6 or 16 elements. if (auto* double_sequence = init.value().get_pointer>(); double_sequence && (double_sequence->size() != 6 && double_sequence->size() != 16)) - return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, DeprecatedString::formatted("Sequence must contain exactly 6 or 16 elements, got {} element(s)", double_sequence->size()) }; + return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, TRY_OR_THROW_OOM(vm, String::formatted("Sequence must contain exactly 6 or 16 elements, got {} element(s)", double_sequence->size())) }; } return realm.heap().allocate(realm, realm, init).release_allocated_value_but_fixme_should_propagate_errors(); diff --git a/Userland/Libraries/LibWeb/Geometry/DOMMatrixReadOnly.cpp b/Userland/Libraries/LibWeb/Geometry/DOMMatrixReadOnly.cpp index afc30955413..2ecf849bb7d 100644 --- a/Userland/Libraries/LibWeb/Geometry/DOMMatrixReadOnly.cpp +++ b/Userland/Libraries/LibWeb/Geometry/DOMMatrixReadOnly.cpp @@ -13,13 +13,15 @@ namespace Web::Geometry { WebIDL::ExceptionOr> DOMMatrixReadOnly::construct_impl(JS::Realm& realm, Optional>> const& init) { + auto& vm = realm.vm(); + // https://drafts.fxtf.org/geometry/#dom-dommatrixreadonly-dommatrixreadonly if (init.has_value()) { // -> Otherwise // Throw a TypeError exception. // The only condition where this can be met is with a sequence type which doesn't have exactly 6 or 16 elements. if (auto* double_sequence = init.value().get_pointer>(); double_sequence && (double_sequence->size() != 6 && double_sequence->size() != 16)) - return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, DeprecatedString::formatted("Sequence must contain exactly 6 or 16 elements, got {} element(s)", double_sequence->size()) }; + return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, TRY_OR_THROW_OOM(vm, String::formatted("Sequence must contain exactly 6 or 16 elements, got {} element(s)", double_sequence->size())) }; } return realm.heap().allocate(realm, realm, init).release_allocated_value_but_fixme_should_propagate_errors(); @@ -394,27 +396,27 @@ WebIDL::ExceptionOr validate_and_fixup_dom_matrix_2d_init(DOMMatrix2DInit& // 1. If at least one of the following conditions are true for dict, then throw a TypeError exception and abort these steps. // - a and m11 are both present and SameValueZero(a, m11) is false. if (init.a.has_value() && init.m11.has_value() && !JS::same_value_zero(JS::Value(init.a.value()), JS::Value(init.m11.value()))) - return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, "DOMMatrix2DInit.a and DOMMatrix2DInit.m11 must have the same value if they are both present" }; + return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, "DOMMatrix2DInit.a and DOMMatrix2DInit.m11 must have the same value if they are both present"sv }; // - b and m12 are both present and SameValueZero(b, m12) is false. if (init.b.has_value() && init.m12.has_value() && !JS::same_value_zero(JS::Value(init.b.value()), JS::Value(init.m12.value()))) - return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, "DOMMatrix2DInit.b and DOMMatrix2DInit.m12 must have the same value if they are both present" }; + return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, "DOMMatrix2DInit.b and DOMMatrix2DInit.m12 must have the same value if they are both present"sv }; // - c and m21 are both present and SameValueZero(c, m21) is false. if (init.c.has_value() && init.m21.has_value() && !JS::same_value_zero(JS::Value(init.c.value()), JS::Value(init.m21.value()))) - return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, "DOMMatrix2DInit.c and DOMMatrix2DInit.m21 must have the same value if they are both present" }; + return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, "DOMMatrix2DInit.c and DOMMatrix2DInit.m21 must have the same value if they are both present"sv }; // - d and m22 are both present and SameValueZero(d, m22) is false. if (init.d.has_value() && init.m22.has_value() && !JS::same_value_zero(JS::Value(init.d.value()), JS::Value(init.m22.value()))) - return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, "DOMMatrix2DInit.d and DOMMatrix2DInit.m22 must have the same value if they are both present" }; + return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, "DOMMatrix2DInit.d and DOMMatrix2DInit.m22 must have the same value if they are both present"sv }; // - e and m41 are both present and SameValueZero(e, m41) is false. if (init.e.has_value() && init.m41.has_value() && !JS::same_value_zero(JS::Value(init.e.value()), JS::Value(init.m41.value()))) - return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, "DOMMatrix2DInit.e and DOMMatrix2DInit.m41 must have the same value if they are both present" }; + return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, "DOMMatrix2DInit.e and DOMMatrix2DInit.m41 must have the same value if they are both present"sv }; // - f and m42 are both present and SameValueZero(f, m42) is false. if (init.f.has_value() && init.m42.has_value() && !JS::same_value_zero(JS::Value(init.f.value()), JS::Value(init.m42.value()))) - return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, "DOMMatrix2DInit.f and DOMMatrix2DInit.m42 must have the same value if they are both present" }; + return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, "DOMMatrix2DInit.f and DOMMatrix2DInit.m42 must have the same value if they are both present"sv }; // 2. If m11 is not present then set it to the value of member a, or value 1 if a is also not present. if (!init.m11.has_value()) @@ -462,7 +464,7 @@ WebIDL::ExceptionOr validate_and_fixup_dom_matrix_init(DOMMatrixInit& init || (init.m43 != 0.0 && init.m43 != -0.0) || init.m33 != 1.0 || init.m44 != 1.0) { - return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, "DOMMatrixInit.is2D is true, but the given matrix is not a 2D matrix" }; + return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, "DOMMatrixInit.is2D is true, but the given matrix is not a 2D matrix"sv }; } } diff --git a/Userland/Libraries/LibWeb/HTML/Scripting/Fetching.cpp b/Userland/Libraries/LibWeb/HTML/Scripting/Fetching.cpp index 8b78b1ec286..647bcb5ba9e 100644 --- a/Userland/Libraries/LibWeb/HTML/Scripting/Fetching.cpp +++ b/Userland/Libraries/LibWeb/HTML/Scripting/Fetching.cpp @@ -113,7 +113,7 @@ WebIDL::ExceptionOr resolve_module_specifier(Optional referrin return as_url.release_value(); // 13. Throw a TypeError indicating that specifier was a bare specifier, but was not remapped to anything by importMap. - return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, DeprecatedString::formatted("Failed to resolve non relative module specifier '{}' from an import map.", specifier) }; + return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, String::formatted("Failed to resolve non relative module specifier '{}' from an import map.", specifier).release_value_but_fixme_should_propagate_errors() }; } // https://html.spec.whatwg.org/multipage/webappapis.html#resolving-an-imports-match @@ -125,7 +125,7 @@ WebIDL::ExceptionOr> resolve_imports_match(DeprecatedString co if (specifier_key == normalized_specifier) { // 1. If resolutionResult is null, then throw a TypeError indicating that resolution of specifierKey was blocked by a null entry. if (!resolution_result.has_value()) - return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, DeprecatedString::formatted("Import resolution of '{}' was blocked by a null entry.", specifier_key) }; + return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, String::formatted("Import resolution of '{}' was blocked by a null entry.", specifier_key).release_value_but_fixme_should_propagate_errors() }; // 2. Assert: resolutionResult is a URL. VERIFY(resolution_result->is_valid()); @@ -146,7 +146,7 @@ WebIDL::ExceptionOr> resolve_imports_match(DeprecatedString co ) { // 1. If resolutionResult is null, then throw a TypeError indicating that the resolution of specifierKey was blocked by a null entry. if (!resolution_result.has_value()) - return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, DeprecatedString::formatted("Import resolution of '{}' was blocked by a null entry.", specifier_key) }; + return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, String::formatted("Import resolution of '{}' was blocked by a null entry.", specifier_key).release_value_but_fixme_should_propagate_errors() }; // 2. Assert: resolutionResult is a URL. VERIFY(resolution_result->is_valid()); @@ -164,7 +164,7 @@ WebIDL::ExceptionOr> resolve_imports_match(DeprecatedString co // 6. If url is failure, then throw a TypeError indicating that resolution of normalizedSpecifier was blocked since the afterPrefix portion // could not be URL-parsed relative to the resolutionResult mapped to by the specifierKey prefix. if (!url.is_valid()) - return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, DeprecatedString::formatted("Could not resolve '{}' as the after prefix portion could not be URL-parsed.", normalized_specifier) }; + return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, String::formatted("Could not resolve '{}' as the after prefix portion could not be URL-parsed.", normalized_specifier).release_value_but_fixme_should_propagate_errors() }; // 7. Assert: url is a URL. VERIFY(url.is_valid()); @@ -172,7 +172,7 @@ WebIDL::ExceptionOr> resolve_imports_match(DeprecatedString co // 8. If the serialization of resolutionResult is not a code unit prefix of the serialization of url, then throw a TypeError indicating // that the resolution of normalizedSpecifier was blocked due to it backtracking above its prefix specifierKey. if (!Infra::is_code_unit_prefix(resolution_result->serialize(), url.serialize())) - return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, DeprecatedString::formatted("Could not resolve '{}' as it backtracks above its prefix specifierKey.", normalized_specifier) }; + return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, String::formatted("Could not resolve '{}' as it backtracks above its prefix specifierKey.", normalized_specifier).release_value_but_fixme_should_propagate_errors() }; // 9. Return url. return url; diff --git a/Userland/Libraries/LibWeb/URL/URLSearchParams.cpp b/Userland/Libraries/LibWeb/URL/URLSearchParams.cpp index 38b3b1294c5..60e00b181a2 100644 --- a/Userland/Libraries/LibWeb/URL/URLSearchParams.cpp +++ b/Userland/Libraries/LibWeb/URL/URLSearchParams.cpp @@ -118,7 +118,7 @@ WebIDL::ExceptionOr> URLSearchParams::construc for (auto const& pair : init_sequence) { // a. If pair does not contain exactly two items, then throw a TypeError. if (pair.size() != 2) - return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, DeprecatedString::formatted("Expected only 2 items in pair, got {}", pair.size()) }; + return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, TRY_OR_THROW_OOM(vm, String::formatted("Expected only 2 items in pair, got {}", pair.size())) }; // b. Append a new name-value pair whose name is pair’s first item, and value is pair’s second item, to query’s list. list.append(QueryParam { .name = pair[0], .value = pair[1] }); diff --git a/Userland/Libraries/LibWeb/WebIDL/ExceptionOr.h b/Userland/Libraries/LibWeb/WebIDL/ExceptionOr.h index 0c40327d83b..7b54991099f 100644 --- a/Userland/Libraries/LibWeb/WebIDL/ExceptionOr.h +++ b/Userland/Libraries/LibWeb/WebIDL/ExceptionOr.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2022, Linus Groh + * Copyright (c) 2021-2023, Linus Groh * * SPDX-License-Identifier: BSD-2-Clause */ @@ -29,7 +29,7 @@ enum class SimpleExceptionType { struct SimpleException { SimpleExceptionType type; - DeprecatedString message; + Variant message; }; template