Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / css / RemoteFontFaceSource.cpp
index 9b15954..279c83f 100644 (file)
@@ -5,8 +5,11 @@
 #include "config.h"
 #include "core/css/RemoteFontFaceSource.h"
 
+#include "FetchInitiatorTypeNames.h"
 #include "core/css/CSSCustomFontData.h"
 #include "core/css/CSSFontFace.h"
+#include "core/css/CSSFontSelector.h"
+#include "core/fetch/ResourceFetcher.h"
 #include "platform/fonts/FontCache.h"
 #include "platform/fonts/FontDescription.h"
 #include "platform/fonts/SimpleFontData.h"
@@ -57,16 +60,15 @@ bool RemoteFontFaceSource::isValid() const
 
 void RemoteFontFaceSource::didStartFontLoad(FontResource*)
 {
-    // Avoid duplicated reports when multiple CSSFontFaceSource are registered
-    // at this FontResource.
-    if (!m_fontDataTable.isEmpty())
-        m_histograms.loadStarted();
+    // We may send duplicated reports when multiple CSSFontFaceSource are
+    // registered at this FontResource. Associating the same URL to different
+    // font-family causes the case, but we treat them as indivisual resources.
+    m_histograms.loadStarted();
 }
 
 void RemoteFontFaceSource::fontLoaded(FontResource*)
 {
-    if (!m_fontDataTable.isEmpty())
-        m_histograms.recordRemoteFont(m_font.get());
+    m_histograms.recordRemoteFont(m_font.get());
 
     pruneTable();
     if (m_face)
@@ -82,6 +84,28 @@ void RemoteFontFaceSource::fontLoadWaitLimitExceeded(FontResource*)
     m_histograms.recordFallbackTime(m_font.get());
 }
 
+void RemoteFontFaceSource::corsFailed(FontResource*)
+{
+    if (m_face) {
+        m_histograms.corsFailed();
+        Document* document = m_face->fontSelector() ? m_face->fontSelector()->document() : 0;
+        if (document) {
+            FetchRequest request(ResourceRequest(m_font->url()), FetchInitiatorTypeNames::css);
+            ResourcePtr<FontResource> newFontResource = document->fetcher()->fetchFont(request);
+            if (newFontResource) {
+                m_font->removeClient(this);
+                m_font = newFontResource;
+                m_font->addClient(this);
+                m_face->fontSelector()->beginLoadingFontSoon(m_font.get());
+                return;
+            } else {
+                pruneTable();
+            }
+        }
+        m_face->fontLoaded(this);
+    }
+}
+
 PassRefPtr<SimpleFontData> RemoteFontFaceSource::createFontData(const FontDescription& fontDescription)
 {
     if (!isLoaded())
@@ -156,6 +180,12 @@ void RemoteFontFaceSource::FontLoadHistograms::recordRemoteFont(const FontResour
             : font->response().wasCached() ? Hit
             : Miss;
         blink::Platform::current()->histogramEnumeration("WebFont.CacheHit", histogramValue, CacheHitEnumMax);
+
+        if (!font->errorOccurred()) {
+            enum { CORSFail, CORSSuccess, CORSEnumMax };
+            int corsValue = m_corsFailed ? CORSFail : CORSSuccess;
+            blink::Platform::current()->histogramEnumeration("WebFont.CORSSuccess", corsValue, CORSEnumMax);
+        }
     }
 }