bool CSSLangPseudoClassSelector::match(Element& element, ViewCSSImp* view, bool dynamic) { std::u16string attr; for (Element e = element; e; e = e.getParentElement()) { attr = interface_cast<html::HTMLElement>(e).getLang(); if (!attr.empty()) { toLower(attr); return dashMatch(attr, lang); } } return false; }
TEST(CSSTokenizerTest, MultipleCharacterTokens) { TEST_TOKENS("~=", includeMatch()); TEST_TOKENS("|=", dashMatch()); TEST_TOKENS("^=", prefixMatch()); TEST_TOKENS("$=", suffixMatch()); TEST_TOKENS("*=", substringMatch()); TEST_TOKENS("||", column()); TEST_TOKENS("|||", column(), delim('|')); TEST_TOKENS("<!--", cdo()); TEST_TOKENS("<!---", cdo(), delim('-')); TEST_TOKENS("-->", cdc()); }
bool CSSAttributeSelector::match(Element& e, ViewCSSImp* view, bool dynamic) { Nullable<std::u16string> attr = e.getAttribute(name); if (!attr.hasValue()) return false; std::u16string v = attr.value(); if (flags == u"i") toLower(v); switch (op) { case None: return true; case Equals: return v == value; break; case Includes: if (v.length() == 0 || contains(v, u" ")) return false; return contains(v, value); case DashMatch: return dashMatch(v, value); case PrefixMatch: if (v.length() == 0) return false; return startsWith(v, value); case SuffixMatch: if (v.length() == 0) return false; return endsWith(v, value); case SubstringMatch: if (v.length() == 0) return false; return find(v, value); default: break; } return false; }