/* * Copyright (c) 2023, Kenneth Myhra * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #include namespace Web::Bindings { template<> void Intrinsics::create_web_prototype_and_constructor(JS::Realm& realm) { auto prototype = heap().allocate(realm, realm).release_allocated_value_but_fixme_should_propagate_errors(); m_prototypes.set("FormDataIterator"sv, prototype); } } namespace Web::XHR { WebIDL::ExceptionOr> FormDataIterator::create(FormData const& form_data, JS::Object::PropertyKind iterator_kind) { return MUST_OR_THROW_OOM(form_data.heap().allocate(form_data.realm(), form_data, iterator_kind)); } FormDataIterator::FormDataIterator(Web::XHR::FormData const& form_data, JS::Object::PropertyKind iterator_kind) : PlatformObject(form_data.realm()) , m_form_data(form_data) , m_iterator_kind(iterator_kind) { } FormDataIterator::~FormDataIterator() = default; JS::ThrowCompletionOr FormDataIterator::initialize(JS::Realm& realm) { MUST_OR_THROW_OOM(Base::initialize(realm)); set_prototype(&Bindings::ensure_web_prototype(realm, "FormDataIterator")); return {}; } void FormDataIterator::visit_edges(Cell::Visitor& visitor) { Base::visit_edges(visitor); visitor.visit(m_form_data); } JS::Object* FormDataIterator::next() { auto& vm = this->vm(); if (m_index >= m_form_data->m_entry_list.size()) return create_iterator_result_object(vm, JS::js_undefined(), true); auto entry = m_form_data->m_entry_list[m_index++]; if (m_iterator_kind == JS::Object::PropertyKind::Key) return create_iterator_result_object(vm, JS::PrimitiveString::create(vm, entry.name), false); auto entry_value = entry.value.visit( [&](JS::Handle const& file) -> JS::Value { return file.cell(); }, [&](String const& string) -> JS::Value { return JS::PrimitiveString::create(vm, string); }); if (m_iterator_kind == JS::Object::PropertyKind::Value) return create_iterator_result_object(vm, entry_value, false); return create_iterator_result_object(vm, JS::Array::create_from(realm(), { JS::PrimitiveString::create(vm, entry.name), entry_value }), false); } }