void CSSFontFaceSet::addToFacesLookupTable(CSSFontFace& face) { if (!face.families()) return; for (auto& item : *face.families()) { String familyName = CSSFontFaceSet::familyNameFromPrimitive(downcast<CSSPrimitiveValue>(item.get())); if (familyName.isEmpty()) continue; auto addResult = m_facesLookupTable.add(familyName, Vector<Ref<CSSFontFace>>()); auto& familyFontFaces = addResult.iterator->value; if (addResult.isNewEntry) { // m_locallyInstalledFontFaces grows without bound, eventually encorporating every font installed on the system. // This is by design. registerLocalFontFacesForFamily(familyName); familyFontFaces = { }; } familyFontFaces.append(face); } }
void CSSFontFaceSet::remove(const CSSFontFace& face) { m_cache.clear(); for (auto* client : m_clients) client->fontModified(); if (face.families()) removeFromFacesLookupTable(face, *face.families()); for (size_t i = 0; i < m_faces.size(); ++i) { if (m_faces[i].ptr() == &face) { if (i < m_facesPartitionIndex) --m_facesPartitionIndex; m_faces[i]->removeClient(*this); m_faces.remove(i); if (face.status() == CSSFontFace::Status::Loading || face.status() == CSSFontFace::Status::TimedOut) decrementActiveCount(); return; } } ASSERT_NOT_REACHED(); }