<!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>[279906] 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/279906">279906</a></dd>
<dt>Author</dt> <dd>said@apple.com</dd>
<dt>Date</dt> <dd>2021-07-14 00:13:23 -0700 (Wed, 14 Jul 2021)</dd>
</dl>

<h3>Log Message</h3>
<pre>RenderElement::updateFillImages must fix the clients of the CSS image whose URL is invalid
https://bugs.webkit.org/show_bug.cgi?id=227926
<rdar://80457956>

Reviewed by Simon Fraser.

Per CSS2 specs, if the value of the url() is the empty string, then it
must be resolved to the URL of the style sheet which is an invalid URI
for an image. The issue https://github.com/w3c/csswg-drafts/issues/2211
was filed to change this behavior.

In RenderElement::updateFillImages() we fix the old and new fill images
only if they are different. But we consider them equal if their URIs are
equal and they are not data URIs. If the two URIs are empty strings, the
fill images will be considered equal although their CachedImages might
be different.

We need to fix the clients of the fill images always if their CachedImages
have errorOccured() true or have hasImage() false.

* rendering/RenderElement.cpp:
(WebCore::RenderElement::updateFillImages):
* rendering/style/StyleCachedImage.cpp:
(WebCore::StyleCachedImage::hasImage const):
* rendering/style/StyleCachedImage.h:
* rendering/style/StyleImage.h:
(WebCore::StyleImage::hasImage const):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderElementcpp">trunk/Source/WebCore/rendering/RenderElement.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="#trunkSourceWebCorerenderingstyleStyleImageh">trunk/Source/WebCore/rendering/style/StyleImage.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (279905 => 279906)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog   2021-07-14 05:57:07 UTC (rev 279905)
+++ trunk/Source/WebCore/ChangeLog      2021-07-14 07:13:23 UTC (rev 279906)
</span><span class="lines">@@ -1,3 +1,33 @@
</span><ins>+2021-07-14  Said Abou-Hallawa  <said@apple.com>
+
+        RenderElement::updateFillImages must fix the clients of the CSS image whose URL is invalid
+        https://bugs.webkit.org/show_bug.cgi?id=227926
+        <rdar://80457956>
+
+        Reviewed by Simon Fraser.
+
+        Per CSS2 specs, if the value of the url() is the empty string, then it
+        must be resolved to the URL of the style sheet which is an invalid URI
+        for an image. The issue https://github.com/w3c/csswg-drafts/issues/2211
+        was filed to change this behavior.
+
+        In RenderElement::updateFillImages() we fix the old and new fill images
+        only if they are different. But we consider them equal if their URIs are
+        equal and they are not data URIs. If the two URIs are empty strings, the
+        fill images will be considered equal although their CachedImages might
+        be different.
+
+        We need to fix the clients of the fill images always if their CachedImages 
+        have errorOccured() true or have hasImage() false.
+
+        * rendering/RenderElement.cpp:
+        (WebCore::RenderElement::updateFillImages):
+        * rendering/style/StyleCachedImage.cpp:
+        (WebCore::StyleCachedImage::hasImage const):
+        * rendering/style/StyleCachedImage.h:
+        * rendering/style/StyleImage.h:
+        (WebCore::StyleImage::hasImage const):
+
</ins><span class="cx"> 2021-07-13  Jean-Yves Avenard  <jya@apple.com>
</span><span class="cx"> 
</span><span class="cx">         MediaSessionManagerCocoa::ensureCodecsRegistered() isn't thread-safe
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderElement.cpp (279905 => 279906)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderElement.cpp 2021-07-14 05:57:07 UTC (rev 279905)
+++ trunk/Source/WebCore/rendering/RenderElement.cpp    2021-07-14 07:13:23 UTC (rev 279906)
</span><span class="lines">@@ -363,6 +363,10 @@
</span><span class="cx">                 return false;
</span><span class="cx">             if (layer1->image() && layer1->image()->usesDataProtocol())
</span><span class="cx">                 return false;
</span><ins>+            if (auto styleImage = layer1->image()) {
+                if (styleImage->errorOccurred() || !styleImage->hasImage() || styleImage->usesDataProtocol())
+                    return false;
+            }
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         return !layer1 && !layer2;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingstyleStyleCachedImagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/style/StyleCachedImage.cpp (279905 => 279906)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/style/StyleCachedImage.cpp        2021-07-14 05:57:07 UTC (rev 279905)
+++ trunk/Source/WebCore/rendering/style/StyleCachedImage.cpp   2021-07-14 07:13:23 UTC (rev 279906)
</span><span class="lines">@@ -180,6 +180,13 @@
</span><span class="cx">     return m_cachedImage->hasClient(renderer);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool StyleCachedImage::hasImage() const
+{
+    if (!m_cachedImage)
+        return false;
+    return m_cachedImage->hasImage();
+}
+
</ins><span class="cx"> RefPtr<Image> StyleCachedImage::image(RenderElement* renderer, const FloatSize&) const
</span><span class="cx"> {
</span><span class="cx">     ASSERT(!m_isPending);
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingstyleStyleCachedImageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/style/StyleCachedImage.h (279905 => 279906)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/style/StyleCachedImage.h  2021-07-14 05:57:07 UTC (rev 279905)
+++ trunk/Source/WebCore/rendering/style/StyleCachedImage.h     2021-07-14 07:13:23 UTC (rev 279906)
</span><span class="lines">@@ -61,6 +61,7 @@
</span><span class="cx">     void addClient(RenderElement&) final;
</span><span class="cx">     void removeClient(RenderElement&) final;
</span><span class="cx">     bool hasClient(RenderElement&) const final;
</span><ins>+    bool hasImage() const final;
</ins><span class="cx">     RefPtr<Image> image(RenderElement*, const FloatSize&) const final;
</span><span class="cx">     float imageScaleFactor() const final;
</span><span class="cx">     bool knownToBeOpaque(const RenderElement&) const final;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingstyleStyleImageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/style/StyleImage.h (279905 => 279906)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/style/StyleImage.h        2021-07-14 05:57:07 UTC (rev 279905)
+++ trunk/Source/WebCore/rendering/style/StyleImage.h   2021-07-14 07:13:23 UTC (rev 279906)
</span><span class="lines">@@ -63,6 +63,7 @@
</span><span class="cx">     virtual void addClient(RenderElement&) = 0;
</span><span class="cx">     virtual void removeClient(RenderElement&) = 0;
</span><span class="cx">     virtual bool hasClient(RenderElement&) const = 0;
</span><ins>+    virtual bool hasImage() const { return false; }
</ins><span class="cx">     virtual RefPtr<Image> image(RenderElement*, const FloatSize&) const = 0;
</span><span class="cx">     virtual WrappedImagePtr data() const = 0;
</span><span class="cx">     virtual float imageScaleFactor() const { return 1; }
</span></span></pre>
</div>
</div>

</body>
</html>