<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[205419] trunk/Source/WebCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/205419">205419</a></dd>
<dt>Author</dt> <dd>antti@apple.com</dd>
<dt>Date</dt> <dd>2016-09-04 06:42:42 -0700 (Sun, 04 Sep 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>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:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorecssCSSCursorImageValuecpp">trunk/Source/WebCore/css/CSSCursorImageValue.cpp</a></li>
<li><a href="#trunkSourceWebCorecssCSSCursorImageValueh">trunk/Source/WebCore/css/CSSCursorImageValue.h</a></li>
<li><a href="#trunkSourceWebCorecssCSSImageGeneratorValuecpp">trunk/Source/WebCore/css/CSSImageGeneratorValue.cpp</a></li>
<li><a href="#trunkSourceWebCorecssCSSImageSetValuecpp">trunk/Source/WebCore/css/CSSImageSetValue.cpp</a></li>
<li><a href="#trunkSourceWebCorecssCSSImageSetValueh">trunk/Source/WebCore/css/CSSImageSetValue.h</a></li>
<li><a href="#trunkSourceWebCorecssCSSImageValuecpp">trunk/Source/WebCore/css/CSSImageValue.cpp</a></li>
<li><a href="#trunkSourceWebCorecssCSSImageValueh">trunk/Source/WebCore/css/CSSImageValue.h</a></li>
<li><a href="#trunkSourceWebCorecssStyleBuilderCustomh">trunk/Source/WebCore/css/StyleBuilderCustom.h</a></li>
<li><a href="#trunkSourceWebCorecssStyleResolvercpp">trunk/Source/WebCore/css/StyleResolver.cpp</a></li>
<li><a href="#trunkSourceWebCorecssStyleResolverh">trunk/Source/WebCore/css/StyleResolver.h</a></li>
<li><a href="#trunkSourceWebCorepagePageSerializercpp">trunk/Source/WebCore/page/PageSerializer.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingstyleFillLayercpp">trunk/Source/WebCore/rendering/style/FillLayer.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingstyleStyleCachedImagecpp">trunk/Source/WebCore/rendering/style/StyleCachedImage.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingstyleStyleCachedImageh">trunk/Source/WebCore/rendering/style/StyleCachedImage.h</a></li>
<li><a href="#trunkSourceWebCorerenderingstyleStyleGeneratedImagecpp">trunk/Source/WebCore/rendering/style/StyleGeneratedImage.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingstyleStyleGeneratedImageh">trunk/Source/WebCore/rendering/style/StyleGeneratedImage.h</a></li>
<li><a href="#trunkSourceWebCorerenderingstyleStyleImageh">trunk/Source/WebCore/rendering/style/StyleImage.h</a></li>
<li><a href="#trunkSourceWebCorestyleStylePendingResourcescpp">trunk/Source/WebCore/style/StylePendingResources.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (205418 => 205419)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -1,3 +1,85 @@
</span><ins>+2016-09-04  Antti Koivisto  &lt;antti@apple.com&gt;
+
+        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:
+
</ins><span class="cx"> 2016-09-03  Wenson Hsieh  &lt;wenson_hsieh@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Media controls behave strangely when videos mute from within a playing handler
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSCursorImageValuecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSCursorImageValue.cpp (205418 => 205419)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -26,8 +26,6 @@
</span><span class="cx"> #include &quot;CSSImageValue.h&quot;
</span><span class="cx"> #include &quot;CachedImage.h&quot;
</span><span class="cx"> #include &quot;CachedResourceLoader.h&quot;
</span><del>-#include &quot;StyleCachedImage.h&quot;
-#include &quot;StyleImage.h&quot;
</del><span class="cx"> #include &quot;SVGCursorElement.h&quot;
</span><span class="cx"> #include &quot;SVGLengthContext.h&quot;
</span><span class="cx"> #include &quot;SVGNames.h&quot;
</span><span class="lines">@@ -102,32 +100,17 @@
</span><span class="cx">     m_hotSpot.setY(static_cast&lt;int&gt;(y));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void CSSCursorImageValue::loadImage(CachedResourceLoader&amp; loader, const ResourceLoaderOptions&amp; options)
</del><ins>+std::pair&lt;CachedImage*, float&gt; CSSCursorImageValue::loadImage(CachedResourceLoader&amp; loader, const ResourceLoaderOptions&amp; options)
</ins><span class="cx"> {
</span><del>-    if (is&lt;CSSImageSetValue&gt;(m_imageValue.get())) {
-        downcast&lt;CSSImageSetValue&gt;(m_imageValue.get()).loadBestFitImage(loader, options);
-        return;
-    }
</del><ins>+    if (is&lt;CSSImageSetValue&gt;(m_imageValue.get()))
+        return downcast&lt;CSSImageSetValue&gt;(m_imageValue.get()).loadBestFitImage(loader, options);
</ins><span class="cx"> 
</span><del>-    downcast&lt;CSSImageValue&gt;(m_imageValue.get()).loadImage(loader, options);
-}
-
-StyleCachedImage&amp; CSSCursorImageValue::styleImage(const Document&amp; document)
-{
-    // Need to delegate completely so that changes in device scale factor can be handled appropriately.
-    StyleCachedImage* styleImage;
-    if (is&lt;CSSImageSetValue&gt;(m_imageValue.get()))
-        styleImage = &amp;downcast&lt;CSSImageSetValue&gt;(m_imageValue.get()).styleImage(document);
-    else {
-        if (auto* cursorElement = updateCursorElement(document)) {
-            if (cursorElement-&gt;href() != downcast&lt;CSSImageValue&gt;(m_imageValue.get()).url())
-                m_imageValue = CSSImageValue::create(cursorElement-&gt;href());
-        }
-        styleImage = &amp;downcast&lt;CSSImageValue&gt;(m_imageValue.get()).styleImage();
</del><ins>+    if (auto* cursorElement = updateCursorElement(*loader.document())) {
+        if (cursorElement-&gt;href() != downcast&lt;CSSImageValue&gt;(m_imageValue.get()).url())
+            m_imageValue = CSSImageValue::create(cursorElement-&gt;href());
</ins><span class="cx">     }
</span><del>-    styleImage-&gt;setCSSValue(*this);
</del><span class="cx"> 
</span><del>-    return *styleImage;
</del><ins>+    return { downcast&lt;CSSImageValue&gt;(m_imageValue.get()).loadImage(loader, options), 1 };
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool CSSCursorImageValue::equals(const CSSCursorImageValue&amp; other) const
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSCursorImageValueh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSCursorImageValue.h (205418 => 205419)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -31,7 +31,6 @@
</span><span class="cx"> class Element;
</span><span class="cx"> class SVGCursorElement;
</span><span class="cx"> class SVGElement;
</span><del>-class StyleCachedImage;
</del><span class="cx"> 
</span><span class="cx"> class CSSCursorImageValue final : public CSSValue {
</span><span class="cx"> public:
</span><span class="lines">@@ -53,8 +52,7 @@
</span><span class="cx"> 
</span><span class="cx">     String customCSSText() const;
</span><span class="cx"> 
</span><del>-    void loadImage(CachedResourceLoader&amp;, const ResourceLoaderOptions&amp;);
-    StyleCachedImage&amp; styleImage(const Document&amp;);
</del><ins>+    std::pair&lt;CachedImage*, float&gt; loadImage(CachedResourceLoader&amp;, const ResourceLoaderOptions&amp;);
</ins><span class="cx"> 
</span><span class="cx">     void removeReferencedElement(SVGElement*);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSImageGeneratorValuecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSImageGeneratorValue.cpp (205418 => 205419)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -252,8 +252,7 @@
</span><span class="cx"> {
</span><span class="cx">     if (is&lt;CSSImageValue&gt;(value)) {
</span><span class="cx">         auto&amp; imageValue = downcast&lt;CSSImageValue&gt;(value);
</span><del>-        imageValue.loadImage(cachedResourceLoader, options);
-        return imageValue.styleImage().cachedImage();
</del><ins>+        return imageValue.loadImage(cachedResourceLoader, options);
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     if (is&lt;CSSImageGeneratorValue&gt;(value)) {
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSImageSetValuecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSImageSetValue.cpp (205418 => 205419)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -35,7 +35,6 @@
</span><span class="cx"> #include &quot;CrossOriginAccessControl.h&quot;
</span><span class="cx"> #include &quot;Document.h&quot;
</span><span class="cx"> #include &quot;Page.h&quot;
</span><del>-#include &quot;StyleCachedImage.h&quot;
</del><span class="cx"> #include &lt;wtf/text/StringBuilder.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -42,15 +41,11 @@
</span><span class="cx"> 
</span><span class="cx"> CSSImageSetValue::CSSImageSetValue()
</span><span class="cx">     : CSSValueList(ImageSetClass, CommaSeparator)
</span><del>-    , m_accessedBestFitImage(false)
-    , m_scaleFactor(1)
</del><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> CSSImageSetValue::~CSSImageSetValue()
</span><span class="cx"> {
</span><del>-    if (m_image)
-        m_image-&gt;detachFromCSSValue();
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void CSSImageSetValue::fillImageSet()
</span><span class="lines">@@ -79,63 +74,51 @@
</span><span class="cx"> 
</span><span class="cx"> CSSImageSetValue::ImageWithScale CSSImageSetValue::bestImageForScaleFactor()
</span><span class="cx"> {
</span><ins>+    if (!m_imagesInSet.size())
+        fillImageSet();
+
</ins><span class="cx">     ImageWithScale image;
</span><span class="cx">     size_t numberOfImages = m_imagesInSet.size();
</span><span class="cx">     for (size_t i = 0; i &lt; numberOfImages; ++i) {
</span><span class="cx">         image = m_imagesInSet.at(i);
</span><del>-        if (image.scaleFactor &gt;= m_scaleFactor)
</del><ins>+        if (image.scaleFactor &gt;= m_deviceScaleFactor)
</ins><span class="cx">             return image;
</span><span class="cx">     }
</span><span class="cx">     return image;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void CSSImageSetValue::loadBestFitImage(CachedResourceLoader&amp; loader, const ResourceLoaderOptions&amp; options)
</del><ins>+std::pair&lt;CachedImage*, float&gt; CSSImageSetValue::loadBestFitImage(CachedResourceLoader&amp; loader, const ResourceLoaderOptions&amp; options)
</ins><span class="cx"> {
</span><span class="cx">     Document* document = loader.document();
</span><del>-    if (Page* page = document-&gt;page())
-        m_scaleFactor = page-&gt;deviceScaleFactor();
-    else
-        m_scaleFactor = 1;
</del><ins>+    updateDeviceScaleFactor(*document);
+    
+    if (!m_accessedBestFitImage) {
+        m_accessedBestFitImage = true;
</ins><span class="cx"> 
</span><del>-    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-&gt;completeURL(image.imageURL)), options);
-    request.setInitiator(cachedResourceRequestInitiators().css);
-    if (options.mode == FetchOptions::Mode::Cors) {
-        ASSERT(document-&gt;securityOrigin());
-        updateRequestForAccessControl(request.mutableResourceRequest(), *document-&gt;securityOrigin(), options.allowCredentials);
</del><ins>+        // 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-&gt;completeURL(image.imageURL)), options);
+        request.setInitiator(cachedResourceRequestInitiators().css);
+        if (options.mode == FetchOptions::Mode::Cors) {
+            ASSERT(document-&gt;securityOrigin());
+            updateRequestForAccessControl(request.mutableResourceRequest(), *document-&gt;securityOrigin(), options.allowCredentials);
+        }
+        m_cachedImage = loader.requestImage(request);
+        m_bestFitImageScaleFactor = image.scaleFactor;
</ins><span class="cx">     }
</span><del>-    if (CachedResourceHandle&lt;CachedImage&gt; cachedImage = loader.requestImage(request)) {
-        styleImage(*document).setCachedImage(*cachedImage, image.scaleFactor);
-        m_accessedBestFitImage = true;
-    }
</del><ins>+    return { m_cachedImage.get(), m_bestFitImageScaleFactor };
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-StyleCachedImage&amp; CSSImageSetValue::styleImage(const Document&amp; document)
</del><ins>+void CSSImageSetValue::updateDeviceScaleFactor(const Document&amp; document)
</ins><span class="cx"> {
</span><del>-    if (!m_image)
-        m_image = StyleCachedImage::create(*this);
-    else if (!m_image-&gt;isPending()) {
-        float deviceScaleFactor = 1;
-        if (Page* page = document.page())
-            deviceScaleFactor = page-&gt;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-&gt;detachFromCSSValue();
-            m_image = StyleCachedImage::create(*this);
-        }
-    }
-
-    return *m_image;
</del><ins>+    float deviceScaleFactor = document.page() ? document.page()-&gt;deviceScaleFactor() : 1;
+    if (deviceScaleFactor == m_deviceScaleFactor)
+        return;
+    m_deviceScaleFactor = deviceScaleFactor;
+    m_accessedBestFitImage = false;
+    m_cachedImage = nullptr;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> String CSSImageSetValue::customCSSText() const
</span><span class="lines">@@ -170,18 +153,13 @@
</span><span class="cx"> 
</span><span class="cx"> bool CSSImageSetValue::traverseSubresources(const std::function&lt;bool (const CachedResource&amp;)&gt;&amp; handler) const
</span><span class="cx"> {
</span><del>-    if (!m_image)
</del><ins>+    if (!m_cachedImage)
</ins><span class="cx">         return false;
</span><del>-    CachedImage* cachedResource = m_image-&gt;cachedImage();
-    if (!cachedResource)
-        return false;
-    return handler(*cachedResource);
</del><ins>+    return handler(*m_cachedImage);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> CSSImageSetValue::CSSImageSetValue(const CSSImageSetValue&amp; cloneFrom)
</span><span class="cx">     : CSSValueList(cloneFrom)
</span><del>-    , m_accessedBestFitImage(false)
-    , m_scaleFactor(1)
</del><span class="cx"> {
</span><span class="cx">     // Non-CSSValueList data is not accessible through CSS OM, no need to clone.
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSImageSetValueh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSImageSetValue.h (205418 => 205419)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -27,18 +27,17 @@
</span><span class="cx"> #define CSSImageSetValue_h
</span><span class="cx"> 
</span><span class="cx"> #include &quot;CSSValueList.h&quot;
</span><ins>+#include &quot;CachedImageClient.h&quot;
+#include &quot;CachedResourceHandle.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> class CachedResourceLoader;
</span><span class="cx"> class Document;
</span><del>-class StyleCachedImage;
-class StyleImage;
</del><span class="cx"> struct ResourceLoaderOptions;
</span><span class="cx"> 
</span><span class="cx"> class CSSImageSetValue final : public CSSValueList {
</span><span class="cx"> public:
</span><del>-
</del><span class="cx">     static Ref&lt;CSSImageSetValue&gt; create()
</span><span class="cx">     {
</span><span class="cx">         return adoptRef(*new CSSImageSetValue());
</span><span class="lines">@@ -45,13 +44,11 @@
</span><span class="cx">     }
</span><span class="cx">     ~CSSImageSetValue();
</span><span class="cx"> 
</span><del>-    void loadBestFitImage(CachedResourceLoader&amp;, const ResourceLoaderOptions&amp;);
-    StyleCachedImage&amp; styleImage(const Document&amp;);
</del><ins>+    std::pair&lt;CachedImage*, float&gt;  loadBestFitImage(CachedResourceLoader&amp;, const ResourceLoaderOptions&amp;);
+    CachedImage* cachedImage() const { return m_cachedImage.get(); }
</ins><span class="cx"> 
</span><span class="cx">     String customCSSText() const;
</span><span class="cx"> 
</span><del>-    bool isPending() const { return !m_accessedBestFitImage; }
-
</del><span class="cx">     struct ImageWithScale {
</span><span class="cx">         String imageURL;
</span><span class="cx">         float scaleFactor;
</span><span class="lines">@@ -61,6 +58,8 @@
</span><span class="cx"> 
</span><span class="cx">     Ref&lt;CSSImageSetValue&gt; cloneForCSSOM() const;
</span><span class="cx"> 
</span><ins>+    void updateDeviceScaleFactor(const Document&amp;);
+
</ins><span class="cx"> protected:
</span><span class="cx">     ImageWithScale bestImageForScaleFactor();
</span><span class="cx"> 
</span><span class="lines">@@ -71,13 +70,11 @@
</span><span class="cx">     void fillImageSet();
</span><span class="cx">     static inline bool compareByScaleFactor(ImageWithScale first, ImageWithScale second) { return first.scaleFactor &lt; second.scaleFactor; }
</span><span class="cx"> 
</span><del>-    RefPtr&lt;StyleCachedImage&gt; m_image;
-    bool m_accessedBestFitImage;
</del><ins>+    CachedResourceHandle&lt;CachedImage&gt; m_cachedImage;
+    bool m_accessedBestFitImage { false };
+    float m_bestFitImageScaleFactor { 1 };
+    float m_deviceScaleFactor { 1 };
</ins><span class="cx"> 
</span><del>-    // 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;
-
</del><span class="cx">     Vector&lt;ImageWithScale&gt; m_imagesInSet;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSImageValuecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSImageValue.cpp (205418 => 205419)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -32,7 +32,6 @@
</span><span class="cx"> #include &quot;Document.h&quot;
</span><span class="cx"> #include &quot;Element.h&quot;
</span><span class="cx"> #include &quot;MemoryCache.h&quot;
</span><del>-#include &quot;StyleCachedImage.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="lines">@@ -46,60 +45,46 @@
</span><span class="cx"> CSSImageValue::CSSImageValue(CachedImage&amp; image)
</span><span class="cx">     : CSSValue(ImageClass)
</span><span class="cx">     , m_url(image.url())
</span><del>-    , m_image(StyleCachedImage::create(*this))
</del><ins>+    , m_cachedImage(&amp;image)
</ins><span class="cx">     , m_accessedImage(true)
</span><span class="cx"> {
</span><del>-    m_image-&gt;setCachedImage(image);
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> CSSImageValue::~CSSImageValue()
</span><span class="cx"> {
</span><del>-    if (m_image)
-        m_image-&gt;detachFromCSSValue();
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool CSSImageValue::isPending() const
</span><span class="cx"> {
</span><del>-    return !m_image || !m_image-&gt;cachedImage();
</del><ins>+    return !m_accessedImage;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-StyleCachedImage&amp; CSSImageValue::styleImage()
</del><ins>+CachedImage* CSSImageValue::loadImage(CachedResourceLoader&amp; loader, const ResourceLoaderOptions&amp; options)
</ins><span class="cx"> {
</span><del>-    if (!m_image)
-        m_image = StyleCachedImage::create(*this);
</del><ins>+    if (!m_accessedImage) {
+        m_accessedImage = true;
</ins><span class="cx"> 
</span><del>-    return *m_image;
-}
</del><ins>+        CachedResourceRequest request(ResourceRequest(loader.document()-&gt;completeURL(m_url)), options);
+        if (m_initiatorName.isEmpty())
+            request.setInitiator(cachedResourceRequestInitiators().css);
+        else
+            request.setInitiator(m_initiatorName);
</ins><span class="cx"> 
</span><del>-void CSSImageValue::loadImage(CachedResourceLoader&amp; loader, const ResourceLoaderOptions&amp; options)
-{
-    if (m_accessedImage)
-        return;
-    m_accessedImage = true;
-
-    CachedResourceRequest request(ResourceRequest(loader.document()-&gt;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()-&gt;securityOrigin());
-        updateRequestForAccessControl(request.mutableResourceRequest(), *loader.document()-&gt;securityOrigin(), options.allowCredentials);
</del><ins>+        if (options.mode == FetchOptions::Mode::Cors) {
+            ASSERT(loader.document()-&gt;securityOrigin());
+            updateRequestForAccessControl(request.mutableResourceRequest(), *loader.document()-&gt;securityOrigin(), options.allowCredentials);
+        }
+        m_cachedImage = loader.requestImage(request);
</ins><span class="cx">     }
</span><del>-    if (CachedResourceHandle&lt;CachedImage&gt; cachedImage = loader.requestImage(request))
-        styleImage().setCachedImage(*cachedImage);
</del><ins>+    return m_cachedImage.get();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool CSSImageValue::traverseSubresources(const std::function&lt;bool (const CachedResource&amp;)&gt;&amp; handler) const
</span><span class="cx"> {
</span><del>-    if (!m_image)
</del><ins>+    if (!m_cachedImage)
</ins><span class="cx">         return false;
</span><del>-    CachedResource* cachedResource = m_image-&gt;cachedImage();
-    if (!cachedResource)
-        return false;
-    return handler(*cachedResource);
</del><ins>+    return handler(*m_cachedImage);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool CSSImageValue::equals(const CSSImageValue&amp; other) const
</span><span class="lines">@@ -122,7 +107,9 @@
</span><span class="cx"> 
</span><span class="cx"> bool CSSImageValue::knownToBeOpaque(const RenderElement* renderer) const
</span><span class="cx"> {
</span><del>-    return m_image ? m_image-&gt;knownToBeOpaque(renderer) : false;
</del><ins>+    if (!m_cachedImage)
+        return false;
+    return m_cachedImage-&gt;currentFrameKnownToBeOpaque(renderer);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSImageValueh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSImageValue.h (205418 => 205419)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -22,6 +22,7 @@
</span><span class="cx"> #define CSSImageValue_h
</span><span class="cx"> 
</span><span class="cx"> #include &quot;CSSValue.h&quot;
</span><ins>+#include &quot;CachedResourceHandle.h&quot;
</ins><span class="cx"> #include &lt;wtf/RefPtr.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -29,7 +30,6 @@
</span><span class="cx"> class CachedImage;
</span><span class="cx"> class CachedResourceLoader;
</span><span class="cx"> class Element;
</span><del>-class StyleCachedImage;
</del><span class="cx"> class RenderElement;
</span><span class="cx"> struct ResourceLoaderOptions;
</span><span class="cx"> 
</span><span class="lines">@@ -40,8 +40,8 @@
</span><span class="cx">     ~CSSImageValue();
</span><span class="cx"> 
</span><span class="cx">     bool isPending() const;
</span><del>-    void loadImage(CachedResourceLoader&amp;, const ResourceLoaderOptions&amp;);
-    StyleCachedImage&amp; styleImage();
</del><ins>+    CachedImage* loadImage(CachedResourceLoader&amp;, const ResourceLoaderOptions&amp;);
+    CachedImage* cachedImage() const { return m_cachedImage.get(); }
</ins><span class="cx"> 
</span><span class="cx">     const String&amp; url() const { return m_url; }
</span><span class="cx"> 
</span><span class="lines">@@ -62,7 +62,7 @@
</span><span class="cx">     explicit CSSImageValue(CachedImage&amp;);
</span><span class="cx"> 
</span><span class="cx">     String m_url;
</span><del>-    RefPtr&lt;StyleCachedImage&gt; m_image;
</del><ins>+    CachedResourceHandle&lt;CachedImage&gt; m_cachedImage;
</ins><span class="cx">     bool m_accessedImage;
</span><span class="cx">     AtomicString m_initiatorName;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCorecssStyleBuilderCustomh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/StyleBuilderCustom.h (205418 => 205419)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -46,6 +46,7 @@
</span><span class="cx"> #include &quot;SVGElement.h&quot;
</span><span class="cx"> #include &quot;SVGRenderStyle.h&quot;
</span><span class="cx"> #include &quot;StyleBuilderConverter.h&quot;
</span><ins>+#include &quot;StyleCachedImage.h&quot;
</ins><span class="cx"> #include &quot;StyleFontSizeFunctions.h&quot;
</span><span class="cx"> #include &quot;StyleGeneratedImage.h&quot;
</span><span class="cx"> #include &quot;StyleResolver.h&quot;
</span><span class="lines">@@ -1313,12 +1314,12 @@
</span><span class="cx">                 styleResolver.style()-&gt;setContent(StyleGeneratedImage::create(downcast&lt;CSSImageGeneratorValue&gt;(item.get())), didSet);
</span><span class="cx">             didSet = true;
</span><span class="cx">         } else if (is&lt;CSSImageSetValue&gt;(item.get())) {
</span><del>-            styleResolver.style()-&gt;setContent(styleResolver.setOrPendingFromValue(CSSPropertyContent, downcast&lt;CSSImageSetValue&gt;(item.get())), didSet);
</del><ins>+            styleResolver.style()-&gt;setContent(styleResolver.styleCachedImageFromValue(CSSPropertyContent, item), didSet);
</ins><span class="cx">             didSet = true;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (is&lt;CSSImageValue&gt;(item.get())) {
</span><del>-            styleResolver.style()-&gt;setContent(styleResolver.cachedOrPendingFromValue(CSSPropertyContent, downcast&lt;CSSImageValue&gt;(item.get())), didSet);
</del><ins>+            styleResolver.style()-&gt;setContent(styleResolver.styleCachedImageFromValue(CSSPropertyContent, item), didSet);
</ins><span class="cx">             didSet = true;
</span><span class="cx">             continue;
</span><span class="cx">         }
</span></span></pre></div>
<a id="trunkSourceWebCorecssStyleResolvercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/StyleResolver.cpp (205418 => 205419)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -1702,33 +1702,27 @@
</span><span class="cx"> 
</span><span class="cx"> RefPtr&lt;StyleImage&gt; StyleResolver::styleImage(CSSPropertyID property, CSSValue&amp; value)
</span><span class="cx"> {
</span><del>-    if (is&lt;CSSImageValue&gt;(value))
-        return cachedOrPendingFromValue(property, downcast&lt;CSSImageValue&gt;(value));
-
</del><span class="cx">     if (is&lt;CSSImageGeneratorValue&gt;(value)) {
</span><span class="cx">         if (is&lt;CSSGradientValue&gt;(value))
</span><del>-            return generatedOrPendingFromValue(property, *downcast&lt;CSSGradientValue&gt;(value).gradientWithStylesResolved(this));
-        return generatedOrPendingFromValue(property, downcast&lt;CSSImageGeneratorValue&gt;(value));
</del><ins>+            return styleGeneratedImageFromValue(property, *downcast&lt;CSSGradientValue&gt;(value).gradientWithStylesResolved(this));
+        return styleGeneratedImageFromValue(property, downcast&lt;CSSImageGeneratorValue&gt;(value));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (is&lt;CSSImageSetValue&gt;(value))
-        return setOrPendingFromValue(property, downcast&lt;CSSImageSetValue&gt;(value));
</del><ins>+    if (is&lt;CSSImageValue&gt;(value) || is&lt;CSSImageSetValue&gt;(value) || is&lt;CSSCursorImageValue&gt;(value))
+        return styleCachedImageFromValue(property, value);
</ins><span class="cx"> 
</span><del>-    if (is&lt;CSSCursorImageValue&gt;(value))
-        return cursorOrPendingFromValue(property, downcast&lt;CSSCursorImageValue&gt;(value));
-
</del><span class="cx">     return nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Ref&lt;StyleImage&gt; StyleResolver::cachedOrPendingFromValue(CSSPropertyID property, CSSImageValue&amp; value)
</del><ins>+Ref&lt;StyleCachedImage&gt; StyleResolver::styleCachedImageFromValue(CSSPropertyID property, CSSValue&amp; value)
</ins><span class="cx"> {
</span><del>-    Ref&lt;StyleImage&gt; image = value.styleImage();
</del><ins>+    auto image = StyleCachedImage::create(value);
</ins><span class="cx">     if (image-&gt;isPending())
</span><span class="cx">         m_state.ensurePendingResources().pendingImages.set(property, &amp;value);
</span><span class="cx">     return image;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Ref&lt;StyleImage&gt; StyleResolver::generatedOrPendingFromValue(CSSPropertyID property, CSSImageGeneratorValue&amp; value)
</del><ins>+Ref&lt;StyleGeneratedImage&gt; StyleResolver::styleGeneratedImageFromValue(CSSPropertyID property, CSSImageGeneratorValue&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (is&lt;CSSFilterImageValue&gt;(value)) {
</span><span class="cx">         // FilterImage needs to calculate FilterOperations.
</span><span class="lines">@@ -1740,22 +1734,6 @@
</span><span class="cx">     return StyleGeneratedImage::create(value);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-RefPtr&lt;StyleImage&gt; StyleResolver::setOrPendingFromValue(CSSPropertyID property, CSSImageSetValue&amp; value)
-{
-    auto&amp; image = value.styleImage(document());
-    if (image.isPending())
-        m_state.ensurePendingResources().pendingImages.set(property, &amp;value);
-    return &amp;image;
-}
-
-RefPtr&lt;StyleImage&gt; StyleResolver::cursorOrPendingFromValue(CSSPropertyID property, CSSCursorImageValue&amp; value)
-{
-    auto&amp; image = value.styleImage(document());
-    if (image.isPending())
-        m_state.ensurePendingResources().pendingImages.set(property, &amp;value);
-    return &amp;image;
-}
-
</del><span class="cx"> #if ENABLE(IOS_TEXT_AUTOSIZING)
</span><span class="cx"> void StyleResolver::checkForTextSizeAdjust(RenderStyle* style)
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceWebCorecssStyleResolverh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/StyleResolver.h (205418 => 205419)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -72,6 +72,8 @@
</span><span class="cx"> class RuleSet;
</span><span class="cx"> class SelectorFilter;
</span><span class="cx"> class Settings;
</span><ins>+class StyleCachedImage;
+class StyleGeneratedImage;
</ins><span class="cx"> class StyleImage;
</span><span class="cx"> class StyleKeyframe;
</span><span class="cx"> class StylePendingImage;
</span><span class="lines">@@ -458,10 +460,8 @@
</span><span class="cx">     const State&amp; state() const { return m_state; }
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;StyleImage&gt; styleImage(CSSPropertyID, CSSValue&amp;);
</span><del>-    Ref&lt;StyleImage&gt; cachedOrPendingFromValue(CSSPropertyID, CSSImageValue&amp;);
-    Ref&lt;StyleImage&gt; generatedOrPendingFromValue(CSSPropertyID, CSSImageGeneratorValue&amp;);
-    RefPtr&lt;StyleImage&gt; setOrPendingFromValue(CSSPropertyID, CSSImageSetValue&amp;);
-    RefPtr&lt;StyleImage&gt; cursorOrPendingFromValue(CSSPropertyID, CSSCursorImageValue&amp;);
</del><ins>+    Ref&lt;StyleCachedImage&gt; styleCachedImageFromValue(CSSPropertyID, CSSValue&amp;);
+    Ref&lt;StyleGeneratedImage&gt; styleGeneratedImageFromValue(CSSPropertyID, CSSImageGeneratorValue&amp;);
</ins><span class="cx"> 
</span><span class="cx">     bool applyPropertyToRegularStyle() const { return m_state.applyPropertyToRegularStyle(); }
</span><span class="cx">     bool applyPropertyToVisitedLinkStyle() const { return m_state.applyPropertyToVisitedLinkStyle(); }
</span></span></pre></div>
<a id="trunkSourceWebCorepagePageSerializercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/PageSerializer.cpp (205418 => 205419)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -331,9 +331,7 @@
</span><span class="cx">         if (!is&lt;CSSImageValue&gt;(*cssValue))
</span><span class="cx">             continue;
</span><span class="cx"> 
</span><del>-        auto&amp; styleImage = downcast&lt;CSSImageValue&gt;(*cssValue).styleImage();
-
-        auto* image = styleImage.cachedImage();
</del><ins>+        auto* image = downcast&lt;CSSImageValue&gt;(*cssValue).cachedImage();
</ins><span class="cx">         if (!image)
</span><span class="cx">             continue;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingstyleFillLayercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/style/FillLayer.cpp (205418 => 205419)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -380,16 +380,10 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static inline bool layerImagesIdentical(const FillLayer&amp; layer1, const FillLayer&amp; layer2)
-{
-    // We just care about pointer equivalency.
-    return layer1.image() == layer2.image();
-}
-
</del><span class="cx"> bool FillLayer::imagesIdentical(const FillLayer* layer1, const FillLayer* layer2)
</span><span class="cx"> {
</span><span class="cx">     for (; layer1 &amp;&amp; layer2; layer1 = layer1-&gt;next(), layer2 = layer2-&gt;next()) {
</span><del>-        if (!layerImagesIdentical(*layer1, *layer2))
</del><ins>+        if (!arePointingToEqualData(layer1-&gt;image(), layer2-&gt;image()))
</ins><span class="cx">             return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingstyleStyleCachedImagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/style/StyleCachedImage.cpp (205418 => 205419)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -2,7 +2,7 @@
</span><span class="cx">  * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
</span><span class="cx">  *           (C) 2000 Antti Koivisto (koivisto@kde.org)
</span><span class="cx">  *           (C) 2000 Dirk Mueller (mueller@kde.org)
</span><del>- * Copyright (C) 2003, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2003, 2005-2008, 2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * This library is free software; you can redistribute it and/or
</span><span class="cx">  * modify it under the terms of the GNU Library General Public
</span><span class="lines">@@ -24,7 +24,9 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;StyleCachedImage.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;CSSCursorImageValue.h&quot;
</ins><span class="cx"> #include &quot;CSSImageSetValue.h&quot;
</span><ins>+#include &quot;CSSImageValue.h&quot;
</ins><span class="cx"> #include &quot;CachedImage.h&quot;
</span><span class="cx"> #include &quot;RenderElement.h&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -31,63 +33,97 @@
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> StyleCachedImage::StyleCachedImage(CSSValue&amp; cssValue)
</span><del>-    : m_cssValue(&amp;cssValue)
</del><ins>+    : m_cssValue(cssValue)
</ins><span class="cx"> {
</span><ins>+    ASSERT(is&lt;CSSImageValue&gt;(m_cssValue) || is&lt;CSSImageSetValue&gt;(m_cssValue) || is&lt;CSSCursorImageValue&gt;(m_cssValue));
+
</ins><span class="cx">     m_isCachedImage = true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> StyleCachedImage::~StyleCachedImage()
</span><span class="cx"> {
</span><del>-    if (m_image)
-        m_image-&gt;removeClient(this);
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-void StyleCachedImage::setCachedImage(CachedImage&amp; image, float scaleFactor)
</del><ins>+bool StyleCachedImage::operator==(const StyleImage&amp; other) const
</ins><span class="cx"> {
</span><del>-    ASSERT(!m_image);
-    m_image = &amp;image;
-    m_image-&gt;addClient(this);
-    m_scaleFactor = scaleFactor;
</del><ins>+    if (!is&lt;StyleCachedImage&gt;(other))
+        return false;
+    auto&amp; otherCached = downcast&lt;StyleCachedImage&gt;(other);
+    if (&amp;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 &amp;&amp; m_cachedImage == otherCached.m_cachedImage)
+        return true;
+    return false;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void StyleCachedImage::load(CachedResourceLoader&amp; loader, const ResourceLoaderOptions&amp; options)
+{
+    ASSERT(isPending());
+
+    if (is&lt;CSSImageValue&gt;(m_cssValue)) {
+        auto&amp; imageValue = downcast&lt;CSSImageValue&gt;(m_cssValue.get());
+        m_cachedImage = imageValue.loadImage(loader, options);
+        return;
+    }
+
+    if (is&lt;CSSImageSetValue&gt;(m_cssValue)) {
+        auto&amp; imageSetValue = downcast&lt;CSSImageSetValue&gt;(m_cssValue.get());
+        std::tie(m_cachedImage, m_scaleFactor) = imageSetValue.loadBestFitImage(loader, options);
+        return;
+    }
+
+    if (is&lt;CSSCursorImageValue&gt;(m_cssValue.get())) {
+        auto&amp; cursorValue = downcast&lt;CSSCursorImageValue&gt;(m_cssValue.get());
+        std::tie(m_cachedImage, m_scaleFactor) = cursorValue.loadImage(loader, options);
+        return;
+    }
+}
+
+CachedImage* StyleCachedImage::cachedImage() const
+{
+    return m_cachedImage.get();
+}
+
</ins><span class="cx"> PassRefPtr&lt;CSSValue&gt; StyleCachedImage::cssValue() const
</span><span class="cx"> {
</span><del>-    if (m_cssValue)
-        return m_cssValue;
-    return CSSPrimitiveValue::create(m_image-&gt;url(), CSSPrimitiveValue::CSS_URI);
</del><ins>+    return const_cast&lt;CSSValue*&gt;(m_cssValue.ptr());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool StyleCachedImage::canRender(const RenderObject* renderer, float multiplier) const
</span><span class="cx"> {
</span><del>-    if (!m_image)
</del><ins>+    if (!m_cachedImage)
</ins><span class="cx">         return false;
</span><del>-    return m_image-&gt;canRender(renderer, multiplier);
</del><ins>+    return m_cachedImage-&gt;canRender(renderer, multiplier);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool StyleCachedImage::isPending() const
</span><span class="cx"> {
</span><del>-    return !m_image;
</del><ins>+    return !m_cachedImage;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool StyleCachedImage::isLoaded() const
</span><span class="cx"> {
</span><del>-    if (!m_image)
</del><ins>+    if (!m_cachedImage)
</ins><span class="cx">         return false;
</span><del>-    return m_image-&gt;isLoaded();
</del><ins>+    return m_cachedImage-&gt;isLoaded();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool StyleCachedImage::errorOccurred() const
</span><span class="cx"> {
</span><del>-    if (!m_image)
</del><ins>+    if (!m_cachedImage)
</ins><span class="cx">         return false;
</span><del>-    return m_image-&gt;errorOccurred();
</del><ins>+    return m_cachedImage-&gt;errorOccurred();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> FloatSize StyleCachedImage::imageSize(const RenderElement* renderer, float multiplier) const
</span><span class="cx"> {
</span><del>-    if (!m_image)
</del><ins>+    if (!m_cachedImage)
</ins><span class="cx">         return { };
</span><del>-    FloatSize size = m_image-&gt;imageSizeForRenderer(renderer, multiplier);
</del><ins>+    FloatSize size = m_cachedImage-&gt;imageSizeForRenderer(renderer, multiplier);
</ins><span class="cx">     size.scale(1 / m_scaleFactor);
</span><span class="cx">     return size;
</span><span class="cx"> }
</span><span class="lines">@@ -94,58 +130,58 @@
</span><span class="cx"> 
</span><span class="cx"> bool StyleCachedImage::imageHasRelativeWidth() const
</span><span class="cx"> {
</span><del>-    if (!m_image)
</del><ins>+    if (!m_cachedImage)
</ins><span class="cx">         return false;
</span><del>-    return m_image-&gt;imageHasRelativeWidth();
</del><ins>+    return m_cachedImage-&gt;imageHasRelativeWidth();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool StyleCachedImage::imageHasRelativeHeight() const
</span><span class="cx"> {
</span><del>-    if (!m_image)
</del><ins>+    if (!m_cachedImage)
</ins><span class="cx">         return false;
</span><del>-    return m_image-&gt;imageHasRelativeHeight();
</del><ins>+    return m_cachedImage-&gt;imageHasRelativeHeight();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void StyleCachedImage::computeIntrinsicDimensions(const RenderElement*, Length&amp; intrinsicWidth, Length&amp; intrinsicHeight, FloatSize&amp; intrinsicRatio)
</span><span class="cx"> {
</span><del>-    if (!m_image)
</del><ins>+    if (!m_cachedImage)
</ins><span class="cx">         return;
</span><del>-    m_image-&gt;computeIntrinsicDimensions(intrinsicWidth, intrinsicHeight, intrinsicRatio);
</del><ins>+    m_cachedImage-&gt;computeIntrinsicDimensions(intrinsicWidth, intrinsicHeight, intrinsicRatio);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool StyleCachedImage::usesImageContainerSize() const
</span><span class="cx"> {
</span><del>-    if (!m_image)
</del><ins>+    if (!m_cachedImage)
</ins><span class="cx">         return false;
</span><del>-    return m_image-&gt;usesImageContainerSize();
</del><ins>+    return m_cachedImage-&gt;usesImageContainerSize();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void StyleCachedImage::setContainerSizeForRenderer(const RenderElement* renderer, const FloatSize&amp; imageContainerSize, float imageContainerZoomFactor)
</span><span class="cx"> {
</span><del>-    if (!m_image)
</del><ins>+    if (!m_cachedImage)
</ins><span class="cx">         return;
</span><del>-    m_image-&gt;setContainerSizeForRenderer(renderer, LayoutSize(imageContainerSize), imageContainerZoomFactor);
</del><ins>+    m_cachedImage-&gt;setContainerSizeForRenderer(renderer, LayoutSize(imageContainerSize), imageContainerZoomFactor);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void StyleCachedImage::addClient(RenderElement* renderer)
</span><span class="cx"> {
</span><del>-    if (!m_image)
</del><ins>+    if (!m_cachedImage)
</ins><span class="cx">         return;
</span><del>-    m_image-&gt;addClient(renderer);
</del><ins>+    m_cachedImage-&gt;addClient(renderer);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void StyleCachedImage::removeClient(RenderElement* renderer)
</span><span class="cx"> {
</span><del>-    if (!m_image)
</del><ins>+    if (!m_cachedImage)
</ins><span class="cx">         return;
</span><del>-    m_image-&gt;removeClient(renderer);
</del><ins>+    m_cachedImage-&gt;removeClient(renderer);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> RefPtr&lt;Image&gt; StyleCachedImage::image(RenderElement* renderer, const FloatSize&amp;) const
</span><span class="cx"> {
</span><del>-    if (!m_image)
</del><ins>+    if (!m_cachedImage)
</ins><span class="cx">         return nullptr;
</span><del>-    return m_image-&gt;imageForRenderer(renderer);
</del><ins>+    return m_cachedImage-&gt;imageForRenderer(renderer);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> float StyleCachedImage::imageScaleFactor() const
</span><span class="lines">@@ -155,9 +191,9 @@
</span><span class="cx"> 
</span><span class="cx"> bool StyleCachedImage::knownToBeOpaque(const RenderElement* renderer) const
</span><span class="cx"> {
</span><del>-    if (!m_image)
</del><ins>+    if (!m_cachedImage)
</ins><span class="cx">         return false;
</span><del>-    return m_image-&gt;currentFrameKnownToBeOpaque(renderer);
</del><ins>+    return m_cachedImage-&gt;currentFrameKnownToBeOpaque(renderer);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingstyleStyleCachedImageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/style/StyleCachedImage.h (205418 => 205419)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -32,26 +32,25 @@
</span><span class="cx"> 
</span><span class="cx"> class CSSValue;
</span><span class="cx"> class CachedImage;
</span><ins>+class Document;
</ins><span class="cx"> 
</span><del>-class StyleCachedImage final : public StyleImage, private CachedImageClient {
</del><ins>+class StyleCachedImage final : public StyleImage {
</ins><span class="cx">     WTF_MAKE_FAST_ALLOCATED;
</span><span class="cx"> public:
</span><span class="cx">     static Ref&lt;StyleCachedImage&gt; create(CSSValue&amp; cssValue) { return adoptRef(*new StyleCachedImage(cssValue)); }
</span><span class="cx">     virtual ~StyleCachedImage();
</span><span class="cx"> 
</span><del>-    CachedImage* cachedImage() const override { return m_image.get(); }
</del><ins>+    bool operator==(const StyleImage&amp; other) const override;
</ins><span class="cx"> 
</span><del>-    void detachFromCSSValue() { m_cssValue = nullptr; }
-    void setCSSValue(CSSValue&amp; value) { m_cssValue = &amp;value; }
</del><ins>+    CachedImage* cachedImage() const override;
</ins><span class="cx"> 
</span><del>-    void setCachedImage(CachedImage&amp;, float scaleFactor = 1);
</del><ins>+    WrappedImagePtr data() const override { return m_cachedImage.get(); }
</ins><span class="cx"> 
</span><del>-    WrappedImagePtr data() const override { return m_image.get(); }
-
</del><span class="cx">     PassRefPtr&lt;CSSValue&gt; cssValue() const override;
</span><span class="cx">     
</span><span class="cx">     bool canRender(const RenderObject*, float multiplier) const override;
</span><span class="cx">     bool isPending() const override;
</span><ins>+    void load(CachedResourceLoader&amp;, const ResourceLoaderOptions&amp;) override;
</ins><span class="cx">     bool isLoaded() const override;
</span><span class="cx">     bool errorOccurred() const override;
</span><span class="cx">     FloatSize imageSize(const RenderElement*, float multiplier) const override;
</span><span class="lines">@@ -69,9 +68,9 @@
</span><span class="cx"> private:
</span><span class="cx">     StyleCachedImage(CSSValue&amp;);
</span><span class="cx"> 
</span><del>-    CSSValue* m_cssValue;
-    float m_scaleFactor { 1 };
-    CachedResourceHandle&lt;CachedImage&gt; m_image;
</del><ins>+    Ref&lt;CSSValue&gt; m_cssValue;
+    mutable float m_scaleFactor { 1 };
+    mutable CachedResourceHandle&lt;CachedImage&gt; m_cachedImage;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingstyleStyleGeneratedImagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/style/StyleGeneratedImage.cpp (205418 => 205419)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -47,6 +47,11 @@
</span><span class="cx">     return m_imageGeneratorValue-&gt;isPending();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void StyleGeneratedImage::load(CachedResourceLoader&amp; loader, const ResourceLoaderOptions&amp; options)
+{
+    m_imageGeneratorValue-&gt;loadSubimages(loader, options);
+}
+
</ins><span class="cx"> FloatSize StyleGeneratedImage::imageSize(const RenderElement* renderer, float multiplier) const
</span><span class="cx"> {
</span><span class="cx">     if (m_fixedSize) {
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingstyleStyleGeneratedImageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/style/StyleGeneratedImage.h (205418 => 205419)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -41,11 +41,14 @@
</span><span class="cx">     CSSImageGeneratorValue&amp; imageValue() { return m_imageGeneratorValue; }
</span><span class="cx"> 
</span><span class="cx"> private:
</span><ins>+    bool operator==(const StyleImage&amp; other) const override { return data() == other.data(); }
+
</ins><span class="cx">     WrappedImagePtr data() const override { return m_imageGeneratorValue.ptr(); }
</span><span class="cx"> 
</span><span class="cx">     PassRefPtr&lt;CSSValue&gt; cssValue() const override;
</span><span class="cx"> 
</span><span class="cx">     bool isPending() const override;
</span><ins>+    void load(CachedResourceLoader&amp;, const ResourceLoaderOptions&amp;) override;
</ins><span class="cx">     FloatSize imageSize(const RenderElement*, float multiplier) const override;
</span><span class="cx">     bool imageHasRelativeWidth() const override { return !m_fixedSize; }
</span><span class="cx">     bool imageHasRelativeHeight() const override { return !m_fixedSize; }
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingstyleStyleImageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/style/StyleImage.h (205418 => 205419)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -35,9 +35,11 @@
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> class CachedImage;
</span><ins>+class CachedResourceLoader;
</ins><span class="cx"> class CSSValue;
</span><span class="cx"> class RenderElement;
</span><span class="cx"> class RenderObject;
</span><ins>+struct ResourceLoaderOptions;
</ins><span class="cx"> 
</span><span class="cx"> typedef const void* WrappedImagePtr;
</span><span class="cx"> 
</span><span class="lines">@@ -45,15 +47,13 @@
</span><span class="cx"> public:
</span><span class="cx">     virtual ~StyleImage() { }
</span><span class="cx"> 
</span><del>-    bool operator==(const StyleImage&amp; other) const
-    {
-        return &amp;other == this || (data() &amp;&amp; data() == other.data());
-    }
</del><ins>+    virtual bool operator==(const StyleImage&amp; other) const = 0;
</ins><span class="cx"> 
</span><span class="cx">     virtual PassRefPtr&lt;CSSValue&gt; cssValue() const = 0;
</span><span class="cx"> 
</span><span class="cx">     virtual bool canRender(const RenderObject*, float /*multiplier*/) const { return true; }
</span><span class="cx">     virtual bool isPending() const = 0;
</span><ins>+    virtual void load(CachedResourceLoader&amp;, const ResourceLoaderOptions&amp;) = 0;
</ins><span class="cx">     virtual bool isLoaded() const { return true; }
</span><span class="cx">     virtual bool errorOccurred() const { return false; }
</span><span class="cx">     virtual FloatSize imageSize(const RenderElement*, float multiplier) const = 0;
</span></span></pre></div>
<a id="trunkSourceWebCorestyleStylePendingResourcescpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/style/StylePendingResources.cpp (205418 => 205419)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -27,9 +27,6 @@
</span><span class="cx"> #include &quot;StylePendingResources.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;CSSCursorImageValue.h&quot;
</span><del>-#include &quot;CSSImageGeneratorValue.h&quot;
-#include &quot;CSSImageSetValue.h&quot;
-#include &quot;CSSImageValue.h&quot;
</del><span class="cx"> #include &quot;CachedResourceLoader.h&quot;
</span><span class="cx"> #include &quot;CachedSVGDocumentReference.h&quot;
</span><span class="cx"> #include &quot;ContentData.h&quot;
</span><span class="lines">@@ -60,26 +57,7 @@
</span><span class="cx">         options.allowCredentials = DoNotAllowStoredCredentials;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    auto cssValue = const_cast&lt;StyleImage*&gt;(styleImage)-&gt;cssValue();
-    if (is&lt;CSSImageValue&gt;(cssValue.get())) {
-        downcast&lt;CSSImageValue&gt;(*cssValue).loadImage(document.cachedResourceLoader(), options);
-        return;
-    };
-
-    if (is&lt;CSSImageSetValue&gt;(cssValue.get())) {
-        downcast&lt;CSSImageSetValue&gt;(*cssValue).loadBestFitImage(document.cachedResourceLoader(), options);
-        return;
-    };
-
-    if (is&lt;CSSImageGeneratorValue&gt;(cssValue.get())) {
-        downcast&lt;CSSImageGeneratorValue&gt;(*cssValue).loadSubimages(document.cachedResourceLoader(), options);
-        return;
-    };
-
-    if (is&lt;CSSCursorImageValue&gt;(cssValue.get())) {
-        downcast&lt;CSSCursorImageValue&gt;(*cssValue).loadImage(document.cachedResourceLoader(), options);
-        return;
-    };
</del><ins>+    const_cast&lt;StyleImage&amp;&gt;(*styleImage).load(document.cachedResourceLoader(), options);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static void loadPendingImages(const PendingResources&amp; pendingResources, Document&amp; document, RenderStyle&amp; style, const Element* element)
</span></span></pre>
</div>
</div>

</body>
</html>