<!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>[177576] trunk</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/177576">177576</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2014-12-19 10:36:27 -0800 (Fri, 19 Dec 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Only when the SVG is inline and only when a shape is referenced before it is defined, this shape will not be drawn.
https://bugs.webkit.org/show_bug.cgi?id=139451.

Patch by Said Abou-Hallawa &lt;sabouhallawa@apple.com&gt; on 2014-12-19
Reviewed by Antti Koivisto.

Source/WebCore:

Tests: svg/in-html/defs-after-use.html.

When parsing the children of an SVG element is finished, we need to notify the
other SVG elements which have incomplete shadow trees because of early referencing
to this element. The referencing elements need to rebuild their shadow trees and
make new copies of the this element and its sub-tree.

This is the case where a &lt;use&gt; tag references target elements before these target
elements are defined. Updating the shadow DOM tree of a &lt;use&gt; element should update
the corresponding shadow render tree as well.

* svg/SVGElement.cpp:
(WebCore::SVGElement::finishParsingChildren):
Invalidate all the referencing elements of a target element whose sub-tree has
just finished parsing.

LayoutTests:

Ensure that when a &lt;use&gt; element inside an inline SVG references another
target SVG element, which has not been defined yet, gets its shadow DOM
tree updated once the target element is created. Updating the shadow DOM
tree of the &lt;use&gt; element should update the corresponding shadow render
tree as well.

