/* * Copyright (c) 2021-2025, Sam Atkins * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #include namespace Web::CSS { // https://www.w3.org/TR/mediaqueries-4/#mq-features class MediaFeature final : public FeatureQuery { public: using Base = FeatureQuery; virtual MatchResult evaluate(BooleanExpressionEvaluationContext const&) const override; virtual void dump(StringBuilder&, int indent_levels = 0) const override; static StringView serialize_feature_id(MediaFeatureID); static bool keyword_is_falsey(MediaFeatureID, Keyword); private: friend Base; MediaFeature(Type type, MediaFeatureID id, Variant value = {}) : Base(type, id, move(value)) { } }; class MediaQuery : public RefCounted { friend class Parser::Parser; public: ~MediaQuery() = default; // https://www.w3.org/TR/mediaqueries-4/#media-types enum class KnownMediaType : u8 { All, Print, Screen, }; struct MediaType { FlyString name; Optional known_type; }; static NonnullRefPtr create_not_all(); static NonnullRefPtr create() { return adopt_ref(*new MediaQuery); } bool matches() const { return m_matches; } bool evaluate(DOM::Document const&); String to_string() const; void dump(StringBuilder&, int indent_levels = 0) const; private: MediaQuery() = default; // https://www.w3.org/TR/mediaqueries-4/#mq-not bool m_negated { false }; MediaType m_media_type { .name = "all"_fly_string, .known_type = KnownMediaType::All }; OwnPtr m_media_condition { nullptr }; // Cached value, updated by evaluate() bool m_matches { false }; }; String serialize_a_media_query_list(Vector> const&); Optional media_type_from_string(StringView); StringView to_string(MediaQuery::KnownMediaType); } namespace AK { template<> struct Formatter : Formatter { ErrorOr format(FormatBuilder& builder, Web::CSS::MediaFeature const& media_feature) { return Formatter::format(builder, media_feature.to_string()); } }; template<> struct Formatter : Formatter { ErrorOr format(FormatBuilder& builder, Web::CSS::MediaQuery const& media_query) { return Formatter::format(builder, media_query.to_string()); } }; }