Index: Source/core/css/CSSFontFaceSrcValue.cpp |
diff --git a/Source/core/css/CSSFontFaceSrcValue.cpp b/Source/core/css/CSSFontFaceSrcValue.cpp |
index 5ccf7547707efc0f79d2e69841d9ace072da92cb..f20a3428589a60e2bbc5004bef13c3d34c167c67 100644 |
--- a/Source/core/css/CSSFontFaceSrcValue.cpp |
+++ b/Source/core/css/CSSFontFaceSrcValue.cpp |
@@ -39,6 +39,30 @@ |
namespace WebCore { |
+CSSFontFaceSrcValue::FontResourceInvalidator::FontResourceInvalidator(CSSFontFaceSrcValue& srcValue) |
+ : m_srcValue(srcValue) |
+ , m_resource(srcValue.m_fetched) |
+{ |
+ m_resource->addClient(this); |
Kunihiko Sakamoto
2014/04/10 05:49:24
Resource cancels in-flight request when all client
bashi
2014/04/10 07:05:51
Great suggestion! Done.
|
+} |
+ |
+CSSFontFaceSrcValue::FontResourceInvalidator::~FontResourceInvalidator() |
+{ |
+ m_resource->removeClient(this); |
+} |
+ |
+void CSSFontFaceSrcValue::FontResourceInvalidator::fontLoaded(FontResource*) |
+{ |
+ m_srcValue.m_invalidator.clear(); |
+} |
+ |
+void CSSFontFaceSrcValue::FontResourceInvalidator::corsFailed(FontResource*) |
+{ |
+ m_srcValue.m_fetched.clear(); |
+ m_srcValue.m_corsEnabled = NotCORSEnabled; |
+ m_srcValue.m_invalidator.clear(); |
+} |
+ |
#if ENABLE(SVG_FONTS) |
bool CSSFontFaceSrcValue::isSVGFontFaceSrc() const |
{ |
@@ -88,11 +112,23 @@ bool CSSFontFaceSrcValue::hasFailedOrCanceledSubresources() const |
return m_fetched->loadFailedOrCanceled(); |
} |
+bool CSSFontFaceSrcValue::shouldSetCrossOriginAccessControl(const KURL& resource, SecurityOrigin* securityOrigin) |
+{ |
+ if (m_corsEnabled == NotCORSEnabled || resource.isLocalFile() || resource.protocolIsData()) |
+ return false; |
+ return !securityOrigin->canRequest(resource); |
+} |
+ |
FontResource* CSSFontFaceSrcValue::fetch(Document* document) |
{ |
if (!m_fetched) { |
FetchRequest request(ResourceRequest(document->completeURL(m_resource)), FetchInitiatorTypeNames::css); |
+ SecurityOrigin* securityOrigin = document->securityOrigin(); |
+ if (shouldSetCrossOriginAccessControl(request.url(), securityOrigin)) { |
+ request.setCrossOriginAccessControl(securityOrigin, DoNotAllowStoredCredentials); |
+ } |
m_fetched = document->fetcher()->fetchFont(request); |
+ m_invalidator = adoptPtr(new FontResourceInvalidator(*this)); |
} |
return m_fetched.get(); |
} |