/* * Copyright (c) 2025, Shannon Booth * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include namespace Web::WebIDL { GC_DEFINE_ALLOCATOR(QuotaExceededError); QuotaExceededError::QuotaExceededError(JS::Realm& realm) : DOMException(realm) { } QuotaExceededError::QuotaExceededError(JS::Realm& realm, Utf16String const& message) : DOMException(realm, "QuotaExceededError"_fly_string, message) { } void QuotaExceededError::initialize(JS::Realm& realm) { WEB_SET_PROTOTYPE_FOR_INTERFACE(QuotaExceededError); Base::initialize(realm); } GC::Ref QuotaExceededError::create(JS::Realm& realm) { return realm.create(realm); } GC::Ref QuotaExceededError::create(JS::Realm& realm, Utf16String const& message) { return realm.create(realm, message); } // https://webidl.spec.whatwg.org/#dom-quotaexceedederror-quotaexceedederror ExceptionOr> QuotaExceededError::construct_impl(JS::Realm& realm, Utf16String const& message, QuotaExceededErrorOptions const& options) { auto& vm = realm.vm(); // 1. Set this’s name to "QuotaExceededError". // 2. Set this’s message to message. // NB: Done in constructor. auto error = realm.create(realm, message); // 3. If options["quota"] is present: if (options.quota.has_value()) { // 1. If options["quota"] is less than 0, then throw a RangeError. if (options.quota.value() < 0) return vm.throw_completion("Quota cannot be less than 0"sv); // 2. Set this’s quota to options["quota"]. error->m_quota = options.quota; } // 4. If options["requested"] is present: if (options.requested.has_value()) { // 1. If options["requested"] is less than 0, then throw a RangeError. if (options.requested.value() < 0) return vm.throw_completion("Requested cannot be less than 0"sv); // 2. Set this’s requested to options["requested"]. error->m_requested = options.requested; } // 5. If this’s quota is not null, this’s requested is not null, and this’s requested is less than this’s quota, then throw a RangeError. if (error->m_quota.has_value() && error->m_requested.has_value() && error->m_requested.value() < error->m_quota.value()) return vm.throw_completion("Requested cannot be less than quota"sv); return error; } // https://webidl.spec.whatwg.org/#ref-for-quotaexceedederror⑦ WebIDL::ExceptionOr QuotaExceededError::serialization_steps(HTML::TransferDataEncoder& serialized, bool for_storage, HTML::SerializationMemory& memory) { // 1. Run the DOMException serialization steps given value and serialized. MUST(DOMException::serialization_steps(serialized, for_storage, memory)); // 2. Set serialized.[[Quota]] to value’s quota. serialized.encode(m_quota); // 3. Set serialized.[[Requested]] to value’s requested. serialized.encode(m_requested); return {}; } // https://webidl.spec.whatwg.org/#ref-for-quotaexceedederror⑦ WebIDL::ExceptionOr QuotaExceededError::deserialization_steps(HTML::TransferDataDecoder& serialized, HTML::DeserializationMemory& memory) { // 1. Run the DOMException deserialization steps given serialized and value. MUST(DOMException::deserialization_steps(serialized, memory)); // 2. Set value’s quota to serialized.[[Quota]]. m_quota = serialized.decode>(); // 3. Set value’s requested to serialized.[[Requested]]. m_requested = serialized.decode>(); return {}; } }