Vector<std::reference_wrapper<CSSFontFace>> CSSFontFaceSet::matchingFaces(const String& font, const String&, ExceptionCode& ec) { Vector<std::reference_wrapper<CSSFontFace>> result; Ref<MutableStyleProperties> style = MutableStyleProperties::create(); auto parseResult = CSSParser::parseValue(style.ptr(), CSSPropertyFont, font, true, CSSStrictMode, nullptr); if (parseResult == CSSParser::ParseResult::Error) { ec = SYNTAX_ERR; return result; } FontTraitsMask fontTraitsMask; if (auto maskOptional = computeFontTraitsMask(style.get())) fontTraitsMask = maskOptional.value(); else { ec = SYNTAX_ERR; return result; } RefPtr<CSSValue> family = style->getPropertyCSSValue(CSSPropertyFontFamily); if (!is<CSSValueList>(family.get())) { ec = SYNTAX_ERR; return result; } CSSValueList& familyList = downcast<CSSValueList>(*family); HashSet<AtomicString> uniqueFamilies; for (auto& family : familyList) { const CSSPrimitiveValue& primitive = downcast<CSSPrimitiveValue>(family.get()); if (!primitive.isFontFamily()) continue; uniqueFamilies.add(primitive.fontFamily().familyName); } for (auto& family : uniqueFamilies) { CSSSegmentedFontFace* faces = getFontFace(fontTraitsMask, family); if (!faces) continue; for (auto& constituentFace : faces->constituentFaces()) result.append(constituentFace.get()); } return result; }