/* * Copyright (c) 2021, Tim Flynn * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #include namespace Web::DOM { // https://dom.spec.whatwg.org/#domtokenlist class DOMTokenList final : public RefCounted , public Bindings::Wrappable { public: using WrapperType = Bindings::DOMTokenListWrapper; static NonnullRefPtr create(Element const& associated_element, FlyString associated_attribute); ~DOMTokenList() = default; void associated_attribute_changed(StringView value); bool is_supported_property_index(u32 index) const; size_t length() const { return m_token_set.size(); } String const& item(size_t index) const; bool contains(StringView token); ExceptionOr add(Vector const& tokens); ExceptionOr remove(Vector const& tokens); ExceptionOr toggle(String const& token, Optional force); ExceptionOr replace(String const& token, String const& new_token); ExceptionOr supports(StringView token); String value() const; void set_value(String value); private: DOMTokenList(Element const& associated_element, FlyString associated_attribute); ExceptionOr validate_token(StringView token) const; void run_update_steps(); WeakPtr m_associated_element; FlyString m_associated_attribute; Vector m_token_set; }; } namespace Web::Bindings { DOMTokenListWrapper* wrap(JS::GlobalObject&, DOM::DOMTokenList&); }