/* * Copyright (c) 2021, Idan Horowitz * * 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("URLSearchParamsIterator"sv, prototype); } } namespace Web::URL { WebIDL::ExceptionOr> URLSearchParamsIterator::create(URLSearchParams const& url_search_params, JS::Object::PropertyKind iteration_kind) { return MUST_OR_THROW_OOM(url_search_params.heap().allocate(url_search_params.realm(), url_search_params, iteration_kind)); } URLSearchParamsIterator::URLSearchParamsIterator(URLSearchParams const& url_search_params, JS::Object::PropertyKind iteration_kind) : PlatformObject(url_search_params.realm()) , m_url_search_params(url_search_params) , m_iteration_kind(iteration_kind) { } URLSearchParamsIterator::~URLSearchParamsIterator() = default; JS::ThrowCompletionOr URLSearchParamsIterator::initialize(JS::Realm& realm) { MUST_OR_THROW_OOM(Base::initialize(realm)); set_prototype(&Bindings::ensure_web_prototype(realm, "URLSearchParamsIterator")); return {}; } void URLSearchParamsIterator::visit_edges(JS::Cell::Visitor& visitor) { Base::visit_edges(visitor); visitor.visit(&m_url_search_params); } JS::Object* URLSearchParamsIterator::next() { if (m_index >= m_url_search_params.m_list.size()) return create_iterator_result_object(vm(), JS::js_undefined(), true); auto& entry = m_url_search_params.m_list[m_index++]; if (m_iteration_kind == JS::Object::PropertyKind::Key) return create_iterator_result_object(vm(), JS::PrimitiveString::create(vm(), entry.name), false); else if (m_iteration_kind == JS::Object::PropertyKind::Value) return create_iterator_result_object(vm(), JS::PrimitiveString::create(vm(), entry.value), false); return create_iterator_result_object(vm(), JS::Array::create_from(realm(), { JS::PrimitiveString::create(vm(), entry.name), JS::PrimitiveString::create(vm(), entry.value) }), false); } }