Title: [205419] trunk/Source/WebCore
Revision
205419
Author
an...@apple.com
Date
2016-09-04 06:42:42 -0700 (Sun, 04 Sep 2016)

Log Message

Reverse ownership relation of StyleCachedImage and CSSImageValue
https://bugs.webkit.org/show_bug.cgi?id=161447

Reviewed by Andreas Kling.

Currently StyleCachedImage (which represents an image in RenderStyle) has a weak ref to the
underlying CSSImageValue/CSSImageSetValue which actually owns it. This is awkwards especially since
StyleGeneratedImage, the other StyleImage subclass has reversed relationship where it refs
the underlying CSSImageGeneratorValue.

This patch makes StyleCachedImage similar to StyleGeneratedImage. StyleCachedImage now refs the
underlying CSSImageValue/CSSImageSetValue. CSSImageValues no longer need to know about StyleCachedImage.
Instead they reference CachedImages (memory cache objects) directly. StyleCachedImage instances are now
conceptually unique to RenderStyle instances. Actual resources are shared as before by sharing CachedImages.

* css/CSSCursorImageValue.cpp:
(WebCore::CSSCursorImageValue::loadImage):
(WebCore::CSSCursorImageValue::cachedImage):
(WebCore::CSSCursorImageValue::styleImage): Deleted.
* css/CSSCursorImageValue.h:
* css/CSSImageGeneratorValue.cpp:
(WebCore::CSSImageGeneratorValue::cachedImageForCSSValue):
* css/CSSImageSetValue.cpp:
(WebCore::CSSImageSetValue::~CSSImageSetValue):
(WebCore::CSSImageSetValue::loadBestFitImage):
(WebCore::CSSImageSetValue::traverseSubresources):
(WebCore::CSSImageSetValue::styleImage): Deleted.
* css/CSSImageSetValue.h:
* css/CSSImageValue.cpp:
(WebCore::CSSImageValue::CSSImageValue):
(WebCore::CSSImageValue::~CSSImageValue):
(WebCore::CSSImageValue::isPending):
(WebCore::CSSImageValue::loadImage):
(WebCore::CSSImageValue::traverseSubresources):
(WebCore::CSSImageValue::knownToBeOpaque):
(WebCore::CSSImageValue::styleImage): Deleted.
* css/CSSImageValue.h:
* css/StyleBuilderCustom.h:
(WebCore::StyleBuilderCustom::applyValueContent):
* css/StyleResolver.cpp:
(WebCore::StyleResolver::styleImage):
(WebCore::StyleResolver::styleCachedImageFromValue):
(WebCore::StyleResolver::styleGeneratedImageFromValue):
(WebCore::StyleResolver::cachedOrPendingFromValue): Deleted.
(WebCore::StyleResolver::generatedOrPendingFromValue): Deleted.
(WebCore::StyleResolver::setOrPendingFromValue): Deleted.
(WebCore::StyleResolver::cursorOrPendingFromValue): Deleted.
* css/StyleResolver.h:
* editing/TextIterator.cpp:
(WebCore::fullyClipsContents):
* page/PageSerializer.cpp:
(WebCore::PageSerializer::retrieveResourcesForProperties):
* rendering/style/FillLayer.cpp:
(WebCore::FillLayer::imagesIdentical):

    Compare data equality instead of pointer equality for StyleImages (since StyleImages are no longer shared).

(WebCore::layerImagesIdentical): Deleted.
* rendering/style/StyleCachedImage.cpp:
(WebCore::StyleCachedImage::StyleCachedImage):
(WebCore::StyleCachedImage::~StyleCachedImage):
(WebCore::StyleCachedImage::cachedImage):
(WebCore::StyleCachedImage::cssValue):
(WebCore::StyleCachedImage::canRender):
(WebCore::StyleCachedImage::isPending):
(WebCore::StyleCachedImage::isLoaded):
(WebCore::StyleCachedImage::errorOccurred):
(WebCore::StyleCachedImage::imageSize):
(WebCore::StyleCachedImage::imageHasRelativeWidth):
(WebCore::StyleCachedImage::imageHasRelativeHeight):
(WebCore::StyleCachedImage::computeIntrinsicDimensions):
(WebCore::StyleCachedImage::usesImageContainerSize):
(WebCore::StyleCachedImage::setContainerSizeForRenderer):
(WebCore::StyleCachedImage::addClient):
(WebCore::StyleCachedImage::removeClient):
(WebCore::StyleCachedImage::image):
(WebCore::StyleCachedImage::knownToBeOpaque):
(WebCore::StyleCachedImage::setCachedImage): Deleted.
* rendering/style/StyleCachedImage.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (205418 => 205419)


