Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / fetch / FontResource.cpp
index 0a0138d..98c9f2f 100644 (file)
@@ -27,6 +27,7 @@
 #include "config.h"
 #include "core/fetch/FontResource.h"
 
+#include "core/dom/TagCollection.h"
 #include "core/fetch/ResourceClientWalker.h"
 #include "core/html/parser/TextResourceDecoder.h"
 #include "platform/SharedBuffer.h"
 #include "public/platform/Platform.h"
 #include "wtf/CurrentTime.h"
 
-#if ENABLE(SVG_FONTS)
-#include "SVGNames.h"
-#include "core/html/HTMLCollection.h"
-#include "core/svg/SVGDocument.h"
-#include "core/svg/SVGFontElement.h"
-#endif
-
-namespace WebCore {
+namespace blink {
 
 static const double fontLoadWaitLimitSec = 3.0;
 
+enum FontPackageFormat {
+    PackageFormatUnknown,
+    PackageFormatSFNT,
+    PackageFormatWOFF,
+    PackageFormatWOFF2,
+    PackageFormatSVG,
+    PackageFormatEnumMax
+};
+
+static FontPackageFormat packageFormatOf(SharedBuffer* buffer)
+{
+    if (buffer->size() < 4)
+        return PackageFormatUnknown;
+
+    const char* data = buffer->data();
+    if (data[0] == 'w' && data[1] == 'O' && data[2] == 'F' && data[3] == 'F')
+        return PackageFormatWOFF;
+    if (data[0] == 'w' && data[1] == 'O' && data[2] == 'F' && data[3] == '2')
+        return PackageFormatWOFF2;
+    return PackageFormatSFNT;
+}
+
+static void recordPackageFormatHistogram(FontPackageFormat format)
+{
+    blink::Platform::current()->histogramEnumeration("WebFont.PackageFormat", format, PackageFormatEnumMax);
+}
+
 FontResource::FontResource(const ResourceRequest& resourceRequest)
     : Resource(resourceRequest, Font)
-    , m_loadInitiated(false)
+    , m_state(Unloaded)
     , m_exceedsFontLoadWaitLimit(false)
+    , m_corsFailed(false)
     , m_fontLoadWaitLimitTimer(this, &FontResource::fontLoadWaitLimitCallback)
 {
 }
@@ -58,6 +80,18 @@ FontResource::~FontResource()
 {
 }
 
+void FontResource::didScheduleLoad()
+{
+    if (m_state == Unloaded)
+        m_state = LoadScheduled;
+}
+
+void FontResource::didUnscheduleLoad()
+{
+    if (m_state == LoadScheduled)
+        m_state = Unloaded;
+}
+
 void FontResource::load(ResourceFetcher*, const ResourceLoaderOptions& options)
 {
     // Don't load the file yet. Wait for an access before triggering the load.
@@ -75,8 +109,8 @@ void FontResource::didAddClient(ResourceClient* c)
 
 void FontResource::beginLoadIfNeeded(ResourceFetcher* dl)
 {
-    if (!m_loadInitiated) {
-        m_loadInitiated = true;
+    if (m_state != LoadInitiated) {
+        m_state = LoadInitiated;
         Resource::load(dl, m_options);
         m_fontLoadWaitLimitTimer.startOneShot(fontLoadWaitLimitSec, FROM_HERE);
 
@@ -91,75 +125,23 @@ bool FontResource::ensureCustomFontData()
     if (!m_fontData && !errorOccurred() && !isLoading()) {
         if (m_data)
             m_fontData = FontCustomPlatformData::create(m_data.get());
-        if (!m_fontData)
+
+        if (m_fontData) {
+            recordPackageFormatHistogram(packageFormatOf(m_data.get()));
+        } else {
             setStatus(DecodeError);
+            recordPackageFormatHistogram(PackageFormatUnknown);
+        }
     }
     return m_fontData;
 }
 
 FontPlatformData FontResource::platformDataFromCustomData(float size, bool bold, bool italic, FontOrientation orientation, FontWidthVariant widthVariant)
 {
-#if ENABLE(SVG_FONTS)
-    if (m_externalSVGDocument)
-        return FontPlatformData(size, bold, italic);
-#endif
     ASSERT(m_fontData);
     return m_fontData->fontPlatformData(size, bold, italic, orientation, widthVariant);
 }
 
-#if ENABLE(SVG_FONTS)
-bool FontResource::ensureSVGFontData()
-{
-    if (!m_externalSVGDocument && !errorOccurred() && !isLoading()) {
-        if (m_data) {
-            m_externalSVGDocument = SVGDocument::create();
-
-            OwnPtr<TextResourceDecoder> decoder = TextResourceDecoder::create("application/xml");
-            String svgSource = decoder->decode(m_data->data(), m_data->size());
-            svgSource = svgSource + decoder->flush();
-
-            m_externalSVGDocument->setContent(svgSource);
-
-            if (decoder->sawError())
-                m_externalSVGDocument = nullptr;
-        }
-        if (!m_externalSVGDocument)
-            setStatus(DecodeError);
-    }
-
-    return m_externalSVGDocument;
-}
-
-SVGFontElement* FontResource::getSVGFontById(const String& fontName) const
-{
-    RefPtr<HTMLCollection> collection = m_externalSVGDocument->getElementsByTagNameNS(SVGNames::fontTag.namespaceURI(), SVGNames::fontTag.localName());
-    if (!collection)
-        return 0;
-
-    unsigned collectionLength = collection->length();
-    if (!collectionLength)
-        return 0;
-
-#ifndef NDEBUG
-    for (unsigned i = 0; i < collectionLength; ++i) {
-        ASSERT(collection->item(i));
-        ASSERT(isSVGFontElement(collection->item(i)));
-    }
-#endif
-
-    if (fontName.isEmpty())
-        return toSVGFontElement(collection->item(0));
-
-    for (unsigned i = 0; i < collectionLength; ++i) {
-        SVGFontElement* element = toSVGFontElement(collection->item(i));
-        if (element->getIdAttribute() == fontName)
-            return element;
-    }
-
-    return 0;
-}
-#endif
-
 bool FontResource::isSafeToUnlock() const
 {
     return m_data->hasOneRef();