<!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>[195663] releases/WebKitGTK/webkit-2.10</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/195663">195663</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2016-01-27 04:34:15 -0800 (Wed, 27 Jan 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Merge <a href="http://trac.webkit.org/projects/webkit/changeset/195411">r195411</a> - A crash reproducible in Path::isEmpty() under RenderSVGShape::paint()
https://bugs.webkit.org/show_bug.cgi?id=149613

Patch by Said Abou-Hallawa &lt;sabouhallawa@apple.com&gt; on 2016-01-21
Reviewed by Darin Adler.
Source/WebCore:

When RenderSVGRoot::layout() realizes its layout size has changed and
it has resources which have relative sizes, it marks all the clients of
the resources for invalidates regardless whether they belong to the
same RenderSVGRoot or not. But it reruns the layout only for its children.
If one of these clients comes before the current RenderSVGRoot in the render
tree, ee end up having renderer marked for invalidation at rendering time.
This also prevents scheduling the layout if the same renderer is marked
for another invalidation later. We prevent this because we do not want
to schedule another layout for a renderer which is already marked for
invalidation. This can cause crash if the renderer is an RenderSVGPath.

The fix is to mark &quot;only&quot; the clients of a resource which belong to the
same RenderSVGRoot of the resource. Also we need to run the layout for
all the resources which belong to different RenderSVGRoots before running
the layout for an SVG renderer.

Tests: svg/custom/filter-update-different-root.html
       svg/custom/pattern-update-different-root.html

* rendering/svg/RenderSVGResourceContainer.cpp:
(WebCore::RenderSVGResourceContainer::markAllClientsForInvalidation):
We should not mark any client outside the current root for invalidation

* rendering/svg/RenderSVGResourceContainer.h: Remove unneeded private keyword.

* rendering/svg/RenderSVGRoot.cpp:
(WebCore::RenderSVGRoot::addResourceForClientInvalidation):
Code clean up; use findTreeRootObject() instead of repeating the same code.

* rendering/svg/RenderSVGShape.cpp:
(WebCore::RenderSVGShape::isEmpty): Avoid crashing if RenderSVGShape::isEmpty()
is called before calling RenderSVGShape::layout().

* rendering/svg/RenderSVGText.cpp:
(WebCore::RenderSVGText::layout): findTreeRootObject() now returns a pointer.

* rendering/svg/SVGRenderSupport.cpp:
(WebCore::SVGRenderSupport::findTreeRootObject): I do think nothing
guarantees that an SVG renderer has to have an RenderSVGRoot in its
ancestors. So change this function to return a pointer. Also Provide
the non-const version of this function.

(WebCore::SVGRenderSupport::layoutDifferentRootIfNeeded): Runs the layout
if needed for all the resources which belong to different RenderSVGRoots.

(WebCore::SVGRenderSupport::layoutChildren): Make sure all the renderer's
resources which belong to different RenderSVGRoots are laid out before
running the layout for this renderer.

* rendering/svg/SVGRenderSupport.h: Remove a mysterious comment.

* rendering/svg/SVGResources.cpp:
(WebCore::SVGResources::layoutDifferentRootIfNeeded): Run the layout for
all the resources which belong to different RenderSVGRoots outside the
context of their RenderSVGRoots.

* rendering/svg/SVGResources.h:
(WebCore::SVGResources::clipper):
(WebCore::SVGResources::markerStart):
(WebCore::SVGResources::markerMid):
(WebCore::SVGResources::markerEnd):
(WebCore::SVGResources::masker):
(WebCore::SVGResources::filter):
(WebCore::SVGResources::fill):
(WebCore::SVGResources::stroke):
Code clean up; use nullptr instead of 0.

LayoutTests:

When running the layout of an SVG root and it has resources which are
referenced by clients in other SVG roots, make sure we run the layout
for these resources before running the layout for their clients.

* svg/custom/filter-update-different-root-expected.html: Added.
* svg/custom/filter-update-different-root.html: Added.
Without this patch this test crashes because we paint a dirty RenderSVGShape.

* svg/custom/pattern-update-different-root-expected.html: Added.
* svg/custom/pattern-update-different-root.html: Added.
Without this patch this test works fine but it is good to have it to catch
cases where the SVG root needs to run re-layout for its children resources
and hence their clients if its size has changed.