--- trunk/Source/WebCore/ChangeLog	2016-09-04 07:10:53 UTC (rev 205418)
+++ trunk/Source/WebCore/ChangeLog	2016-09-04 13:42:42 UTC (rev 205419)
@@ -1,3 +1,85 @@
+2016-09-04  Antti Koivisto  <an...@apple.com>
+
+        Reverse ownership relation of StyleCachedImage and CSSImageValue
+        https://bugs.webkit.org/show_bug.cgi?id=161447
+
+        Reviewed by Andreas Kling.
+
+        Currently StyleCachedImage (which represents an image in RenderStyle) has a weak ref to the
+        underlying CSSImageValue/CSSImageSetValue which actually owns it. This is awkwards especially since
+        StyleGeneratedImage, the other StyleImage subclass has reversed relationship where it refs
+        the underlying CSSImageGeneratorValue.
+
+        This patch makes StyleCachedImage similar to StyleGeneratedImage. StyleCachedImage now refs the
+        underlying CSSImageValue/CSSImageSetValue. CSSImageValues no longer need to know about StyleCachedImage.
+        Instead they reference CachedImages (memory cache objects) directly. StyleCachedImage instances are now
+        conceptually unique to RenderStyle instances. Actual resources are shared as before by sharing CachedImages.
+
+        * css/CSSCursorImageValue.cpp:
+        (WebCore::CSSCursorImageValue::loadImage):
+        (WebCore::CSSCursorImageValue::cachedImage):
+        (WebCore::CSSCursorImageValue::styleImage): Deleted.
+        * css/CSSCursorImageValue.h:
+        * css/CSSImageGeneratorValue.cpp:
+        (WebCore::CSSImageGeneratorValue::cachedImageForCSSValue):
+        * css/CSSImageSetValue.cpp:
+        (WebCore::CSSImageSetValue::~CSSImageSetValue):
+        (WebCore::CSSImageSetValue::loadBestFitImage):
+        (WebCore::CSSImageSetValue::traverseSubresources):
+        (WebCore::CSSImageSetValue::styleImage): Deleted.
+        * css/CSSImageSetValue.h:
+        * css/CSSImageValue.cpp:
+        (WebCore::CSSImageValue::CSSImageValue):
+        (WebCore::CSSImageValue::~CSSImageValue):
+        (WebCore::CSSImageValue::isPending):
+        (WebCore::CSSImageValue::loadImage):
+        (WebCore::CSSImageValue::traverseSubresources):
+        (WebCore::CSSImageValue::knownToBeOpaque):
+        (WebCore::CSSImageValue::styleImage): Deleted.
+        * css/CSSImageValue.h:
+        * css/StyleBuilderCustom.h:
+        (WebCore::StyleBuilderCustom::applyValueContent):
+        * css/StyleResolver.cpp:
+        (WebCore::StyleResolver::styleImage):
+        (WebCore::StyleResolver::styleCachedImageFromValue):
+        (WebCore::StyleResolver::styleGeneratedImageFromValue):
+        (WebCore::StyleResolver::cachedOrPendingFromValue): Deleted.
+        (WebCore::StyleResolver::generatedOrPendingFromValue): Deleted.
+        (WebCore::StyleResolver::setOrPendingFromValue): Deleted.
+        (WebCore::StyleResolver::cursorOrPendingFromValue): Deleted.
+        * css/StyleResolver.h:
+        * editing/TextIterator.cpp:
+        (WebCore::fullyClipsContents):
+        * page/PageSerializer.cpp:
+        (WebCore::PageSerializer::retrieveResourcesForProperties):
+        * rendering/style/FillLayer.cpp:
+        (WebCore::FillLayer::imagesIdentical):
+
+            Compare data equality instead of pointer equality for StyleImages (since StyleImages are no longer shared).
+
+        (WebCore::layerImagesIdentical): Deleted.
+        * rendering/style/StyleCachedImage.cpp:
+        (WebCore::StyleCachedImage::StyleCachedImage):
+        (WebCore::StyleCachedImage::~StyleCachedImage):
+        (WebCore::StyleCachedImage::cachedImage):
+        (WebCore::StyleCachedImage::cssValue):
+        (WebCore::StyleCachedImage::canRender):
+        (WebCore::StyleCachedImage::isPending):
+        (WebCore::StyleCachedImage::isLoaded):
+        (WebCore::StyleCachedImage::errorOccurred):
+        (WebCore::StyleCachedImage::imageSize):
+        (WebCore::StyleCachedImage::imageHasRelativeWidth):
+        (WebCore::StyleCachedImage::imageHasRelativeHeight):
+        (WebCore::StyleCachedImage::computeIntrinsicDimensions):
+        (WebCore::StyleCachedImage::usesImageContainerSize):
+        (WebCore::StyleCachedImage::setContainerSizeForRenderer):
+        (WebCore::StyleCachedImage::addClient):
+        (WebCore::StyleCachedImage::removeClient):
+        (WebCore::StyleCachedImage::image):
+        (WebCore::StyleCachedImage::knownToBeOpaque):
+        (WebCore::StyleCachedImage::setCachedImage): Deleted.
+        * rendering/style/StyleCachedImage.h:
+
 2016-09-03  Wenson Hsieh  <wenson_hs...@apple.com>
 
         Media controls behave strangely when videos mute from within a playing handler

Modified: trunk/Source/WebCore/css/CSSCursorImageValue.cpp (205418 => 205419)


--- trunk/Source/WebCore/css/CSSCursorImageValue.cpp	2016-09-04 07:10:53 UTC (rev 205418)
+++ trunk/Source/WebCore/css/CSSCursorImageValue.cpp	2016-09-04 13:42:42 UTC (rev 205419)
@@ -26,8 +26,6 @@
 #include "CSSImageValue.h"
 #include "CachedImage.h"
 #include "CachedResourceLoader.h"
-#include "StyleCachedImage.h"
-#include "StyleImage.h"
 #include "SVGCursorElement.h"
 #include "SVGLengthContext.h"
 #include "SVGNames.h"
@@ -102,32 +100,17 @@
     m_hotSpot.setY(static_cast<int>(y));
 }
 
