summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/WebKit/Source/core/css/CSSFontFaceSource.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/WebKit/Source/core/css/CSSFontFaceSource.cpp')
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSFontFaceSource.cpp266
1 files changed, 10 insertions, 256 deletions
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSFontFaceSource.cpp b/chromium/third_party/WebKit/Source/core/css/CSSFontFaceSource.cpp
index d235aea7edf..39dfcd7c291 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSFontFaceSource.cpp
+++ b/chromium/third_party/WebKit/Source/core/css/CSSFontFaceSource.cpp
@@ -26,292 +26,46 @@
#include "config.h"
#include "core/css/CSSFontFaceSource.h"
-#include "RuntimeEnabledFeatures.h"
-#include "core/css/CSSCustomFontData.h"
#include "core/css/CSSFontFace.h"
-#include "platform/fonts/FontCache.h"
+#include "platform/fonts/FontCacheKey.h"
#include "platform/fonts/FontDescription.h"
#include "platform/fonts/SimpleFontData.h"
-#include "public/platform/Platform.h"
-#include "wtf/CurrentTime.h"
-
-#if ENABLE(SVG_FONTS)
-#include "SVGNames.h"
-#include "core/svg/SVGFontData.h"
-#include "core/svg/SVGFontElement.h"
-#include "core/svg/SVGFontFaceElement.h"
-#endif
namespace WebCore {
-CSSFontFaceSource::CSSFontFaceSource(const String& str, FontResource* font)
- : m_string(str)
- , m_font(font)
- , m_face(0)
-#if ENABLE(SVG_FONTS)
- , m_hasExternalSVGFont(false)
-#endif
+CSSFontFaceSource::CSSFontFaceSource()
+ : m_face(nullptr)
{
- if (m_font)
- m_font->addClient(this);
}
CSSFontFaceSource::~CSSFontFaceSource()
{
- if (m_font)
- m_font->removeClient(this);
- pruneTable();
-}
-
-void CSSFontFaceSource::pruneTable()
-{
- if (m_fontDataTable.isEmpty())
- return;
-
- for (FontDataTable::iterator it = m_fontDataTable.begin(); it != m_fontDataTable.end(); ++it) {
- SimpleFontData* fontData = it->value.get();
- if (fontData && fontData->customFontData())
- fontData->customFontData()->clearCSSFontFaceSource();
- }
- m_fontDataTable.clear();
-}
-
-bool CSSFontFaceSource::isLocal() const
-{
- if (m_font)
- return false;
-#if ENABLE(SVG_FONTS)
- if (m_svgFontFaceElement)
- return false;
-#endif
- return true;
-}
-
-bool CSSFontFaceSource::isLoading() const
-{
- if (m_font)
- return !m_font->stillNeedsLoad() && !m_font->isLoaded();
- return false;
-}
-
-bool CSSFontFaceSource::isLoaded() const
-{
- if (m_font)
- return m_font->isLoaded();
- return true;
-}
-
-bool CSSFontFaceSource::isValid() const
-{
- if (m_font)
- return !m_font->errorOccurred();
- return true;
-}
-
-void CSSFontFaceSource::didStartFontLoad(FontResource*)
-{
- // Avoid duplicated reports when multiple CSSFontFaceSource are registered
- // at this FontResource.
- if (!m_fontDataTable.isEmpty())
- m_histograms.loadStarted();
-}
-
-void CSSFontFaceSource::fontLoaded(FontResource*)
-{
- if (!m_fontDataTable.isEmpty())
- m_histograms.recordRemoteFont(m_font.get());
-
- pruneTable();
- if (m_face)
- m_face->fontLoaded(this);
}
PassRefPtr<SimpleFontData> CSSFontFaceSource::getFontData(const FontDescription& fontDescription)
{
// If the font hasn't loaded or an error occurred, then we've got nothing.
if (!isValid())
- return 0;
+ return nullptr;
if (isLocal()) {
// We're local. Just return a SimpleFontData from the normal cache.
- // We don't want to check alternate font family names here, so pass true as the checkingAlternateName parameter.
- RefPtr<SimpleFontData> fontData = FontCache::fontCache()->getFontData(fontDescription, m_string, true);
- m_histograms.recordLocalFont(fontData);
- return fontData;
+ return createFontData(fontDescription);
}
// See if we have a mapping in our FontData cache.
AtomicString emptyFontFamily = "";
FontCacheKey key = fontDescription.cacheKey(emptyFontFamily);
- RefPtr<SimpleFontData>& fontData = m_fontDataTable.add(key.hash(), 0).iterator->value;
- if (fontData)
- return fontData; // No release, because fontData is a reference to a RefPtr that is held in the m_fontDataTable.
-
- // If we are still loading, then we let the system pick a font.
- if (isLoaded()) {
- if (m_font) {
-#if ENABLE(SVG_FONTS)
- if (m_hasExternalSVGFont) {
- // For SVG fonts parse the external SVG document, and extract the <font> element.
- if (!m_font->ensureSVGFontData())
- return 0;
-
- if (!m_externalSVGFontElement) {
- String fragmentIdentifier;
- size_t start = m_string.find('#');
- if (start != kNotFound)
- fragmentIdentifier = m_string.string().substring(start + 1);
- m_externalSVGFontElement = m_font->getSVGFontById(fragmentIdentifier);
- }
-
- if (!m_externalSVGFontElement)
- return 0;
-
- SVGFontFaceElement* fontFaceElement = 0;
-
- // Select first <font-face> child
- for (Node* fontChild = m_externalSVGFontElement->firstChild(); fontChild; fontChild = fontChild->nextSibling()) {
- if (fontChild->hasTagName(SVGNames::font_faceTag)) {
- fontFaceElement = toSVGFontFaceElement(fontChild);
- break;
- }
- }
-
- if (fontFaceElement) {
- if (!m_svgFontFaceElement) {
- // We're created using a CSS @font-face rule, that means we're not associated with a SVGFontFaceElement.
- // Use the imported <font-face> tag as referencing font-face element for these cases.
- m_svgFontFaceElement = fontFaceElement;
- }
-
- fontData = SimpleFontData::create(
- SVGFontData::create(fontFaceElement),
- fontDescription.effectiveFontSize(),
- fontDescription.isSyntheticBold(),
- fontDescription.isSyntheticItalic());
- }
- } else
-#endif
- {
- // Create new FontPlatformData from our CGFontRef, point size and ATSFontRef.
- if (!m_font->ensureCustomFontData())
- return 0;
-
- fontData = SimpleFontData::create(
- m_font->platformDataFromCustomData(fontDescription.effectiveFontSize(),
- fontDescription.isSyntheticBold(), fontDescription.isSyntheticItalic(),
- fontDescription.orientation(), fontDescription.widthVariant()), CustomFontData::create(false));
- }
- } else {
-#if ENABLE(SVG_FONTS)
- // In-Document SVG Fonts
- if (m_svgFontFaceElement) {
- fontData = SimpleFontData::create(
- SVGFontData::create(m_svgFontFaceElement.get()),
- fontDescription.effectiveFontSize(),
- fontDescription.isSyntheticBold(),
- fontDescription.isSyntheticItalic());
- }
-#endif
- }
- } else {
- // This temporary font is not retained and should not be returned.
- FontCachePurgePreventer fontCachePurgePreventer;
- SimpleFontData* temporaryFont = FontCache::fontCache()->getNonRetainedLastResortFallbackFont(fontDescription);
- RefPtr<CSSCustomFontData> cssFontData = CSSCustomFontData::create(true);
- cssFontData->setCSSFontFaceSource(this);
- fontData = SimpleFontData::create(temporaryFont->platformData(), cssFontData);
- }
-
+ RefPtr<SimpleFontData>& fontData = m_fontDataTable.add(key.hash(), nullptr).storedValue->value;
+ if (!fontData)
+ fontData = createFontData(fontDescription);
return fontData; // No release, because fontData is a reference to a RefPtr that is held in the m_fontDataTable.
}
-#if ENABLE(SVG_FONTS)
-SVGFontFaceElement* CSSFontFaceSource::svgFontFaceElement() const
-{
- return m_svgFontFaceElement.get();
-}
-
-void CSSFontFaceSource::setSVGFontFaceElement(PassRefPtr<SVGFontFaceElement> element)
-{
- m_svgFontFaceElement = element;
-}
-
-bool CSSFontFaceSource::isSVGFontFaceSource() const
-{
- return m_svgFontFaceElement || m_hasExternalSVGFont;
-}
-#endif
-
-bool CSSFontFaceSource::ensureFontData()
-{
- if (!m_font)
- return false;
-#if ENABLE(SVG_FONTS)
- if (m_hasExternalSVGFont)
- return m_font->ensureSVGFontData();
-#endif
- return m_font->ensureCustomFontData();
-}
-
-bool CSSFontFaceSource::isLocalFontAvailable(const FontDescription& fontDescription)
-{
- if (!isLocal())
- return false;
- return FontCache::fontCache()->isPlatformFontAvailable(fontDescription, m_string);
-}
-
-void CSSFontFaceSource::beginLoadIfNeeded()
+void CSSFontFaceSource::trace(Visitor* visitor)
{
- if (m_face && m_font)
- m_face->beginLoadIfNeeded(this);
-}
-
-void CSSFontFaceSource::FontLoadHistograms::loadStarted()
-{
- if (!m_loadStartTime)
- m_loadStartTime = currentTimeMS();
-}
-
-void CSSFontFaceSource::FontLoadHistograms::recordLocalFont(bool loadSuccess)
-{
- if (!m_loadStartTime) {
- blink::Platform::current()->histogramEnumeration("WebFont.LocalFontUsed", loadSuccess ? 1 : 0, 2);
- m_loadStartTime = -1; // Do not count this font again.
- }
-}
-
-void CSSFontFaceSource::FontLoadHistograms::recordRemoteFont(const FontResource* font)
-{
- if (m_loadStartTime > 0 && font && !font->isLoading()) {
- int duration = static_cast<int>(currentTimeMS() - m_loadStartTime);
- blink::Platform::current()->histogramCustomCounts(histogramName(font), duration, 0, 10000, 50);
- m_loadStartTime = -1;
-
- enum { Miss, Hit, DataUrl, CacheHitEnumMax };
- int histogramValue = font->url().protocolIsData() ? DataUrl
- : font->response().wasCached() ? Hit
- : Miss;
- blink::Platform::current()->histogramEnumeration("WebFont.CacheHit", histogramValue, CacheHitEnumMax);
- }
-}
-
-const char* CSSFontFaceSource::FontLoadHistograms::histogramName(const FontResource* font)
-{
- if (font->errorOccurred())
- return "WebFont.DownloadTime.LoadError";
-
- unsigned size = font->encodedSize();
- if (size < 10 * 1024)
- return "WebFont.DownloadTime.0.Under10KB";
- if (size < 50 * 1024)
- return "WebFont.DownloadTime.1.10KBTo50KB";
- if (size < 100 * 1024)
- return "WebFont.DownloadTime.2.50KBTo100KB";
- if (size < 1024 * 1024)
- return "WebFont.DownloadTime.3.100KBTo1MB";
- return "WebFont.DownloadTime.4.Over1MB";
+ visitor->trace(m_face);
}
}