Index: third_party/WebKit/Source/core/css/CSSCursorImageValue.cpp |
diff --git a/third_party/WebKit/Source/core/css/CSSCursorImageValue.cpp b/third_party/WebKit/Source/core/css/CSSCursorImageValue.cpp |
index bf6606d3f47ecb4622b78bb51573b046476655a3..3f30a4f35ccac29733a63502c1fa9ec7c6f0ce2a 100644 |
--- a/third_party/WebKit/Source/core/css/CSSCursorImageValue.cpp |
+++ b/third_party/WebKit/Source/core/css/CSSCursorImageValue.cpp |
@@ -28,6 +28,7 @@ |
#include "core/style/StyleFetchedImage.h" |
#include "core/style/StyleFetchedImageSet.h" |
#include "core/style/StyleImage.h" |
+#include "core/style/StylePendingImage.h" |
#include "core/svg/SVGCursorElement.h" |
#include "core/svg/SVGLengthContext.h" |
#include "core/svg/SVGURIReference.h" |
@@ -48,7 +49,7 @@ |
, m_imageValue(imageValue) |
, m_hotSpotSpecified(hotSpotSpecified) |
, m_hotSpot(hotSpot) |
- , m_isCachePending(true) |
+ , m_accessedImage(false) |
{ |
} |
@@ -116,30 +117,13 @@ |
return false; |
} |
-bool CSSCursorImageValue::isCachePending(float deviceScaleFactor) const |
-{ |
- // Need to delegate completely so that changes in device scale factor can be handled appropriately. |
+StyleImage* CSSCursorImageValue::cachedImage(Document* document, float deviceScaleFactor) |
+{ |
if (m_imageValue->isImageSetValue()) |
- return toCSSImageSetValue(*m_imageValue).isCachePending(deviceScaleFactor); |
- return m_isCachePending; |
-} |
- |
-StyleImage* CSSCursorImageValue::cachedImage(float deviceScaleFactor) |
-{ |
- ASSERT(!isCachePending(deviceScaleFactor)); |
- |
- if (m_imageValue->isImageSetValue()) |
- return toCSSImageSetValue(*m_imageValue).cachedImageSet(deviceScaleFactor); |
- return m_cachedImage.get(); |
-} |
- |
-StyleImage* CSSCursorImageValue::cacheImage(Document* document, float deviceScaleFactor) |
-{ |
- if (m_imageValue->isImageSetValue()) |
- return toCSSImageSetValue(*m_imageValue).cacheImageSet(document, deviceScaleFactor); |
- |
- if (m_isCachePending) { |
- m_isCachePending = false; |
+ return toCSSImageSetValue(m_imageValue.get())->cachedImageSet(document, deviceScaleFactor); |
+ |
+ if (!m_accessedImage) { |
+ m_accessedImage = true; |
// For SVG images we need to lazily substitute in the correct URL. Rather than attempt |
// to change the URL of the CSSImageValue (which would then change behavior like cssText), |
@@ -150,19 +134,31 @@ |
if (SVGCursorElement* cursorElement = resourceReferencedByCursorElement(imageValue->url(), *document)) { |
RefPtrWillBeRawPtr<CSSImageValue> svgImageValue = CSSImageValue::create(document->completeURL(cursorElement->href()->currentValue()->value())); |
svgImageValue->setReferrer(imageValue->referrer()); |
- StyleFetchedImage* cachedImage = svgImageValue->cacheImage(document); |
- m_cachedImage = cachedImage; |
+ StyleFetchedImage* cachedImage = svgImageValue->cachedImage(document); |
+ m_image = cachedImage; |
return cachedImage; |
} |
} |
if (m_imageValue->isImageValue()) |
- m_cachedImage = toCSSImageValue(*m_imageValue).cacheImage(document); |
- } |
- |
- if (m_cachedImage && m_cachedImage->isImageResource()) |
- return toStyleFetchedImage(m_cachedImage); |
+ m_image = toCSSImageValue(m_imageValue.get())->cachedImage(document); |
+ } |
+ |
+ if (m_image && m_image->isImageResource()) |
+ return toStyleFetchedImage(m_image); |
return nullptr; |
+} |
+ |
+StyleImage* CSSCursorImageValue::cachedOrPendingImage(float deviceScaleFactor) |
+{ |
+ // Need to delegate completely so that changes in device scale factor can be handled appropriately. |
+ if (m_imageValue->isImageSetValue()) |
+ return toCSSImageSetValue(m_imageValue.get())->cachedOrPendingImageSet(deviceScaleFactor); |
+ |
+ if (!m_image) |
+ m_image = StylePendingImage::create(this); |
+ |
+ return m_image.get(); |
} |
bool CSSCursorImageValue::isSVGCursor() const |
@@ -177,15 +173,15 @@ |
String CSSCursorImageValue::cachedImageURL() |
{ |
- if (!m_cachedImage || !m_cachedImage->isImageResource()) |
+ if (!m_image || !m_image->isImageResource()) |
return String(); |
- return toStyleFetchedImage(m_cachedImage)->cachedImage()->url().string(); |
+ return toStyleFetchedImage(m_image)->cachedImage()->url().string(); |
} |
void CSSCursorImageValue::clearImageResource() |
{ |
- m_cachedImage = nullptr; |
- m_isCachePending = true; |
+ m_image = nullptr; |
+ m_accessedImage = false; |
} |
#if !ENABLE(OILPAN) |
@@ -204,7 +200,7 @@ |
DEFINE_TRACE_AFTER_DISPATCH(CSSCursorImageValue) |
{ |
visitor->trace(m_imageValue); |
- visitor->trace(m_cachedImage); |
+ visitor->trace(m_image); |
CSSValue::traceAfterDispatch(visitor); |
} |