-void CSSCursorImageValue::loadImage(CachedResourceLoader& loader, const ResourceLoaderOptions& options)
+std::pair<CachedImage*, float> CSSCursorImageValue::loadImage(CachedResourceLoader& loader, const ResourceLoaderOptions& options)
 {
-    if (is<CSSImageSetValue>(m_imageValue.get())) {
-        downcast<CSSImageSetValue>(m_imageValue.get()).loadBestFitImage(loader, options);
-        return;
-    }
+    if (is<CSSImageSetValue>(m_imageValue.get()))
+        return downcast<CSSImageSetValue>(m_imageValue.get()).loadBestFitImage(loader, options);
 
-    downcast<CSSImageValue>(m_imageValue.get()).loadImage(loader, options);
-}
-
-StyleCachedImage& CSSCursorImageValue::styleImage(const Document& document)
-{
-    // Need to delegate completely so that changes in device scale factor can be handled appropriately.
-    StyleCachedImage* styleImage;
-    if (is<CSSImageSetValue>(m_imageValue.get()))
-        styleImage = &downcast<CSSImageSetValue>(m_imageValue.get()).styleImage(document);
-    else {
-        if (auto* cursorElement = updateCursorElement(document)) {
-            if (cursorElement->href() != downcast<CSSImageValue>(m_imageValue.get()).url())
-                m_imageValue = CSSImageValue::create(cursorElement->href());
-        }
-        styleImage = &downcast<CSSImageValue>(m_imageValue.get()).styleImage();
+    if (auto* cursorElement = updateCursorElement(*loader.document())) {
+        if (cursorElement->href() != downcast<CSSImageValue>(m_imageValue.get()).url())
+            m_imageValue = CSSImageValue::create(cursorElement->href());
     }
-    styleImage->setCSSValue(*this);
 
-    return *styleImage;
+    return { downcast<CSSImageValue>(m_imageValue.get()).loadImage(loader, options), 1 };
 }
 
 bool CSSCursorImageValue::equals(const CSSCursorImageValue& other) const

Modified: trunk/Source/WebCore/css/CSSCursorImageValue.h (205418 => 205419)


--- trunk/Source/WebCore/css/CSSCursorImageValue.h	2016-09-04 07:10:53 UTC (rev 205418)
+++ trunk/Source/WebCore/css/CSSCursorImageValue.h	2016-09-04 13:42:42 UTC (rev 205419)
@@ -31,7 +31,6 @@
 class Element;
 class SVGCursorElement;
 class SVGElement;
-class StyleCachedImage;
 
 class CSSCursorImageValue final : public CSSValue {
 public:
@@ -53,8 +52,7 @@
 
     String customCSSText() const;
 
-    void loadImage(CachedResourceLoader&, const ResourceLoaderOptions&);
-    StyleCachedImage& styleImage(const Document&);
+    std::pair<CachedImage*, float> loadImage(CachedResourceLoader&, const ResourceLoaderOptions&);
 
     void removeReferencedElement(SVGElement*);
 

Modified: trunk/Source/WebCore/css/CSSImageGeneratorValue.cpp (205418 => 205419)


--- trunk/Source/WebCore/css/CSSImageGeneratorValue.cpp	2016-09-04 07:10:53 UTC (rev 205418)
+++ trunk/Source/WebCore/css/CSSImageGeneratorValue.cpp	2016-09-04 13:42:42 UTC (rev 205419)
@@ -252,8 +252,7 @@
 {
     if (is<CSSImageValue>(value)) {
         auto& imageValue = downcast<CSSImageValue>(value);
-        imageValue.loadImage(cachedResourceLoader, options);
-        return imageValue.styleImage().cachedImage();
+        return imageValue.loadImage(cachedResourceLoader, options);
     }
     
     if (is<CSSImageGeneratorValue>(value)) {

Modified: trunk/Source/WebCore/css/CSSImageSetValue.cpp (205418 => 205419)


--- trunk/Source/WebCore/css/CSSImageSetValue.cpp	2016-09-04 07:10:53 UTC (rev 205418)
+++ trunk/Source/WebCore/css/CSSImageSetValue.cpp	2016-09-04 13:42:42 UTC (rev 205419)
@@ -35,7 +35,6 @@
 #include "CrossOriginAccessControl.h"
 #include "Document.h"
 #include "Page.h"
-#include "StyleCachedImage.h"
 #include <wtf/text/StringBuilder.h>
 
 namespace WebCore {
@@ -42,15 +41,11 @@
 
 CSSImageSetValue::CSSImageSetValue()
     : CSSValueList(ImageSetClass, CommaSeparator)
-    , m_accessedBestFitImage(false)
-    , m_scaleFactor(1)
 {
 }
 
 CSSImageSetValue::~CSSImageSetValue()
 {
-    if (m_image)
-        m_image->detachFromCSSValue();
 }
 
 void CSSImageSetValue::fillImageSet()
@@ -79,63 +74,51 @@
 
 CSSImageSetValue::ImageWithScale CSSImageSetValue::bestImageForScaleFactor()
 {
+    if (!m_imagesInSet.size())
+        fillImageSet();
+
     ImageWithScale image;
     size_t numberOfImages = m_imagesInSet.size();
     for (size_t i = 0; i < numberOfImages; ++i) {
         image = m_imagesInSet.at(i);
-        if (image.scaleFactor >= m_scaleFactor)
+        if (image.scaleFactor >= m_deviceScaleFactor)
             return image;
     }
     return image;
 }
 
-void CSSImageSetValue::loadBestFitImage(CachedResourceLoader& loader, const ResourceLoaderOptions& options)
+std::pair<CachedImage*, float> CSSImageSetValue::loadBestFitImage(CachedResourceLoader& loader, const ResourceLoaderOptions& options)
 {
     Document* document = loader.document();
-    if (Page* page = document->page())
-        m_scaleFactor = page->deviceScaleFactor();
-    else
-        m_scaleFactor = 1;
+    updateDeviceScaleFactor(*document);
+    
+    if (!m_accessedBestFitImage) {
+        m_accessedBestFitImage = true;
 
-    if (!m_imagesInSet.size())
-        fillImageSet();
-
-    if (m_accessedBestFitImage)
-        return;
-    // FIXME: In the future, we want to take much more than deviceScaleFactor into acount here.
-    // All forms of scale should be included: Page::pageScaleFactor(), Frame::pageZoomFactor(),
-    // and any CSS transforms. https://bugs.webkit.org/show_bug.cgi?id=81698
-    ImageWithScale image = bestImageForScaleFactor();
-    CachedResourceRequest request(ResourceRequest(document->completeURL(image.imageURL)), options);
-    request.setInitiator(cachedResourceRequestInitiators().css);
-    if (options.mode == FetchOptions::Mode::Cors) {
-        ASSERT(document->securityOrigin());
-        updateRequestForAccessControl(request.mutableResourceRequest(), *document->securityOrigin(), options.allowCredentials);
+        // FIXME: In the future, we want to take much more than deviceScaleFactor into acount here.
+        // All forms of scale should be included: Page::pageScaleFactor(), Frame::pageZoomFactor(),
+        // and any CSS transforms. https://bugs.webkit.org/show_bug.cgi?id=81698
+        ImageWithScale image = bestImageForScaleFactor();
+        CachedResourceRequest request(ResourceRequest(document->completeURL(image.imageURL)), options);
+        request.setInitiator(cachedResourceRequestInitiators().css);
+        if (options.mode == FetchOptions::Mode::Cors) {
+            ASSERT(document->securityOrigin());
+            updateRequestForAccessControl(request.mutableResourceRequest(), *document->securityOrigin(), options.allowCredentials);
+        }
+        m_cachedImage = loader.requestImage(request);
+        m_bestFitImageScaleFactor = image.scaleFactor;
     }
-    if (CachedResourceHandle<CachedImage> cachedImage = loader.requestImage(request)) {
-        styleImage(*document).setCachedImage(*cachedImage, image.scaleFactor);
-        m_accessedBestFitImage = true;
-    }
+    return { m_cachedImage.get(), m_bestFitImageScaleFactor };
 }
 
-StyleCachedImage& CSSImageSetValue::styleImage(const Document& document)
+void CSSImageSetValue::updateDeviceScaleFactor(const Document& document)
 {
-    if (!m_image)
-        m_image = StyleCachedImage::create(*this);
-    else if (!m_image->isPending()) {
-        float deviceScaleFactor = 1;
-        if (Page* page = document.page())
-            deviceScaleFactor = page->deviceScaleFactor();
-
-        // If the deviceScaleFactor has changed, we may not have the best image loaded, so we have to re-assess.
-        if (deviceScaleFactor != m_scaleFactor) {
-            m_accessedBestFitImage = false;
-            m_image->detachFromCSSValue();
-            m_image = StyleCachedImage::create(*this);
-        }
-    }
-
-    return *m_image;
+    float deviceScaleFactor = document.page() ? document.page()->deviceScaleFactor() : 1;
+    if (deviceScaleFactor == m_deviceScaleFactor)
+        return;
+    m_deviceScaleFactor = deviceScaleFactor;
+    m_accessedBestFitImage = false;
+    m_cachedImage = nullptr;
 }
 
 String CSSImageSetValue::customCSSText() const
@@ -170,18 +153,13 @@
 
 bool CSSImageSetValue::traverseSubresources(const std::function<bool (const CachedResource&)>& handler) const
 {
-    if (!m_image)
+    if (!m_cachedImage)
         return false;
-    CachedImage* cachedResource = m_image->cachedImage();
-    if (!cachedResource)
-        return false;
-    return handler(*cachedResource);
+    return handler(*m_cachedImage);
 }
 
 CSSImageSetValue::CSSImageSetValue(const CSSImageSetValue& cloneFrom)
     : CSSValueList(cloneFrom)
-    , m_accessedBestFitImage(false)
-    , m_scaleFactor(1)
 {
     // Non-CSSValueList data is not accessible through CSS OM, no need to clone.
 }

Modified: trunk/Source/WebCore/css/CSSImageSetValue.h (205418 => 205419)


--- trunk/Source/WebCore/css/CSSImageSetValue.h	2016-09-04 07:10:53 UTC (rev 205418)
+++ trunk/Source/WebCore/css/CSSImageSetValue.h	2016-09-04 13:42:42 UTC (rev 205419)
@@ -27,18 +27,17 @@
 #define CSSImageSetValue_h
 
 #include "CSSValueList.h"
+#include "CachedImageClient.h"
+#include "CachedResourceHandle.h"
 
 namespace WebCore {
 
 class CachedResourceLoader;
 class Document;
-class StyleCachedImage;
-class StyleImage;
 struct ResourceLoaderOptions;
 
 class CSSImageSetValue final : public CSSValueList {
 public:
-
     static Ref<CSSImageSetValue> create()
     {
         return adoptRef(*new CSSImageSetValue());
@@ -45,13 +44,11 @@
     }
     ~CSSImageSetValue();
 
-    void loadBestFitImage(CachedResourceLoader&, const ResourceLoaderOptions&);
-    StyleCachedImage& styleImage(const Document&);
+    std::pair<CachedImage*, float>  loadBestFitImage(CachedResourceLoader&, const ResourceLoaderOptions&);
+    CachedImage* cachedImage() const { return m_cachedImage.get(); }
 
     String customCSSText() const;
 
-    bool isPending() const { return !m_accessedBestFitImage; }
-
     struct ImageWithScale {
         String imageURL;
         float scaleFactor;
@@ -61,6 +58,8 @@
 
     Ref<CSSImageSetValue> cloneForCSSOM() const;
 
+    void updateDeviceScaleFactor(const Document&);
+
 protected:
     ImageWithScale bestImageForScaleFactor();
 
@@ -71,13 +70,11 @@
     void fillImageSet();
     static inline bool compareByScaleFactor(ImageWithScale first, ImageWithScale second) { return first.scaleFactor < second.scaleFactor; }
 
-    RefPtr<StyleCachedImage> m_image;
-    bool m_accessedBestFitImage;
+    CachedResourceHandle<CachedImage> m_cachedImage;
+    bool m_accessedBestFitImage { false };
+    float m_bestFitImageScaleFactor { 1 };
+    float m_deviceScaleFactor { 1 };
 
-    // This represents the scale factor that we used to find the best fit image. It does not necessarily
-    // correspond to the scale factor of the best fit image.
-    float m_scaleFactor;
-
     Vector<ImageWithScale> m_imagesInSet;
 };
 

Modified: trunk/Source/WebCore/css/CSSImageValue.cpp (205418 => 205419)


--- trunk/Source/WebCore/css/CSSImageValue.cpp	2016-09-04 07:10:53 UTC (rev 205418)
+++ trunk/Source/WebCore/css/CSSImageValue.cpp	2016-09-04 13:42:42 UTC (rev 205419)
@@ -32,7 +32,6 @@
 #include "Document.h"
 #include "Element.h"
 #include "MemoryCache.h"
-#include "StyleCachedImage.h"
 
 namespace WebCore {
 
@@ -46,60 +45,46 @@
 CSSImageValue::CSSImageValue(CachedImage& image)
     : CSSValue(ImageClass)
     , m_url(image.url())
-    , m_image(StyleCachedImage::create(*this))
+    , m_cachedImage(&image)
     , m_accessedImage(true)
 {
-    m_image->setCachedImage(image);
 }
 
 
 CSSImageValue::~CSSImageValue()
 {
-    if (m_image)
-        m_image->detachFromCSSValue();
 }
 
 bool CSSImageValue::isPending() const
 {
-    return !m_image || !m_image->cachedImage();
+    return !m_accessedImage;
 }
 
-StyleCachedImage& CSSImageValue::styleImage()
+CachedImage* CSSImageValue::loadImage(CachedResourceLoader& loader, const ResourceLoaderOptions& options)
 {
-    if (!m_image)
-        m_image = StyleCachedImage::create(*this);
+    if (!m_accessedImage) {
+        m_accessedImage = true;
 
-    return *m_image;
-}
+        CachedResourceRequest request(ResourceRequest(loader.document()->completeURL(m_url)), options);
+        if (m_initiatorName.isEmpty())
+            request.setInitiator(cachedResourceRequestInitiators().css);
+        else
+            request.setInitiator(m_initiatorName);
 
-void CSSImageValue::loadImage(CachedResourceLoader& loader, const ResourceLoaderOptions& options)
-{
-    if (m_accessedImage)
-        return;
-    m_accessedImage = true;
-
-    CachedResourceRequest request(ResourceRequest(loader.document()->completeURL(m_url)), options);
-    if (m_initiatorName.isEmpty())
-        request.setInitiator(cachedResourceRequestInitiators().css);
-    else
-        request.setInitiator(m_initiatorName);
-
-    if (options.mode == FetchOptions::Mode::Cors) {
-        ASSERT(loader.document()->securityOrigin());
-        updateRequestForAccessControl(request.mutableResourceRequest(), *loader.document()->securityOrigin(), options.allowCredentials);
+        if (options.mode == FetchOptions::Mode::Cors) {
+            ASSERT(loader.document()->securityOrigin());
+            updateRequestForAccessControl(request.mutableResourceRequest(), *loader.document()->securityOrigin(), options.allowCredentials);
+        }
+        m_cachedImage = loader.requestImage(request);
     }
-    if (CachedResourceHandle<CachedImage> cachedImage = loader.requestImage(request))
-        styleImage().setCachedImage(*cachedImage);
+    return m_cachedImage.get();
 }
 
 bool CSSImageValue::traverseSubresources(const std::function<bool (const CachedResource&)>& handler) const
 {
-    if (!m_image)
+    if (!m_cachedImage)
         return false;
-    CachedResource* cachedResource = m_image->cachedImage();
-    if (!cachedResource)
-        return false;
-    return handler(*cachedResource);
+    return handler(*m_cachedImage);
 }
 
 bool CSSImageValue::equals(const CSSImageValue& other) const
@@ -122,7 +107,9 @@
 
 bool CSSImageValue::knownToBeOpaque(const RenderElement* renderer) const
 {
-    return m_image ? m_image->knownToBeOpaque(renderer) : false;
+    if (!m_cachedImage)
+        return false;
+    return m_cachedImage->currentFrameKnownToBeOpaque(renderer);
 }
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/css/CSSImageValue.h (205418 => 205419)


--- trunk/Source/WebCore/css/CSSImageValue.h	2016-09-04 07:10:53 UTC (rev 205418)
+++ trunk/Source/WebCore/css/CSSImageValue.h	2016-09-04 13:42:42 UTC (rev 205419)
@@ -22,6 +22,7 @@
 #define CSSImageValue_h
 
 #include "CSSValue.h"
+#include "CachedResourceHandle.h"
 #include <wtf/RefPtr.h>
 
 namespace WebCore {
@@ -29,7 +30,6 @@
 class CachedImage;
 class CachedResourceLoader;
 class Element;
-class StyleCachedImage;
 class RenderElement;
 struct ResourceLoaderOptions;
 
@@ -40,8 +40,8 @@
     ~CSSImageValue();
 
     bool isPending() const;
-    void loadImage(CachedResourceLoader&, const ResourceLoaderOptions&);
-    StyleCachedImage& styleImage();
+    CachedImage* loadImage(CachedResourceLoader&, const ResourceLoaderOptions&);
+    CachedImage* cachedImage() const { return m_cachedImage.get(); }
 
     const String& url() const { return m_url; }
 
@@ -62,7 +62,7 @@
     explicit CSSImageValue(CachedImage&);
 
     String m_url;
-    RefPtr<StyleCachedImage> m_image;
+    CachedResourceHandle<CachedImage> m_cachedImage;
     bool m_accessedImage;
     AtomicString m_initiatorName;
 };

Modified: trunk/Source/WebCore/css/StyleBuilderCustom.h (205418 => 205419)


--- trunk/Source/WebCore/css/StyleBuilderCustom.h	2016-09-04 07:10:53 UTC (rev 205418)
+++ trunk/Source/WebCore/css/StyleBuilderCustom.h	2016-09-04 13:42:42 UTC (rev 205419)
@@ -46,6 +46,7 @@
 #include "SVGElement.h"
 #include "SVGRenderStyle.h"
 #include "StyleBuilderConverter.h"
+#include "StyleCachedImage.h"
 #include "StyleFontSizeFunctions.h"
 #include "StyleGeneratedImage.h"
 #include "StyleResolver.h"
@@ -1313,12 +1314,12 @@
                 styleResolver.style()->setContent(StyleGeneratedImage::create(downcast<CSSImageGeneratorValue>(item.get())), didSet);
             didSet = true;
         } else if (is<CSSImageSetValue>(item.get())) {
-            styleResolver.style()->setContent(styleResolver.setOrPendingFromValue(CSSPropertyContent, downcast<CSSImageSetValue>(item.get())), didSet);
+            styleResolver.style()->setContent(styleResolver.styleCachedImageFromValue(CSSPropertyContent, item), didSet);
             didSet = true;
         }
 
         if (is<CSSImageValue>(item.get())) {
-            styleResolver.style()->setContent(styleResolver.cachedOrPendingFromValue(CSSPropertyContent, downcast<CSSImageValue>(item.get())), didSet);
+            styleResolver.style()->setContent(styleResolver.styleCachedImageFromValue(CSSPropertyContent, item), didSet);
             didSet = true;
             continue;
         }

Modified: trunk/Source/WebCore/css/StyleResolver.cpp (205418 => 205419)


--- trunk/Source/WebCore/css/StyleResolver.cpp	2016-09-04 07:10:53 UTC (rev 205418)
+++ trunk/Source/WebCore/css/StyleResolver.cpp	2016-09-04 13:42:42 UTC (rev 205419)
@@ -1702,33 +1702,27 @@
 
 RefPtr<StyleImage> StyleResolver::styleImage(CSSPropertyID property, CSSValue& value)
 {
-    if (is<CSSImageValue>(value))
-        return cachedOrPendingFromValue(property, downcast<CSSImageValue>(value));
-
     if (is<CSSImageGeneratorValue>(value)) {
         if (is<CSSGradientValue>(value))
-            return generatedOrPendingFromValue(property, *downcast<CSSGradientValue>(value).gradientWithStylesResolved(this));
-        return generatedOrPendingFromValue(property, downcast<CSSImageGeneratorValue>(value));
+            return styleGeneratedImageFromValue(property, *downcast<CSSGradientValue>(value).gradientWithStylesResolved(this));
+        return styleGeneratedImageFromValue(property, downcast<CSSImageGeneratorValue>(value));
     }
 
-    if (is<CSSImageSetValue>(value))
-        return setOrPendingFromValue(property, downcast<CSSImageSetValue>(value));
+    if (is<CSSImageValue>(value) || is<CSSImageSetValue>(value) || is<CSSCursorImageValue>(value))
+        return styleCachedImageFromValue(property, value);
 
-    if (is<CSSCursorImageValue>(value))
-        return cursorOrPendingFromValue(property, downcast<CSSCursorImageValue>(value));
-
     return nullptr;
 }
 
-Ref<StyleImage> StyleResolver::cachedOrPendingFromValue(CSSPropertyID property, CSSImageValue& value)
+Ref<StyleCachedImage> StyleResolver::styleCachedImageFromValue(CSSPropertyID property, CSSValue& value)
 {
-    Ref<StyleImage> image = value.styleImage();
+    auto image = StyleCachedImage::create(value);
     if (image->isPending())
         m_state.ensurePendingResources().pendingImages.set(property, &value);
     return image;
 }
 
-Ref<StyleImage> StyleResolver::generatedOrPendingFromValue(CSSPropertyID property, CSSImageGeneratorValue& value)
+Ref<StyleGeneratedImage> StyleResolver::styleGeneratedImageFromValue(CSSPropertyID property, CSSImageGeneratorValue& value)
 {
     if (is<CSSFilterImageValue>(value)) {
         // FilterImage needs to calculate FilterOperations.
@@ -1740,22 +1734,6 @@
     return StyleGeneratedImage::create(value);
 }
 
-RefPtr<StyleImage> StyleResolver::setOrPendingFromValue(CSSPropertyID property, CSSImageSetValue& value)
-{
-    auto& image = value.styleImage(document());
-    if (image.isPending())
-        m_state.ensurePendingResources().pendingImages.set(property, &value);
-    return &image;
-}
-
-RefPtr<StyleImage> StyleResolver::cursorOrPendingFromValue(CSSPropertyID property, CSSCursorImageValue& value)
-{
-    auto& image = value.styleImage(document());
-    if (image.isPending())
-        m_state.ensurePendingResources().pendingImages.set(property, &value);
-    return &image;
-}
-
 #if ENABLE(IOS_TEXT_AUTOSIZING)
 void StyleResolver::checkForTextSizeAdjust(RenderStyle* style)
 {

Modified: trunk/Source/WebCore/css/StyleResolver.h (205418 => 205419)


--- trunk/Source/WebCore/css/StyleResolver.h	2016-09-04 07:10:53 UTC (rev 205418)
+++ trunk/Source/WebCore/css/StyleResolver.h	2016-09-04 13:42:42 UTC (rev 205419)
@@ -72,6 +72,8 @@
 class RuleSet;
 class SelectorFilter;
 class Settings;
+class StyleCachedImage;
+class StyleGeneratedImage;
 class StyleImage;
 class StyleKeyframe;
 class StylePendingImage;
@@ -458,10 +460,8 @@
     const State& state() const { return m_state; }
 
     RefPtr<StyleImage> styleImage(CSSPropertyID, CSSValue&);
-    Ref<StyleImage> cachedOrPendingFromValue(CSSPropertyID, CSSImageValue&);
-    Ref<StyleImage> generatedOrPendingFromValue(CSSPropertyID, CSSImageGeneratorValue&);
-    RefPtr<StyleImage> setOrPendingFromValue(CSSPropertyID, CSSImageSetValue&);
-    RefPtr<StyleImage> cursorOrPendingFromValue(CSSPropertyID, CSSCursorImageValue&);
+    Ref<StyleCachedImage> styleCachedImageFromValue(CSSPropertyID, CSSValue&);
+    Ref<StyleGeneratedImage> styleGeneratedImageFromValue(CSSPropertyID, CSSImageGeneratorValue&);
 
     bool applyPropertyToRegularStyle() const { return m_state.applyPropertyToRegularStyle(); }
     bool applyPropertyToVisitedLinkStyle() const { return m_state.applyPropertyToVisitedLinkStyle(); }

Modified: trunk/Source/WebCore/page/PageSerializer.cpp (205418 => 205419)


--- trunk/Source/WebCore/page/PageSerializer.cpp	2016-09-04 07:10:53 UTC (rev 205418)
+++ trunk/Source/WebCore/page/PageSerializer.cpp	2016-09-04 13:42:42 UTC (rev 205419)
@@ -331,9 +331,7 @@
         if (!is<CSSImageValue>(*cssValue))
             continue;
 
-        auto& styleImage = downcast<CSSImageValue>(*cssValue).styleImage();
-
-        auto* image = styleImage.cachedImage();
+        auto* image = downcast<CSSImageValue>(*cssValue).cachedImage();
         if (!image)
             continue;
 

Modified: trunk/Source/WebCore/rendering/style/FillLayer.cpp (205418 => 205419)


--- trunk/Source/WebCore/rendering/style/FillLayer.cpp	2016-09-04 07:10:53 UTC (rev 205418)
+++ trunk/Source/WebCore/rendering/style/FillLayer.cpp	2016-09-04 13:42:42 UTC (rev 205419)
@@ -380,16 +380,10 @@
     return false;
 }
 
-static inline bool layerImagesIdentical(const FillLayer& layer1, const FillLayer& layer2)
-{
-    // We just care about pointer equivalency.
-    return layer1.image() == layer2.image();
-}
-
 bool FillLayer::imagesIdentical(const FillLayer* layer1, const FillLayer* layer2)
 {
     for (; layer1 && layer2; layer1 = layer1->next(), layer2 = layer2->next()) {
-        if (!layerImagesIdentical(*layer1, *layer2))
+        if (!arePointingToEqualData(layer1->image(), layer2->image()))
             return false;
     }
 

Modified: trunk/Source/WebCore/rendering/style/StyleCachedImage.cpp (205418 => 205419)


--- trunk/Source/WebCore/rendering/style/StyleCachedImage.cpp	2016-09-04 07:10:53 UTC (rev 205418)
+++ trunk/Source/WebCore/rendering/style/StyleCachedImage.cpp	2016-09-04 13:42:42 UTC (rev 205419)
@@ -2,7 +2,7 @@
  * Copyright (C) 2000 Lars Knoll (kn...@kde.org)
  *           (C) 2000 Antti Koivisto (koivi...@kde.org)
  *           (C) 2000 Dirk Mueller (muel...@kde.org)
- * Copyright (C) 2003, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2003, 2005-2008, 2016 Apple Inc. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -24,7 +24,9 @@
 #include "config.h"
 #include "StyleCachedImage.h"
 
+#include "CSSCursorImageValue.h"
 #include "CSSImageSetValue.h"
+#include "CSSImageValue.h"
 #include "CachedImage.h"
 #include "RenderElement.h"
 
@@ -31,63 +33,97 @@
 namespace WebCore {
 
 StyleCachedImage::StyleCachedImage(CSSValue& cssValue)
-    : m_cssValue(&cssValue)
+    : m_cssValue(cssValue)
 {
+    ASSERT(is<CSSImageValue>(m_cssValue) || is<CSSImageSetValue>(m_cssValue) || is<CSSCursorImageValue>(m_cssValue));
+
     m_isCachedImage = true;
 }
 
 StyleCachedImage::~StyleCachedImage()
 {
-    if (m_image)
-        m_image->removeClient(this);
 }
 
-void StyleCachedImage::setCachedImage(CachedImage& image, float scaleFactor)
+bool StyleCachedImage::operator==(const StyleImage& other) const
 {
-    ASSERT(!m_image);
-    m_image = &image;
-    m_image->addClient(this);
-    m_scaleFactor = scaleFactor;
+    if (!is<StyleCachedImage>(other))
+        return false;
+    auto& otherCached = downcast<StyleCachedImage>(other);
+    if (&otherCached == this)
+        return true;
+    if (m_scaleFactor != otherCached.m_scaleFactor)
+        return false;
+    if (m_cssValue.ptr() == otherCached.m_cssValue.ptr())
+        return true;
+    if (m_cachedImage && m_cachedImage == otherCached.m_cachedImage)
+        return true;
+    return false;
 }
 
+void StyleCachedImage::load(CachedResourceLoader& loader, const ResourceLoaderOptions& options)
+{
+    ASSERT(isPending());
+
+    if (is<CSSImageValue>(m_cssValue)) {
+        auto& imageValue = downcast<CSSImageValue>(m_cssValue.get());
+        m_cachedImage = imageValue.loadImage(loader, options);
+        return;
+    }
+
+    if (is<CSSImageSetValue>(m_cssValue)) {
+        auto& imageSetValue = downcast<CSSImageSetValue>(m_cssValue.get());
+        std::tie(m_cachedImage, m_scaleFactor) = imageSetValue.loadBestFitImage(loader, options);
+        return;
+    }
+
+    if (is<CSSCursorImageValue>(m_cssValue.get())) {
+        auto& cursorValue = downcast<CSSCursorImageValue>(m_cssValue.get());
+        std::tie(m_cachedImage, m_scaleFactor) = cursorValue.loadImage(loader, options);
+        return;
+    }
+}
+
+CachedImage* StyleCachedImage::cachedImage() const
+{
+    return m_cachedImage.get();
+}
+
 PassRefPtr<CSSValue> StyleCachedImage::cssValue() const
 {
-    if (m_cssValue)
-        return m_cssValue;
-    return CSSPrimitiveValue::create(m_image->url(), CSSPrimitiveValue::CSS_URI);
+    return const_cast<CSSValue*>(m_cssValue.ptr());
 }
 
 bool StyleCachedImage::canRender(const RenderObject* renderer, float multiplier) const
 {
-    if (!m_image)
+    if (!m_cachedImage)
         return false;
-    return m_image->canRender(renderer, multiplier);
+    return m_cachedImage->canRender(renderer, multiplier);
 }
 
 bool StyleCachedImage::isPending() const
 {
-    return !m_image;
+    return !m_cachedImage;
 }
 
 bool StyleCachedImage::isLoaded() const
 {
-    if (!m_image)
+    if (!m_cachedImage)
         return false;
-    return m_image->isLoaded();
+    return m_cachedImage->isLoaded();
 }
 
 bool StyleCachedImage::errorOccurred() const
 {
-    if (!m_image)
+    if (!m_cachedImage)
         return false;
-    return m_image->errorOccurred();
+    return m_cachedImage->errorOccurred();
 }
 
 FloatSize StyleCachedImage::imageSize(const RenderElement* renderer, float multiplier) const
 {
-    if (!m_image)
+    if (!m_cachedImage)
         return { };
-    FloatSize size = m_image->imageSizeForRenderer(renderer, multiplier);
+    FloatSize size = m_cachedImage->imageSizeForRenderer(renderer, multiplier);
     size.scale(1 / m_scaleFactor);
     return size;
 }
@@ -94,58 +130,58 @@
 
 bool StyleCachedImage::imageHasRelativeWidth() const
 {
-    if (!m_image)
+    if (!m_cachedImage)
         return false;
-    return m_image->imageHasRelativeWidth();
+    return m_cachedImage->imageHasRelativeWidth();
 }
 
 bool StyleCachedImage::imageHasRelativeHeight() const
 {
-    if (!m_image)
+    if (!m_cachedImage)
         return false;
-    return m_image->imageHasRelativeHeight();
+    return m_cachedImage->imageHasRelativeHeight();
 }
 
 void StyleCachedImage::computeIntrinsicDimensions(const RenderElement*, Length& intrinsicWidth, Length& intrinsicHeight, FloatSize& intrinsicRatio)
 {
-    if (!m_image)
+    if (!m_cachedImage)
         return;
-    m_image->computeIntrinsicDimensions(intrinsicWidth, intrinsicHeight, intrinsicRatio);
+    m_cachedImage->computeIntrinsicDimensions(intrinsicWidth, intrinsicHeight, intrinsicRatio);
 }
 
 bool StyleCachedImage::usesImageContainerSize() const
 {
-    if (!m_image)
+    if (!m_cachedImage)
         return false;
-    return m_image->usesImageContainerSize();
+    return m_cachedImage->usesImageContainerSize();
 }
 
 void StyleCachedImage::setContainerSizeForRenderer(const RenderElement* renderer, const FloatSize& imageContainerSize, float imageContainerZoomFactor)
 {
-    if (!m_image)
+    if (!m_cachedImage)
         return;
-    m_image->setContainerSizeForRenderer(renderer, LayoutSize(imageContainerSize), imageContainerZoomFactor);
+    m_cachedImage->setContainerSizeForRenderer(renderer, LayoutSize(imageContainerSize), imageContainerZoomFactor);
 }
 
 void StyleCachedImage::addClient(RenderElement* renderer)
 {
-    if (!m_image)
+    if (!m_cachedImage)
         return;
-    m_image->addClient(renderer);
+    m_cachedImage->addClient(renderer);
 }
 
 void StyleCachedImage::removeClient(RenderElement* renderer)
 {
-    if (!m_image)
+    if (!m_cachedImage)
         return;
-    m_image->removeClient(renderer);
+    m_cachedImage->removeClient(renderer);
 }
 
 RefPtr<Image> StyleCachedImage::image(RenderElement* renderer, const FloatSize&) const
 {
-    if (!m_image)
+    if (!m_cachedImage)
         return nullptr;
-    return m_image->imageForRenderer(renderer);
+    return m_cachedImage->imageForRenderer(renderer);
 }
 
 float StyleCachedImage::imageScaleFactor() const
@@ -155,9 +191,9 @@
 
 bool StyleCachedImage::knownToBeOpaque(const RenderElement* renderer) const
 {
-    if (!m_image)
+    if (!m_cachedImage)
         return false;
-    return m_image->currentFrameKnownToBeOpaque(renderer);
+    return m_cachedImage->currentFrameKnownToBeOpaque(renderer);
 }
 
 }

Modified: trunk/Source/WebCore/rendering/style/StyleCachedImage.h (205418 => 205419)


--- trunk/Source/WebCore/rendering/style/StyleCachedImage.h	2016-09-04 07:10:53 UTC (rev 205418)
+++ trunk/Source/WebCore/rendering/style/StyleCachedImage.h	2016-09-04 13:42:42 UTC (rev 205419)
@@ -32,26 +32,25 @@
 
 class CSSValue;
 class CachedImage;
+class Document;
 
-class StyleCachedImage final : public StyleImage, private CachedImageClient {
+class StyleCachedImage final : public StyleImage {
     WTF_MAKE_FAST_ALLOCATED;
 public:
     static Ref<StyleCachedImage> create(CSSValue& cssValue) { return adoptRef(*new StyleCachedImage(cssValue)); }
     virtual ~StyleCachedImage();
 
-    CachedImage* cachedImage() const override { return m_image.get(); }
+    bool operator==(const StyleImage& other) const override;
 
-    void detachFromCSSValue() { m_cssValue = nullptr; }
-    void setCSSValue(CSSValue& value) { m_cssValue = &value; }
+    CachedImage* cachedImage() const override;
 
-    void setCachedImage(CachedImage&, float scaleFactor = 1);
+    WrappedImagePtr data() const override { return m_cachedImage.get(); }
 
-    WrappedImagePtr data() const override { return m_image.get(); }
-
     PassRefPtr<CSSValue> cssValue() const override;
     
     bool canRender(const RenderObject*, float multiplier) const override;
     bool isPending() const override;
+    void load(CachedResourceLoader&, const ResourceLoaderOptions&) override;
     bool isLoaded() const override;
     bool errorOccurred() const override;
     FloatSize imageSize(const RenderElement*, float multiplier) const override;
@@ -69,9 +68,9 @@
 private:
     StyleCachedImage(CSSValue&);
 
-    CSSValue* m_cssValue;
-    float m_scaleFactor { 1 };
-    CachedResourceHandle<CachedImage> m_image;
+    Ref<CSSValue> m_cssValue;
+    mutable float m_scaleFactor { 1 };
+    mutable CachedResourceHandle<CachedImage> m_cachedImage;
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/rendering/style/StyleGeneratedImage.cpp (205418 => 205419)


--- trunk/Source/WebCore/rendering/style/StyleGeneratedImage.cpp	2016-09-04 07:10:53 UTC (rev 205418)
+++ trunk/Source/WebCore/rendering/style/StyleGeneratedImage.cpp	2016-09-04 13:42:42 UTC (rev 205419)
@@ -47,6 +47,11 @@
     return m_imageGeneratorValue->isPending();
 }
 
+void StyleGeneratedImage::load(CachedResourceLoader& loader, const ResourceLoaderOptions& options)
+{
+    m_imageGeneratorValue->loadSubimages(loader, options);
+}
+
 FloatSize StyleGeneratedImage::imageSize(const RenderElement* renderer, float multiplier) const
 {
     if (m_fixedSize) {

Modified: trunk/Source/WebCore/rendering/style/StyleGeneratedImage.h (205418 => 205419)


--- trunk/Source/WebCore/rendering/style/StyleGeneratedImage.h	2016-09-04 07:10:53 UTC (rev 205418)
+++ trunk/Source/WebCore/rendering/style/StyleGeneratedImage.h	2016-09-04 13:42:42 UTC (rev 205419)
@@ -41,11 +41,14 @@
     CSSImageGeneratorValue& imageValue() { return m_imageGeneratorValue; }
 
 private:
+    bool operator==(const StyleImage& other) const override { return data() == other.data(); }
+
     WrappedImagePtr data() const override { return m_imageGeneratorValue.ptr(); }
 
     PassRefPtr<CSSValue> cssValue() const override;
 
     bool isPending() const override;
+    void load(CachedResourceLoader&, const ResourceLoaderOptions&) override;
     FloatSize imageSize(const RenderElement*, float multiplier) const override;
     bool imageHasRelativeWidth() const override { return !m_fixedSize; }
     bool imageHasRelativeHeight() const override { return !m_fixedSize; }

Modified: trunk/Source/WebCore/rendering/style/StyleImage.h (205418 => 205419)


--- trunk/Source/WebCore/rendering/style/StyleImage.h	2016-09-04 07:10:53 UTC (rev 205418)
+++ trunk/Source/WebCore/rendering/style/StyleImage.h	2016-09-04 13:42:42 UTC (rev 205419)
@@ -35,9 +35,11 @@
 namespace WebCore {
 
 class CachedImage;
+class CachedResourceLoader;
 class CSSValue;
 class RenderElement;
 class RenderObject;
+struct ResourceLoaderOptions;
 
 typedef const void* WrappedImagePtr;
 
@@ -45,15 +47,13 @@
 public:
     virtual ~StyleImage() { }
 
-    bool operator==(const StyleImage& other) const
-    {
-        return &other == this || (data() && data() == other.data());
-    }
+    virtual bool operator==(const StyleImage& other) const = 0;
 
     virtual PassRefPtr<CSSValue> cssValue() const = 0;
 
     virtual bool canRender(const RenderObject*, float /*multiplier*/) const { return true; }
     virtual bool isPending() const = 0;
+    virtual void load(CachedResourceLoader&, const ResourceLoaderOptions&) = 0;
     virtual bool isLoaded() const { return true; }
     virtual bool errorOccurred() const { return false; }
     virtual FloatSize imageSize(const RenderElement*, float multiplier) const = 0;

Modified: trunk/Source/WebCore/style/StylePendingResources.cpp (205418 => 205419)


--- trunk/Source/WebCore/style/StylePendingResources.cpp	2016-09-04 07:10:53 UTC (rev 205418)
+++ trunk/Source/WebCore/style/StylePendingResources.cpp	2016-09-04 13:42:42 UTC (rev 205419)
@@ -27,9 +27,6 @@
 #include "StylePendingResources.h"
 
 #include "CSSCursorImageValue.h"
-#include "CSSImageGeneratorValue.h"
-#include "CSSImageSetValue.h"
-#include "CSSImageValue.h"
 #include "CachedResourceLoader.h"
 #include "CachedSVGDocumentReference.h"
 #include "ContentData.h"
@@ -60,26 +57,7 @@
         options.allowCredentials = DoNotAllowStoredCredentials;
     }
 
-    auto cssValue = const_cast<StyleImage*>(styleImage)->cssValue();
-    if (is<CSSImageValue>(cssValue.get())) {
-        downcast<CSSImageValue>(*cssValue).loadImage(document.cachedResourceLoader(), options);
-        return;
-    };
-
-    if (is<CSSImageSetValue>(cssValue.get())) {
-        downcast<CSSImageSetValue>(*cssValue).loadBestFitImage(document.cachedResourceLoader(), options);
-        return;
-    };
-
-    if (is<CSSImageGeneratorValue>(cssValue.get())) {
-        downcast<CSSImageGeneratorValue>(*cssValue).loadSubimages(document.cachedResourceLoader(), options);
-        return;
-    };
-
-    if (is<CSSCursorImageValue>(cssValue.get())) {
-        downcast<CSSCursorImageValue>(*cssValue).loadImage(document.cachedResourceLoader(), options);
-        return;
-    };
+    const_cast<StyleImage&>(*styleImage).load(document.cachedResourceLoader(), options);
 }
 
 static void loadPendingImages(const PendingResources& pendingResources, Document& document, RenderStyle& style, const Element* element)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to