Index: third_party/WebKit/Source/platform/fonts/FontFallbackIterator.cpp |
diff --git a/third_party/WebKit/Source/platform/fonts/FontFallbackIterator.cpp b/third_party/WebKit/Source/platform/fonts/FontFallbackIterator.cpp |
index 1d4db95ac8398e1c5fd7d727aa2eeb76484cbdfa..799220f38766ef0a709abf275c36d05e1292d7c8 100644 |
--- a/third_party/WebKit/Source/platform/fonts/FontFallbackIterator.cpp |
+++ b/third_party/WebKit/Source/platform/fonts/FontFallbackIterator.cpp |
@@ -39,11 +39,21 @@ bool FontFallbackIterator::needsHintList() const |
return fontData && fontData->isSegmented(); |
} |
-static bool rangeContributesForHint(const Vector<UChar32> hintList, const FontDataRange& fontDataRange) |
+bool FontFallbackIterator::alreadyLoadingRangeForHintChar(UChar32 hintChar) |
+{ |
+ for (auto it = m_loadingCustomFontForRanges.begin(); it != m_loadingCustomFontForRanges.end(); ++it) { |
+ if (it->contains(hintChar)) |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+bool FontFallbackIterator::rangeContributesForHint(const Vector<UChar32> hintList, const FontDataRange& fontDataRange) |
{ |
for (auto it = hintList.begin(); it != hintList.end(); ++it) { |
if (*it >= fontDataRange.from() && *it <= fontDataRange.to()) { |
- return true; |
+ if (!alreadyLoadingRangeForHintChar(*it)) |
+ return true; |
} |
} |
return false; |
@@ -58,20 +68,22 @@ void FontFallbackIterator::willUseRange(const AtomicString& family, const FontDa |
selector->willUseRange(m_fontDescription, family, range); |
} |
-const SimpleFontData* FontFallbackIterator::next(const Vector<UChar32>& hintList) |
+const FontDataRange FontFallbackIterator::next(const Vector<UChar32>& hintList) |
{ |
if (m_fallbackStage == OutOfLuck) |
- return nullptr; |
+ return FontDataRange(); |
const FontData* fontData = m_fontFallbackList->fontDataAt(m_fontDescription, m_currentFontDataIndex); |
+ // If there is no fontData coming from the fallback list, it means |
+ // we have reached the system fallback stage. |
if (!fontData) { |
m_fallbackStage = SystemFonts; |
// We've reached pref + system fallback. |
ASSERT(hintList.size()); |
- const SimpleFontData* systemFont = uniqueSystemFontForHint(hintList[0]); |
+ RefPtr<SimpleFontData> systemFont = uniqueSystemFontForHint(hintList[0]); |
if (systemFont) |
- return systemFont; |
+ return FontDataRange(systemFont); |
// If we don't have options from the system fallback anymore or had |
// previously returned them, we only have the last resort font left. |
@@ -80,16 +92,26 @@ const SimpleFontData* FontFallbackIterator::next(const Vector<UChar32>& hintList |
// LastResort font, not just Times or Arial. |
FontCache* fontCache = FontCache::fontCache(); |
m_fallbackStage = OutOfLuck; |
- SimpleFontData* lastResort = fontCache->getLastResortFallbackFont(m_fontDescription).get(); |
+ RefPtr<SimpleFontData> lastResort = fontCache->getLastResortFallbackFont(m_fontDescription).get(); |
RELEASE_ASSERT(lastResort); |
- return lastResort; |
+ return FontDataRange(lastResort); |
} |
+ // Otherwise we've received a fontData from the font-family: set of fonts, |
+ // and a non-segmented one in this case. |
if (!fontData->isSegmented()) { |
// Skip forward to the next font family for the next call to next(). |
m_currentFontDataIndex++; |
m_currentFamily = m_currentFamily->next(); |
- return toSimpleFontData(fontData); |
+ if (!fontData->isLoading()) { |
+ RefPtr<SimpleFontData> nonSegmented = const_cast<SimpleFontData*>(toSimpleFontData(fontData)); |
+ // TODO crbug.com/546465: Investigate if we might need to do |
+ // something like |
+ // toSimpleFontData(fontData)->customFontData()->beginLoadIfNeeded() |
+ // here to trigger loading. |
+ return FontDataRange(nonSegmented); |
+ } |
+ return next(hintList); |
} |
// Iterate over ranges of a segmented font below. |
@@ -115,13 +137,15 @@ const SimpleFontData* FontFallbackIterator::next(const Vector<UChar32>& hintList |
if (rangeContributesForHint(hintList, currentRange)) { |
willUseRange(segmentedFamily, currentRange); |
- return currentRange.fontData().get(); |
+ if (!currentRange.fontData()->isLoading()) |
+ return currentRange; |
+ m_loadingCustomFontForRanges.append(currentRange); |
} |
return next(hintList); |
} |
-const SimpleFontData* FontFallbackIterator::uniqueSystemFontForHint(UChar32 hint) |
+const PassRefPtr<SimpleFontData> FontFallbackIterator::uniqueSystemFontForHint(UChar32 hint) |
{ |
FontCache* fontCache = FontCache::fontCache(); |
@@ -134,7 +158,7 @@ const SimpleFontData* FontFallbackIterator::uniqueSystemFontForHint(UChar32 hint |
RefPtr<SimpleFontData> fallbackFont = fontCache->fallbackFontForCharacter(m_fontDescription, hint, m_fontFallbackList->primarySimpleFontData(m_fontDescription)); |
- return m_visitedSystemFonts.add(hint, fallbackFont).storedValue->value.get(); |
+ return m_visitedSystemFonts.add(hint, fallbackFont).storedValue->value; |
} |
} // namespace blink |