Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(489)

Unified Diff: Source/core/css/CSSSegmentedFontFaceCache.cpp

Issue 68933007: Add CSSFontSelector::removeFontFaceRule() (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Avoid double hash lookups Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/css/CSSSegmentedFontFaceCache.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/css/CSSSegmentedFontFaceCache.cpp
diff --git a/Source/core/css/CSSSegmentedFontFaceCache.cpp b/Source/core/css/CSSSegmentedFontFaceCache.cpp
index 84ecc078d92ac11d2aaa277cc97b4c29211efe8d..c23a11a76779433d01ab7860dd068718fa0a1860 100644
--- a/Source/core/css/CSSSegmentedFontFaceCache.cpp
+++ b/Source/core/css/CSSSegmentedFontFaceCache.cpp
@@ -66,9 +66,12 @@ void CSSSegmentedFontFaceCache::addFontFaceRule(CSSFontSelector* cssFontSelector
if (!cssFontFace || !cssFontFace->isValid())
return;
- OwnPtr<HashMap<unsigned, RefPtr<CSSSegmentedFontFace> > >& familyFontFaces = m_fontFaces.add(fontFace->family(), nullptr).iterator->value;
+ if (!m_styleRuleToFontFace.add(fontFaceRule, cssFontFace).isNewEntry)
+ return;
+
+ OwnPtr<TraitsMap>& familyFontFaces = m_fontFaces.add(fontFace->family(), nullptr).iterator->value;
if (!familyFontFaces) {
- familyFontFaces = adoptPtr(new HashMap<unsigned, RefPtr<CSSSegmentedFontFace> >);
+ familyFontFaces = adoptPtr(new TraitsMap);
ASSERT(!m_locallyInstalledFontFaces.contains(fontFace->family()));
@@ -100,6 +103,35 @@ void CSSSegmentedFontFaceCache::addFontFaceRule(CSSFontSelector* cssFontSelector
++m_version;
}
+void CSSSegmentedFontFaceCache::removeFontFaceRule(const StyleRuleFontFace* fontFaceRule)
+{
+ StyleRuleToFontFace::iterator styleRuleToFontFaceIter = m_styleRuleToFontFace.find(fontFaceRule);
+ if (styleRuleToFontFaceIter == m_styleRuleToFontFace.end())
+ return;
+ RefPtr<CSSFontFace> cssFontFace = styleRuleToFontFaceIter->value;
+
+ ASSERT(cssFontFace->fontFace());
+ FamilyToTraitsMap::iterator fontFacesIter = m_fontFaces.find(cssFontFace->fontFace()->family());
+ if (fontFacesIter == m_fontFaces.end())
+ return;
+ TraitsMap* familyFontFaces = fontFacesIter->value.get();
+
+ TraitsMap::iterator familyFontFacesIter = familyFontFaces->find(cssFontFace->fontFace()->traitsMask());
+ if (familyFontFacesIter == familyFontFaces->end())
+ return;
+ RefPtr<CSSSegmentedFontFace> segmentedFontFace = familyFontFacesIter->value;
+
+ segmentedFontFace->removeFontFace(cssFontFace);
+ if (segmentedFontFace->isEmpty()) {
+ familyFontFaces->remove(familyFontFacesIter);
+ if (familyFontFaces->isEmpty()) {
+ m_fontFaces.remove(fontFacesIter);
+ m_locallyInstalledFontFaces.remove(cssFontFace->fontFace()->family());
+ }
+ }
+ m_styleRuleToFontFace.remove(styleRuleToFontFaceIter);
+ m_fonts.clear();
+}
static PassRefPtr<FontData> fontDataForGenericFamily(Settings* settings, const FontDescription& fontDescription, const AtomicString& familyName)
{
@@ -240,19 +272,19 @@ PassRefPtr<FontData> CSSSegmentedFontFaceCache::getFontData(Settings* settings,
CSSSegmentedFontFace* CSSSegmentedFontFaceCache::getFontFace(const FontDescription& fontDescription, const AtomicString& family)
{
- HashMap<unsigned, RefPtr<CSSSegmentedFontFace> >* familyFontFaces = m_fontFaces.get(family);
+ TraitsMap* familyFontFaces = m_fontFaces.get(family);
if (!familyFontFaces || familyFontFaces->isEmpty())
return 0;
- OwnPtr<HashMap<unsigned, RefPtr<CSSSegmentedFontFace> > >& segmentedFontFaceCache = m_fonts.add(family, nullptr).iterator->value;
+ OwnPtr<TraitsMap>& segmentedFontFaceCache = m_fonts.add(family, nullptr).iterator->value;
if (!segmentedFontFaceCache)
- segmentedFontFaceCache = adoptPtr(new HashMap<unsigned, RefPtr<CSSSegmentedFontFace> >);
+ segmentedFontFaceCache = adoptPtr(new TraitsMap);
FontTraitsMask traitsMask = fontDescription.traitsMask();
RefPtr<CSSSegmentedFontFace>& face = segmentedFontFaceCache->add(traitsMask, 0).iterator->value;
if (!face) {
- for (HashMap<unsigned, RefPtr<CSSSegmentedFontFace> >::const_iterator i = familyFontFaces->begin(); i != familyFontFaces->end(); ++i) {
+ for (TraitsMap::const_iterator i = familyFontFaces->begin(); i != familyFontFaces->end(); ++i) {
CSSSegmentedFontFace* candidate = i->value.get();
unsigned candidateTraitsMask = candidate->traitsMask();
if ((traitsMask & FontStyleNormalMask) && !(candidateTraitsMask & FontStyleNormalMask))
« no previous file with comments | « Source/core/css/CSSSegmentedFontFaceCache.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698