* svg/in-html/defs-after-use-expected.html: Added.
* svg/in-html/defs-after-use.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoresvgSVGElementcpp">trunk/Source/WebCore/svg/SVGElement.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestssvginhtmldefsafteruseexpectedhtml">trunk/LayoutTests/svg/in-html/defs-after-use-expected.html</a></li>
<li><a href="#trunkLayoutTestssvginhtmldefsafterusehtml">trunk/LayoutTests/svg/in-html/defs-after-use.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (177575 => 177576)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-12-19 17:57:21 UTC (rev 177575)
+++ trunk/LayoutTests/ChangeLog        2014-12-19 18:36:27 UTC (rev 177576)
</span><span class="lines">@@ -1,3 +1,19 @@
</span><ins>+2014-12-19  Said Abou-Hallawa  &lt;sabouhallawa@apple.com&gt;
+
+        Only when the SVG is inline and only when a shape is referenced before it is defined, this shape will not be drawn.
+        https://bugs.webkit.org/show_bug.cgi?id=139451.
+
+        Reviewed by Antti Koivisto.
+
+        Ensure that when a &lt;use&gt; element inside an inline SVG references another
+        target SVG element, which has not been defined yet, gets its shadow DOM
+        tree updated once the target element is created. Updating the shadow DOM
+        tree of the &lt;use&gt; element should update the corresponding shadow render
+        tree as well.
+
+        * svg/in-html/defs-after-use-expected.html: Added.
+        * svg/in-html/defs-after-use.html: Added.
+
</ins><span class="cx"> 2014-12-18  Alexey Proskuryakov  &lt;ap@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         More gardening for flaky tests that are now properly reported as timing oout.
</span></span></pre></div>
<a id="trunkLayoutTestssvginhtmldefsafteruseexpectedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/svg/in-html/defs-after-use-expected.html (0 => 177576)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/svg/in-html/defs-after-use-expected.html                                (rev 0)
+++ trunk/LayoutTests/svg/in-html/defs-after-use-expected.html        2014-12-19 18:36:27 UTC (rev 177576)
</span><span class="lines">@@ -0,0 +1,8 @@
</span><ins>+&lt;html&gt;
+&lt;body&gt;
+  &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
+    &lt;rect x=&quot;10&quot; y=&quot;10&quot; width=&quot;100&quot; height=&quot;50&quot; fill=&quot;lime&quot;/&gt;
+    &lt;rect x=&quot;120&quot; y=&quot;10&quot; width=&quot;100&quot; height=&quot;50&quot; fill=&quot;lime&quot;/&gt;
+  &lt;/svg&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestssvginhtmldefsafterusehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/svg/in-html/defs-after-use.html (0 => 177576)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/svg/in-html/defs-after-use.html                                (rev 0)
+++ trunk/LayoutTests/svg/in-html/defs-after-use.html        2014-12-19 18:36:27 UTC (rev 177576)
</span><span class="lines">@@ -0,0 +1,42 @@
</span><ins>+&lt;!--
+    Ensure that when a &lt;use&gt; element inside an inline SVG references another
+    target SVG element, which has not been defined yet, gets its shadow DOM
+    tree updated once the target element is created. Updating the shadow DOM
+    tree of the &lt;use&gt; element should update the corresponding shadow render
+    tree as well.
+    
+    https://bugs.webkit.org/show_bug.cgi?id=139469
+--&gt;
+&lt;html&gt;
+&lt;body&gt;
+  &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot;&gt;
+      
+    &lt;!-- Early target elements' definition --&gt;
+    &lt;defs&gt;
+      &lt;g id=&quot;yellow-lime-rect&quot;&gt;
+        &lt;rect x=&quot;0&quot; y=&quot;0&quot; width=&quot;100&quot; height=&quot;50&quot; fill=&quot;yellow&quot;/&gt;
+        &lt;use xlink:href=&quot;#lime-rect&quot;/&gt;
+      &lt;/g&gt;
+    &lt;/defs&gt;
+    
+    &lt;!-- draw two red rectangles --&gt;
+    &lt;rect x=&quot;10&quot; y=&quot;10&quot; width=&quot;100&quot; height=&quot;50&quot; fill=&quot;red&quot;/&gt;
+    &lt;rect x=&quot;120&quot; y=&quot;10&quot; width=&quot;100&quot; height=&quot;50&quot; fill=&quot;red&quot;/&gt;
+
+    &lt;!-- Overdraw the two red rectangles with two other lime rectangles --&gt;
+    &lt;use x=&quot;10&quot; y=&quot;10&quot; xlink:href=&quot;#yellow-lime-rect&quot;/&gt;
+    &lt;use x=&quot;120&quot; y=&quot;10&quot; xlink:href=&quot;#orange-lime-rect&quot;/&gt;
+    
+    &lt;!-- Late target elements' definition --&gt;
+    &lt;defs&gt;
+      &lt;g id=&quot;orange-lime-rect&quot;&gt;
+        &lt;rect x=&quot;0&quot; y=&quot;0&quot; width=&quot;100&quot; height=&quot;50&quot; fill=&quot;orange&quot;/&gt;
+        &lt;use xlink:href=&quot;#lime-rect&quot;/&gt;
+      &lt;/g&gt;
+      &lt;g id=&quot;lime-rect&quot;&gt;
+        &lt;rect x=&quot;0&quot; y=&quot;0&quot; width=&quot;100&quot; height=&quot;50&quot; fill=&quot;lime&quot;/&gt;
+      &lt;/g&gt;
+    &lt;/defs&gt;
+  &lt;/svg&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (177575 => 177576)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-12-19 17:57:21 UTC (rev 177575)
+++ trunk/Source/WebCore/ChangeLog        2014-12-19 18:36:27 UTC (rev 177576)
</span><span class="lines">@@ -1,3 +1,26 @@
</span><ins>+2014-12-19  Said Abou-Hallawa  &lt;sabouhallawa@apple.com&gt;
+
+        Only when the SVG is inline and only when a shape is referenced before it is defined, this shape will not be drawn.
+        https://bugs.webkit.org/show_bug.cgi?id=139451.
+
+        Reviewed by Antti Koivisto.
+
+        Tests: svg/in-html/defs-after-use.html.
+
+        When parsing the children of an SVG element is finished, we need to notify the
+        other SVG elements which have incomplete shadow trees because of early referencing
+        to this element. The referencing elements need to rebuild their shadow trees and
+        make new copies of the this element and its sub-tree.
+        
+        This is the case where a &lt;use&gt; tag references target elements before these target
+        elements are defined. Updating the shadow DOM tree of a &lt;use&gt; element should update
+        the corresponding shadow render tree as well.
+
+        * svg/SVGElement.cpp:
+        (WebCore::SVGElement::finishParsingChildren):
+        Invalidate all the referencing elements of a target element whose sub-tree has
+        just finished parsing.
+
</ins><span class="cx"> 2014-12-19  David Kilzer  &lt;ddkilzer@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Switch from using PLATFORM_NAME to SDK selectors in WebCore, WebInspectorUI, WebKit, WebKit2
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGElement.cpp (177575 => 177576)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGElement.cpp        2014-12-19 17:57:21 UTC (rev 177575)
+++ trunk/Source/WebCore/svg/SVGElement.cpp        2014-12-19 18:36:27 UTC (rev 177576)
</span><span class="lines">@@ -708,6 +708,10 @@
</span><span class="cx">     // finishParsingChildren() is called when the close tag is reached for an element (e.g. &lt;/svg&gt;)
</span><span class="cx">     // we send SVGLoad events here if we can, otherwise they'll be sent when any required loads finish
</span><span class="cx">     sendSVGLoadEventIfPossible();
</span><ins>+
+    // Notify all the elements which have references to this element to rebuild their shadow and render
+    // trees, e.g. a &lt;use&gt; element references a target element before this target element is defined.
+    SVGElementInstance::invalidateAllInstancesOfElement(this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool SVGElement::childShouldCreateRenderer(const Node&amp; child) const
</span></span></pre>
</div>
</div>

</body>
</html>