* svg/custom/unicode-in-tspan-multi-svg-crash-expected.txt:
* svg/custom/unicode-in-tspan-multi-svg-crash.html:
This test was ported from Blink in http://trac.webkit.org/changeset/166420.
The expectation of this test was changed in Blink:
https://src.chromium.org/viewvc/blink?revision=158480&amp;view=revision.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit210LayoutTestsChangeLog">releases/WebKitGTK/webkit-2.10/LayoutTests/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit210LayoutTestssvgcustomunicodeintspanmultisvgcrashexpectedtxt">releases/WebKitGTK/webkit-2.10/LayoutTests/svg/custom/unicode-in-tspan-multi-svg-crash-expected.txt</a></li>
<li><a href="#releasesWebKitGTKwebkit210LayoutTestssvgcustomunicodeintspanmultisvgcrashhtml">releases/WebKitGTK/webkit-2.10/LayoutTests/svg/custom/unicode-in-tspan-multi-svg-crash.html</a></li>
<li><a href="#releasesWebKitGTKwebkit210SourceWebCoreChangeLog">releases/WebKitGTK/webkit-2.10/Source/WebCore/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit210SourceWebCorerenderingsvgRenderSVGResourceContainercpp">releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit210SourceWebCorerenderingsvgRenderSVGResourceContainerh">releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/RenderSVGResourceContainer.h</a></li>
<li><a href="#releasesWebKitGTKwebkit210SourceWebCorerenderingsvgRenderSVGRootcpp">releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/RenderSVGRoot.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit210SourceWebCorerenderingsvgRenderSVGShapecpp">releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/RenderSVGShape.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit210SourceWebCorerenderingsvgRenderSVGTextcpp">releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/RenderSVGText.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit210SourceWebCorerenderingsvgSVGRenderSupportcpp">releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/SVGRenderSupport.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit210SourceWebCorerenderingsvgSVGRenderSupporth">releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/SVGRenderSupport.h</a></li>
<li><a href="#releasesWebKitGTKwebkit210SourceWebCorerenderingsvgSVGResourcescpp">releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/SVGResources.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit210SourceWebCorerenderingsvgSVGResourcesh">releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/SVGResources.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit210LayoutTestssvgcustomfilterupdatedifferentrootexpectedhtml">releases/WebKitGTK/webkit-2.10/LayoutTests/svg/custom/filter-update-different-root-expected.html</a></li>
<li><a href="#releasesWebKitGTKwebkit210LayoutTestssvgcustomfilterupdatedifferentroothtml">releases/WebKitGTK/webkit-2.10/LayoutTests/svg/custom/filter-update-different-root.html</a></li>
<li><a href="#releasesWebKitGTKwebkit210LayoutTestssvgcustompatternupdatedifferentrootexpectedhtml">releases/WebKitGTK/webkit-2.10/LayoutTests/svg/custom/pattern-update-different-root-expected.html</a></li>
<li><a href="#releasesWebKitGTKwebkit210LayoutTestssvgcustompatternupdatedifferentroothtml">releases/WebKitGTK/webkit-2.10/LayoutTests/svg/custom/pattern-update-different-root.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="releasesWebKitGTKwebkit210LayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.10/LayoutTests/ChangeLog (195662 => 195663)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/LayoutTests/ChangeLog        2016-01-27 12:28:26 UTC (rev 195662)
+++ releases/WebKitGTK/webkit-2.10/LayoutTests/ChangeLog        2016-01-27 12:34:15 UTC (rev 195663)
</span><span class="lines">@@ -1,3 +1,31 @@
</span><ins>+2016-01-21  Said Abou-Hallawa  &lt;sabouhallawa@apple.com&gt;
+
+        A crash reproducible in Path::isEmpty() under RenderSVGShape::paint()
+        https://bugs.webkit.org/show_bug.cgi?id=149613
+
+        Reviewed by Darin Adler.
+        
+        When running the layout of an SVG root and it has resources which are
+        referenced by clients in other SVG roots, make sure we run the layout
+        for these resources before running the layout for their clients.
+
+        * svg/custom/filter-update-different-root-expected.html: Added.
+        * svg/custom/filter-update-different-root.html: Added.
+        Without this patch this test crashes because we paint a dirty RenderSVGShape.
+        
+        * svg/custom/pattern-update-different-root-expected.html: Added.
+        * svg/custom/pattern-update-different-root.html: Added.
+        Without this patch this test works fine but it is good to have it to catch
+        cases where the SVG root needs to run re-layout for its children resources
+        and hence their clients if its size has changed.
+
+        * svg/custom/unicode-in-tspan-multi-svg-crash-expected.txt:
+        * svg/custom/unicode-in-tspan-multi-svg-crash.html:
+        This test was ported from Blink in http://trac.webkit.org/changeset/166420.
+        The expectation of this test was changed in Blink:
+        https://src.chromium.org/viewvc/blink?revision=158480&amp;view=revision.
+        
+
</ins><span class="cx"> 2016-01-20  Zalan Bujtas  &lt;zalan@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         http://victordarras.fr/cssgame/ doesn't work in Safari.
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit210LayoutTestssvgcustomfilterupdatedifferentrootexpectedhtml"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.10/LayoutTests/svg/custom/filter-update-different-root-expected.html (0 => 195663)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/LayoutTests/svg/custom/filter-update-different-root-expected.html                                (rev 0)
+++ releases/WebKitGTK/webkit-2.10/LayoutTests/svg/custom/filter-update-different-root-expected.html        2016-01-27 12:34:15 UTC (rev 195663)
</span><span class="lines">@@ -0,0 +1,8 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;body&gt;
+    &lt;svg&gt;
+        &lt;rect width=&quot;200&quot; height=&quot;100&quot; fill=&quot;green&quot;/&gt;
+    &lt;/svg&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit210LayoutTestssvgcustomfilterupdatedifferentroothtml"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.10/LayoutTests/svg/custom/filter-update-different-root.html (0 => 195663)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/LayoutTests/svg/custom/filter-update-different-root.html                                (rev 0)
+++ releases/WebKitGTK/webkit-2.10/LayoutTests/svg/custom/filter-update-different-root.html        2016-01-27 12:34:15 UTC (rev 195663)
</span><span class="lines">@@ -0,0 +1,39 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+  &lt;style&gt;
+    .dummy { }
+    .hide-second-path &gt; .second-path { display: none; }
+  &lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+    &lt;svg style=&quot;background-color: #fff&quot;&gt;
+        &lt;g id=&quot;parent-group&quot; class=&quot;hide-second-path&quot;&gt;
+            &lt;path id=&quot;id1&quot; d=&quot;m 0,0 H 100 V 100 H 0 z&quot; fill=&quot;red&quot;/&gt;
+            &lt;path id=&quot;id2&quot; d=&quot;m 0,0 H 100 V 100 H 0 z&quot; fill=&quot;green&quot; class=&quot;second-path&quot;/&gt;
+            &lt;g id=&quot;child-group&quot; filter=&quot;url(#nop-filter)&quot;&gt;
+                &lt;path id=&quot;id3&quot; d=&quot;m 100,0 H 200 V 100 H 100 z&quot; fill=&quot;green&quot;/&gt;
+                &lt;path id=&quot;id4&quot; d=&quot;m 100,0 H 200 V 100 H 100 z&quot; fill=&quot;red&quot; class=&quot;second-path&quot;/&gt;
+            &lt;/g&gt;
+        &lt;/g&gt;
+    &lt;/svg&gt;
+    &lt;svg&gt;
+        &lt;filter id=&quot;nop-filter&quot;&gt;
+            &lt;feOffset dx=&quot;0&quot; dy=&quot;0&quot;/&gt;
+        &lt;/filter&gt;
+    &lt;/svg&gt;
+    &lt;script&gt;
+        if (window.testRunner)
+            testRunner.waitUntilDone();
+        setTimeout(function() {
+            document.styleSheets[0].deleteRule(0);
+            setTimeout(function() {
+                document.getElementById('parent-group').removeAttribute('class');
+                document.getElementById('child-group').setAttribute('class', 'hide-second-path');
+                if (window.testRunner)
+                    testRunner.notifyDone();
+              }, 50);
+          }, 50);
+    &lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit210LayoutTestssvgcustompatternupdatedifferentrootexpectedhtml"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.10/LayoutTests/svg/custom/pattern-update-different-root-expected.html (0 => 195663)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/LayoutTests/svg/custom/pattern-update-different-root-expected.html                                (rev 0)
+++ releases/WebKitGTK/webkit-2.10/LayoutTests/svg/custom/pattern-update-different-root-expected.html        2016-01-27 12:34:15 UTC (rev 195663)
</span><span class="lines">@@ -0,0 +1,16 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;style&gt;
+    svg {
+        width: 100px;
+        height: 100px;
+    }
+&lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+    &lt;svg&gt;
+        &lt;rect width=&quot;100%&quot; height=&quot;100%&quot; fill=&quot;green&quot;/&gt;
+    &lt;/svg&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit210LayoutTestssvgcustompatternupdatedifferentroothtml"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.10/LayoutTests/svg/custom/pattern-update-different-root.html (0 => 195663)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/LayoutTests/svg/custom/pattern-update-different-root.html                                (rev 0)
+++ releases/WebKitGTK/webkit-2.10/LayoutTests/svg/custom/pattern-update-different-root.html        2016-01-27 12:34:15 UTC (rev 195663)
</span><span class="lines">@@ -0,0 +1,22 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;style&gt;
+    svg {
+        width: 100px;
+        height: 100px;
+    }
+&lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+    &lt;svg&gt;
+        &lt;pattern id=&quot;r1&quot; width=&quot;100%&quot; height=&quot;100%&quot; xlink:href=&quot;#r2&quot; patternUnits=&quot;userSpaceOnUse&quot;/&gt;
+        &lt;rect width=&quot;100%&quot; height=&quot;100%&quot; fill=&quot;url(#r1)&quot;/&gt;
+    &lt;/svg&gt;
+    &lt;svg&gt;
+        &lt;pattern id=&quot;r2&quot;&gt;
+            &lt;rect width=&quot;100%&quot; height=&quot;100%&quot; fill=&quot;green&quot;/&gt;
+        &lt;/pattern&gt;
+    &lt;/svg&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit210LayoutTestssvgcustomunicodeintspanmultisvgcrashexpectedtxt"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.10/LayoutTests/svg/custom/unicode-in-tspan-multi-svg-crash-expected.txt (195662 => 195663)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/LayoutTests/svg/custom/unicode-in-tspan-multi-svg-crash-expected.txt        2016-01-27 12:28:26 UTC (rev 195662)
+++ releases/WebKitGTK/webkit-2.10/LayoutTests/svg/custom/unicode-in-tspan-multi-svg-crash-expected.txt        2016-01-27 12:34:15 UTC (rev 195663)
</span><span class="lines">@@ -1,2 +1,3 @@
</span><ins>+
</ins><span class="cx">  
</span><del>-Test Passes if there is no crash in Debug or Asan builds. There should be no characters preceding &quot;Test&quot;.
</del><ins>+Test Passes if there is no crash in Debug or Asan builds.
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit210LayoutTestssvgcustomunicodeintspanmultisvgcrashhtml"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.10/LayoutTests/svg/custom/unicode-in-tspan-multi-svg-crash.html (195662 => 195663)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/LayoutTests/svg/custom/unicode-in-tspan-multi-svg-crash.html        2016-01-27 12:28:26 UTC (rev 195662)
+++ releases/WebKitGTK/webkit-2.10/LayoutTests/svg/custom/unicode-in-tspan-multi-svg-crash.html        2016-01-27 12:34:15 UTC (rev 195663)
</span><span class="lines">@@ -33,6 +33,6 @@
</span><span class="cx">       &lt;filter id=&quot;filterInSecondRoot&quot;/&gt;
</span><span class="cx">     &lt;/svg&gt;
</span><span class="cx"> 
</span><del>-    &lt;p&gt;Test Passes if there is no crash in Debug or Asan builds. There should be no characters preceding &quot;Test&quot;.&lt;/p&gt;
</del><ins>+    &lt;p&gt;Test Passes if there is no crash in Debug or Asan builds.&lt;/p&gt;
</ins><span class="cx">   &lt;/body&gt;
</span><span class="cx"> &lt;/html&gt;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit210SourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.10/Source/WebCore/ChangeLog (195662 => 195663)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/Source/WebCore/ChangeLog        2016-01-27 12:28:26 UTC (rev 195662)
+++ releases/WebKitGTK/webkit-2.10/Source/WebCore/ChangeLog        2016-01-27 12:34:15 UTC (rev 195663)
</span><span class="lines">@@ -1,3 +1,77 @@
</span><ins>+2016-01-21  Said Abou-Hallawa  &lt;sabouhallawa@apple.com&gt;
+
+        A crash reproducible in Path::isEmpty() under RenderSVGShape::paint()
+        https://bugs.webkit.org/show_bug.cgi?id=149613
+
+        Reviewed by Darin Adler.
+
+        When RenderSVGRoot::layout() realizes its layout size has changed and
+        it has resources which have relative sizes, it marks all the clients of
+        the resources for invalidates regardless whether they belong to the
+        same RenderSVGRoot or not. But it reruns the layout only for its children.
+        If one of these clients comes before the current RenderSVGRoot in the render
+        tree, ee end up having renderer marked for invalidation at rendering time.
+        This also prevents scheduling the layout if the same renderer is marked
+        for another invalidation later. We prevent this because we do not want
+        to schedule another layout for a renderer which is already marked for
+        invalidation. This can cause crash if the renderer is an RenderSVGPath.
+        
+        The fix is to mark &quot;only&quot; the clients of a resource which belong to the
+        same RenderSVGRoot of the resource. Also we need to run the layout for
+        all the resources which belong to different RenderSVGRoots before running
+        the layout for an SVG renderer.
+         
+        Tests: svg/custom/filter-update-different-root.html
+               svg/custom/pattern-update-different-root.html
+
+        * rendering/svg/RenderSVGResourceContainer.cpp:
+        (WebCore::RenderSVGResourceContainer::markAllClientsForInvalidation):
+        We should not mark any client outside the current root for invalidation
+        
+        * rendering/svg/RenderSVGResourceContainer.h: Remove unneeded private keyword.
+        
+        * rendering/svg/RenderSVGRoot.cpp:
+        (WebCore::RenderSVGRoot::addResourceForClientInvalidation):
+        Code clean up; use findTreeRootObject() instead of repeating the same code.
+        
+        * rendering/svg/RenderSVGShape.cpp:
+        (WebCore::RenderSVGShape::isEmpty): Avoid crashing if RenderSVGShape::isEmpty()
+        is called before calling RenderSVGShape::layout().
+         
+        * rendering/svg/RenderSVGText.cpp:
+        (WebCore::RenderSVGText::layout): findTreeRootObject() now returns a pointer.
+        
+        * rendering/svg/SVGRenderSupport.cpp:
+        (WebCore::SVGRenderSupport::findTreeRootObject): I do think nothing 
+        guarantees that an SVG renderer has to have an RenderSVGRoot in its
+        ancestors. So change this function to return a pointer. Also Provide
+        the non-const version of this function.
+         
+        (WebCore::SVGRenderSupport::layoutDifferentRootIfNeeded): Runs the layout
+        if needed for all the resources which belong to different RenderSVGRoots.
+        
+        (WebCore::SVGRenderSupport::layoutChildren): Make sure all the renderer's
+        resources which belong to different RenderSVGRoots are laid out before
+        running the layout for this renderer.
+        
+        * rendering/svg/SVGRenderSupport.h: Remove a mysterious comment.
+        
+        * rendering/svg/SVGResources.cpp:
+        (WebCore::SVGResources::layoutDifferentRootIfNeeded): Run the layout for
+        all the resources which belong to different RenderSVGRoots outside the
+        context of their RenderSVGRoots.
+        
+        * rendering/svg/SVGResources.h:
+        (WebCore::SVGResources::clipper):
+        (WebCore::SVGResources::markerStart):
+        (WebCore::SVGResources::markerMid):
+        (WebCore::SVGResources::markerEnd):
+        (WebCore::SVGResources::masker):
+        (WebCore::SVGResources::filter):
+        (WebCore::SVGResources::fill):
+        (WebCore::SVGResources::stroke):
+        Code clean up; use nullptr instead of 0.
+
</ins><span class="cx"> 2016-01-20  Zalan Bujtas  &lt;zalan@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         http://victordarras.fr/cssgame/ doesn't work in Safari.
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit210SourceWebCorerenderingsvgRenderSVGResourceContainercpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp (195662 => 195663)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp        2016-01-27 12:28:26 UTC (rev 195662)
+++ releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp        2016-01-27 12:34:15 UTC (rev 195663)
</span><span class="lines">@@ -94,8 +94,13 @@
</span><span class="cx">     m_isInvalidating = true;
</span><span class="cx">     bool needsLayout = mode == LayoutAndBoundariesInvalidation;
</span><span class="cx">     bool markForInvalidation = mode != ParentOnlyInvalidation;
</span><ins>+    auto* root = SVGRenderSupport::findTreeRootObject(*this);
</ins><span class="cx"> 
</span><span class="cx">     for (auto* client : m_clients) {
</span><ins>+        // We should not mark any client outside the current root for invalidation
+        if (root != SVGRenderSupport::findTreeRootObject(*client))
+            continue;
+
</ins><span class="cx">         if (is&lt;RenderSVGResourceContainer&gt;(*client)) {
</span><span class="cx">             downcast&lt;RenderSVGResourceContainer&gt;(*client).removeAllClientsFromCache(markForInvalidation);
</span><span class="cx">             continue;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit210SourceWebCorerenderingsvgRenderSVGResourceContainerh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/RenderSVGResourceContainer.h (195662 => 195663)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/RenderSVGResourceContainer.h        2016-01-27 12:28:26 UTC (rev 195662)
+++ releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/RenderSVGResourceContainer.h        2016-01-27 12:34:15 UTC (rev 195663)
</span><span class="lines">@@ -66,7 +66,6 @@
</span><span class="cx">     void addClient(RenderElement&amp;);
</span><span class="cx">     void removeClient(RenderElement&amp;);
</span><span class="cx"> 
</span><del>-private:
</del><span class="cx">     virtual void willBeDestroyed() override final;
</span><span class="cx">     void registerResource();
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit210SourceWebCorerenderingsvgRenderSVGRootcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/RenderSVGRoot.cpp (195662 => 195663)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/RenderSVGRoot.cpp        2016-01-27 12:28:26 UTC (rev 195662)
+++ releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/RenderSVGRoot.cpp        2016-01-27 12:34:15 UTC (rev 195663)
</span><span class="lines">@@ -443,12 +443,10 @@
</span><span class="cx"> 
</span><span class="cx"> void RenderSVGRoot::addResourceForClientInvalidation(RenderSVGResourceContainer* resource)
</span><span class="cx"> {
</span><del>-    RenderElement* svgRoot = resource-&gt;parent();
-    while (svgRoot &amp;&amp; !is&lt;RenderSVGRoot&gt;(*svgRoot))
-        svgRoot = svgRoot-&gt;parent();
</del><ins>+    RenderSVGRoot* svgRoot = SVGRenderSupport::findTreeRootObject(*resource);
</ins><span class="cx">     if (!svgRoot)
</span><span class="cx">         return;
</span><del>-    downcast&lt;RenderSVGRoot&gt;(*svgRoot).m_resourcesNeedingToInvalidateClients.add(resource);
</del><ins>+    svgRoot-&gt;m_resourcesNeedingToInvalidateClients.add(resource);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit210SourceWebCorerenderingsvgRenderSVGShapecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/RenderSVGShape.cpp (195662 => 195663)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/RenderSVGShape.cpp        2016-01-27 12:28:26 UTC (rev 195662)
+++ releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/RenderSVGShape.cpp        2016-01-27 12:34:15 UTC (rev 195663)
</span><span class="lines">@@ -89,7 +89,11 @@
</span><span class="cx"> 
</span><span class="cx"> bool RenderSVGShape::isEmpty() const
</span><span class="cx"> {
</span><del>-    return path().isEmpty();
</del><ins>+    // This function should never be called before assigning a new Path to m_path.
+    // But this bug can happen if this renderer was created and its layout was not
+    // done before painting. Assert this did not happen but do not crash.
+    ASSERT(hasPath());
+    return !hasPath() || path().isEmpty();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RenderSVGShape::fillShape(GraphicsContext* context) const
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit210SourceWebCorerenderingsvgRenderSVGTextcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/RenderSVGText.cpp (195662 => 195663)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/RenderSVGText.cpp        2016-01-27 12:28:26 UTC (rev 195662)
+++ releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/RenderSVGText.cpp        2016-01-27 12:34:15 UTC (rev 195663)
</span><span class="lines">@@ -371,7 +371,7 @@
</span><span class="cx">         m_needsReordering = true;
</span><span class="cx">         m_needsPositioningValuesUpdate = false;
</span><span class="cx">         updateCachedBoundariesInParents = true;
</span><del>-    } else if (m_needsTextMetricsUpdate || SVGRenderSupport::findTreeRootObject(*this).isLayoutSizeChanged()) {
</del><ins>+    } else if (m_needsTextMetricsUpdate || SVGRenderSupport::findTreeRootObject(*this)-&gt;isLayoutSizeChanged()) {
</ins><span class="cx">         // If the root layout size changed (eg. window size changes) or the transform to the root
</span><span class="cx">         // context has changed then recompute the on-screen font size.
</span><span class="cx">         updateFontInAllDescendants(this, &amp;m_layoutAttributesBuilder);
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit210SourceWebCorerenderingsvgSVGRenderSupportcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/SVGRenderSupport.cpp (195662 => 195663)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/SVGRenderSupport.cpp        2016-01-27 12:28:26 UTC (rev 195662)
+++ releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/SVGRenderSupport.cpp        2016-01-27 12:34:15 UTC (rev 195663)
</span><span class="lines">@@ -184,11 +184,16 @@
</span><span class="cx">     return localTransform.mapRect(localRepaintRect).intersects(paintInfo.rect);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-const RenderSVGRoot&amp; SVGRenderSupport::findTreeRootObject(const RenderElement&amp; start)
</del><ins>+RenderSVGRoot* SVGRenderSupport::findTreeRootObject(RenderElement&amp; start)
</ins><span class="cx"> {
</span><del>-    return *lineageOfType&lt;RenderSVGRoot&gt;(start).first();
</del><ins>+    return lineageOfType&lt;RenderSVGRoot&gt;(start).first();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+const RenderSVGRoot* SVGRenderSupport::findTreeRootObject(const RenderElement&amp; start)
+{
+    return lineageOfType&lt;RenderSVGRoot&gt;(start).first();
+}
+
</ins><span class="cx"> static inline void invalidateResourcesOfChildren(RenderElement&amp; renderer)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(!renderer.needsLayout());
</span><span class="lines">@@ -225,6 +230,15 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void SVGRenderSupport::layoutDifferentRootIfNeeded(const RenderElement&amp; renderer)
+{
+    if (auto* resources = SVGResourcesCache::cachedResourcesForRenderer(renderer)) {
+        auto* svgRoot = SVGRenderSupport::findTreeRootObject(renderer);
+        ASSERT(svgRoot);
+        resources-&gt;layoutDifferentRootIfNeeded(svgRoot);
+    }
+}
+
</ins><span class="cx"> void SVGRenderSupport::layoutChildren(RenderElement&amp; start, bool selfNeedsLayout)
</span><span class="cx"> {
</span><span class="cx">     bool layoutSizeChanged = layoutSizeOfNearestViewportChanged(start);
</span><span class="lines">@@ -273,6 +287,7 @@
</span><span class="cx">             child-&gt;setNeedsLayout(MarkOnlyThis);
</span><span class="cx"> 
</span><span class="cx">         if (child-&gt;needsLayout()) {
</span><ins>+            layoutDifferentRootIfNeeded(downcast&lt;RenderElement&gt;(*child));
</ins><span class="cx">             downcast&lt;RenderElement&gt;(*child).layout();
</span><span class="cx">             // Renderers are responsible for repainting themselves when changing, except
</span><span class="cx">             // for the initial paint to avoid potential double-painting caused by non-sensical &quot;old&quot; bounds.
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit210SourceWebCorerenderingsvgSVGRenderSupporth"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/SVGRenderSupport.h (195662 => 195663)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/SVGRenderSupport.h        2016-01-27 12:28:26 UTC (rev 195662)
+++ releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/SVGRenderSupport.h        2016-01-27 12:34:15 UTC (rev 195663)
</span><span class="lines">@@ -44,6 +44,8 @@
</span><span class="cx"> // SVGRendererSupport is a helper class sharing code between all SVG renderers.
</span><span class="cx"> class SVGRenderSupport {
</span><span class="cx"> public:
</span><ins>+    static void layoutDifferentRootIfNeeded(const RenderElement&amp;);
+
</ins><span class="cx">     // Shares child layouting code between RenderSVGRoot/RenderSVG(Hidden)Container
</span><span class="cx">     static void layoutChildren(RenderElement&amp;, bool selfNeedsLayout);
</span><span class="cx"> 
</span><span class="lines">@@ -91,8 +93,8 @@
</span><span class="cx">     static void updateMaskedAncestorShouldIsolateBlending(const RenderElement&amp;);
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    // FIXME: These methods do not belong here.
-    static const RenderSVGRoot&amp; findTreeRootObject(const RenderElement&amp;);
</del><ins>+    static RenderSVGRoot* findTreeRootObject(RenderElement&amp;);
+    static const RenderSVGRoot* findTreeRootObject(const RenderElement&amp;);
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     // This class is not constructable.
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit210SourceWebCorerenderingsvgSVGResourcescpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/SVGResources.cpp (195662 => 195663)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/SVGResources.cpp        2016-01-27 12:28:26 UTC (rev 195662)
+++ releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/SVGResources.cpp        2016-01-27 12:34:15 UTC (rev 195663)
</span><span class="lines">@@ -24,6 +24,7 @@
</span><span class="cx"> #include &quot;RenderSVGResourceFilter.h&quot;
</span><span class="cx"> #include &quot;RenderSVGResourceMarker.h&quot;
</span><span class="cx"> #include &quot;RenderSVGResourceMasker.h&quot;
</span><ins>+#include &quot;RenderSVGRoot.h&quot;
</ins><span class="cx"> #include &quot;SVGGradientElement.h&quot;
</span><span class="cx"> #include &quot;SVGNames.h&quot;
</span><span class="cx"> #include &quot;SVGPaint.h&quot;
</span><span class="lines">@@ -273,6 +274,27 @@
</span><span class="cx">     return foundResources;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void SVGResources::layoutDifferentRootIfNeeded(const RenderSVGRoot* svgRoot)
+{
+    if (clipper() &amp;&amp; svgRoot != SVGRenderSupport::findTreeRootObject(*clipper()))
+        clipper()-&gt;layoutIfNeeded();
+
+    if (masker() &amp;&amp; svgRoot != SVGRenderSupport::findTreeRootObject(*masker()))
+        masker()-&gt;layoutIfNeeded();
+
+    if (filter() &amp;&amp; svgRoot != SVGRenderSupport::findTreeRootObject(*filter()))
+        filter()-&gt;layoutIfNeeded();
+
+    if (markerStart() &amp;&amp; svgRoot != SVGRenderSupport::findTreeRootObject(*markerStart()))
+        markerStart()-&gt;layoutIfNeeded();
+
+    if (markerMid() &amp;&amp; svgRoot != SVGRenderSupport::findTreeRootObject(*markerMid()))
+        markerMid()-&gt;layoutIfNeeded();
+
+    if (markerEnd() &amp;&amp; svgRoot != SVGRenderSupport::findTreeRootObject(*markerEnd()))
+        markerEnd()-&gt;layoutIfNeeded();
+}
+
</ins><span class="cx"> void SVGResources::removeClientFromCache(RenderElement&amp; renderer, bool markForInvalidation) const
</span><span class="cx"> {
</span><span class="cx">     if (!m_clipperFilterMaskerData &amp;&amp; !m_markerData &amp;&amp; !m_fillStrokeData &amp;&amp; !m_linkedResource)
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit210SourceWebCorerenderingsvgSVGResourcesh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/SVGResources.h (195662 => 195663)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/SVGResources.h        2016-01-27 12:28:26 UTC (rev 195662)
+++ releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/svg/SVGResources.h        2016-01-27 12:34:15 UTC (rev 195663)
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx"> class RenderSVGResourceFilter;
</span><span class="cx"> class RenderSVGResourceMarker;
</span><span class="cx"> class RenderSVGResourceMasker;
</span><ins>+class RenderSVGRoot;
</ins><span class="cx"> class SVGRenderStyle;
</span><span class="cx"> 
</span><span class="cx"> // Holds a set of resources associated with a RenderObject
</span><span class="lines">@@ -43,24 +44,19 @@
</span><span class="cx">     SVGResources();
</span><span class="cx"> 
</span><span class="cx">     bool buildCachedResources(const RenderElement&amp;, const SVGRenderStyle&amp;);
</span><ins>+    void layoutDifferentRootIfNeeded(const RenderSVGRoot*);
</ins><span class="cx"> 
</span><span class="cx">     // Ordinary resources
</span><del>-    RenderSVGResourceClipper* clipper() const { return m_clipperFilterMaskerData ? m_clipperFilterMaskerData-&gt;clipper : 0; }
-    RenderSVGResourceMarker* markerStart() const { return m_markerData ? m_markerData-&gt;markerStart : 0; }
-    RenderSVGResourceMarker* markerMid() const { return m_markerData ? m_markerData-&gt;markerMid : 0; }
-    RenderSVGResourceMarker* markerEnd() const { return m_markerData ? m_markerData-&gt;markerEnd : 0; }
-    RenderSVGResourceMasker* masker() const { return m_clipperFilterMaskerData ? m_clipperFilterMaskerData-&gt;masker : 0; }
</del><ins>+    RenderSVGResourceClipper* clipper() const { return m_clipperFilterMaskerData ? m_clipperFilterMaskerData-&gt;clipper : nullptr; }
+    RenderSVGResourceMarker* markerStart() const { return m_markerData ? m_markerData-&gt;markerStart : nullptr; }
+    RenderSVGResourceMarker* markerMid() const { return m_markerData ? m_markerData-&gt;markerMid : nullptr; }
+    RenderSVGResourceMarker* markerEnd() const { return m_markerData ? m_markerData-&gt;markerEnd : nullptr; }
+    RenderSVGResourceMasker* masker() const { return m_clipperFilterMaskerData ? m_clipperFilterMaskerData-&gt;masker : nullptr; }
+    RenderSVGResourceFilter* filter() const { return m_clipperFilterMaskerData ? m_clipperFilterMaskerData-&gt;filter : nullptr; }
</ins><span class="cx"> 
</span><del>-    RenderSVGResourceFilter* filter() const
-    {
-        if (m_clipperFilterMaskerData)
-            return m_clipperFilterMaskerData-&gt;filter;
-        return 0;
-    }
-
</del><span class="cx">     // Paint servers
</span><del>-    RenderSVGResourceContainer* fill() const { return m_fillStrokeData ? m_fillStrokeData-&gt;fill : 0; }
-    RenderSVGResourceContainer* stroke() const { return m_fillStrokeData ? m_fillStrokeData-&gt;stroke : 0; }
</del><ins>+    RenderSVGResourceContainer* fill() const { return m_fillStrokeData ? m_fillStrokeData-&gt;fill : nullptr; }
+    RenderSVGResourceContainer* stroke() const { return m_fillStrokeData ? m_fillStrokeData-&gt;stroke : nullptr; }
</ins><span class="cx"> 
</span><span class="cx">     // Chainable resources - linked through xlink:href
</span><span class="cx">     RenderSVGResourceContainer* linkedResource() const { return m_linkedResource; }
</span></span></pre>
</div>
</div>

</body>
</html>