From 3a5b9a97c45580e938396b46567af580a7e8048e Mon Sep 17 00:00:00 2001 From: Michael Drake Date: Mon, 30 Jul 2018 13:42:35 +0100 Subject: Media Queries: Update rule_good_for_media for new mq struct. Doesn't currently match media query conditions, only the media type. --- src/select/mq.h | 50 ++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 44 insertions(+), 6 deletions(-) diff --git a/src/select/mq.h b/src/select/mq.h index a0a9f6d..5aa1404 100644 --- a/src/select/mq.h +++ b/src/select/mq.h @@ -9,11 +9,48 @@ #ifndef css_select_mq_h_ #define css_select_mq_h_ +/** + * Match media query conditions. + * + * \param[in] cond Condition to match. + * \return true if condition matches, otherwise false. + */ +static inline bool mq_match_condition(css_mq_cond *cond) +{ + /* TODO: Implement this. */ + return cond == NULL; +} + +/** + * Test whether media query list matches current media. + * + * If anything in the list matches, it the list matches. If none match + * it doesn't match. + * + * \param m Media query list. + * \meaid media Current media spec, to check against m. + * \return true if media query list matches media + */ +static inline bool mq__list_match(const css_mq_query *m, uint64_t media) +{ + for (; m != NULL; m = m->next) { + /* Check type */ + if (!!(m->type & media) != m->negate_type) { + if (mq_match_condition(m->cond)) { + /* We have a match, no need to look further. */ + return true; + } + } + } + + return false; +} + /** * Test whether the rule applies for current media. * - * \param rule Rule to test - * \meaid media Current media type(s) + * \param rule Rule to test + * \param media Current media type(s) * \return true iff chain's rule applies for media */ static inline bool mq_rule_good_for_media(const css_rule *rule, uint64_t media) @@ -24,10 +61,11 @@ static inline bool mq_rule_good_for_media(const css_rule *rule, uint64_t media) while (ancestor != NULL) { const css_rule_media *m = (const css_rule_media *) ancestor; - if (ancestor->type == CSS_RULE_MEDIA && - (m->media & media) == 0) { - applies = false; - break; + if (ancestor->type == CSS_RULE_MEDIA) { + applies = mq__list_match(m->media, media); + if (applies == false) { + break; + } } if (ancestor->ptype != CSS_RULE_PARENT_STYLESHEET) { -- cgit v1.2.3