/* * Copyright (c) 2024, MacDue * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include namespace Web::SVG { GC_DEFINE_ALLOCATOR(SVGTransformList); GC::Ref SVGTransformList::create(JS::Realm& realm) { return realm.create(realm); } SVGTransformList::~SVGTransformList() = default; SVGTransformList::SVGTransformList(JS::Realm& realm) : PlatformObject(realm) { } // https://svgwg.org/svg2-draft/single-page.html#types-__svg__SVGNameList__length WebIDL::UnsignedLong SVGTransformList::length() { // The length and numberOfItems IDL attributes represents the length of the list, and on getting simply return the length of the list. return m_transforms.size(); } // https://svgwg.org/svg2-draft/single-page.html#types-__svg__SVGNameList__numberOfItems WebIDL::UnsignedLong SVGTransformList::number_of_items() { // The length and numberOfItems IDL attributes represents the length of the list, and on getting simply return the length of the list. return m_transforms.size(); } // https://svgwg.org/svg2-draft/single-page.html#types-__svg__SVGNameList__getItem WebIDL::ExceptionOr> SVGTransformList::get_item(WebIDL::UnsignedLong index) { // 1. If index is greater than or equal to the length of the list, then throw an IndexSizeError. if (index >= m_transforms.size()) return WebIDL::IndexSizeError::create(realm(), "SVGTransformList index out of bounds"_string); // 2. Return the element in the list at position index. return m_transforms.at(index); } // https://svgwg.org/svg2-draft/single-page.html#types-__svg__SVGNameList__appendItem GC::Ref SVGTransformList::append_item(GC::Ref new_item) { // FIXME: This does not implement the steps from the specification. m_transforms.append(new_item); return new_item; } void SVGTransformList::initialize(JS::Realm& realm) { Base::initialize(realm); WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGTransformList); } void SVGTransformList::visit_edges(Cell::Visitor& visitor) { Base::visit_edges(visitor); for (auto transform : m_transforms) transform->visit_edges(visitor); } }