<!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>[213967] 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/213967">213967</a></dd>
<dt>Author</dt> <dd>wenson_hsieh@apple.com</dd>
<dt>Date</dt> <dd>2017-03-14 18:20:57 -0700 (Tue, 14 Mar 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>RenderElements should unregister for viewport visibility callbacks when they are destroyed
https://bugs.webkit.org/show_bug.cgi?id=169521
&lt;rdar://problem/30959545&gt;

Reviewed by Simon Fraser.

Source/WebCore:

When registering a RenderElement for viewport visibility callbacks, we always need to make sure that it is unregistered
before it is destroyed. While we account for this in the destructor of RenderElement, we only unregister in the destructor
if we are already registered for visibility callbacks. In the call to RenderObject::willBeDestroyed(), we clear out rare
data, which holds RenderElement's viewport callback registration state, so upon entering the destructor of RenderElement,
we skip unregistration because RenderElement thinks that it is not registered.

We can mitigate this by unregistering the RenderElement earlier, in RenderElement::willBeDestroyed, prior to clearing out
the rare data. However, we'd ideally want to move the cleanup logic out of the destructor altogether and into willBeDestroyed
(see https://bugs.webkit.org/show_bug.cgi?id=169650).

Test: fast/media/video-element-in-details-collapse.html

* rendering/RenderElement.cpp:
(WebCore::RenderElement::willBeDestroyed):

LayoutTests:

Adds a new layout test covering this regression. See WebCore ChangeLog for more details.

* fast/media/video-element-in-details-collapse-expected.txt: Added.
* fast/media/video-element-in-details-collapse.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="#trunkSourceWebCorerenderingRenderElementcpp">trunk/Source/WebCore/rendering/RenderElement.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfastmediavideoelementindetailscollapseexpectedtxt">trunk/LayoutTests/fast/media/video-element-in-details-collapse-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastmediavideoelementindetailscollapsehtml">trunk/LayoutTests/fast/media/video-element-in-details-collapse.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (213966 => 213967)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2017-03-15 00:53:17 UTC (rev 213966)
+++ trunk/LayoutTests/ChangeLog        2017-03-15 01:20:57 UTC (rev 213967)
</span><span class="lines">@@ -1,3 +1,16 @@
</span><ins>+2017-03-14  Wenson Hsieh  &lt;wenson_hsieh@apple.com&gt;
+
+        RenderElements should unregister for viewport visibility callbacks when they are destroyed
+        https://bugs.webkit.org/show_bug.cgi?id=169521
+        &lt;rdar://problem/30959545&gt;
+
+        Reviewed by Simon Fraser.
+
+        Adds a new layout test covering this regression. See WebCore ChangeLog for more details.
+
+        * fast/media/video-element-in-details-collapse-expected.txt: Added.
+        * fast/media/video-element-in-details-collapse.html: Added.
+
</ins><span class="cx"> 2017-03-14  Andy Estes  &lt;aestes@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Update ApplePaySession.html after r213949
</span></span></pre></div>
<a id="trunkLayoutTestsfastmediavideoelementindetailscollapseexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/media/video-element-in-details-collapse-expected.txt (0 => 213967)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/media/video-element-in-details-collapse-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/media/video-element-in-details-collapse-expected.txt        2017-03-15 01:20:57 UTC (rev 213967)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+hi
</ins></span></pre></div>
<a id="trunkLayoutTestsfastmediavideoelementindetailscollapsehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/media/video-element-in-details-collapse.html (0 => 213967)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/media/video-element-in-details-collapse.html                                (rev 0)
+++ trunk/LayoutTests/fast/media/video-element-in-details-collapse.html        2017-03-15 01:20:57 UTC (rev 213967)
</span><span class="lines">@@ -0,0 +1,14 @@
</span><ins>+&lt;details id=&quot;details&quot; open&gt;hi&lt;video width=480 height=320&gt;&lt;/details&gt;
+&lt;script&gt;
+details.focus();
+details.open = false;
+window.onclick = () =&gt; {
+    details.open = true;
+}
+if (window.testRunner &amp;&amp; window.eventSender) {
+    testRunner.dumpAsText();
+    eventSender.mouseMoveTo(innerWidth / 2, innerHeight / 2);
+    eventSender.mouseDown();
+    eventSender.mouseUp();
+}
+&lt;/script&gt;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (213966 => 213967)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2017-03-15 00:53:17 UTC (rev 213966)
+++ trunk/Source/WebCore/ChangeLog        2017-03-15 01:20:57 UTC (rev 213967)
</span><span class="lines">@@ -1,3 +1,26 @@
</span><ins>+2017-03-14  Wenson Hsieh  &lt;wenson_hsieh@apple.com&gt;
+
+        RenderElements should unregister for viewport visibility callbacks when they are destroyed
+        https://bugs.webkit.org/show_bug.cgi?id=169521
+        &lt;rdar://problem/30959545&gt;
+
+        Reviewed by Simon Fraser.
+
+        When registering a RenderElement for viewport visibility callbacks, we always need to make sure that it is unregistered
+        before it is destroyed. While we account for this in the destructor of RenderElement, we only unregister in the destructor
+        if we are already registered for visibility callbacks. In the call to RenderObject::willBeDestroyed(), we clear out rare
+        data, which holds RenderElement's viewport callback registration state, so upon entering the destructor of RenderElement,
+        we skip unregistration because RenderElement thinks that it is not registered.
+
+        We can mitigate this by unregistering the RenderElement earlier, in RenderElement::willBeDestroyed, prior to clearing out
+        the rare data. However, we'd ideally want to move the cleanup logic out of the destructor altogether and into willBeDestroyed
+        (see https://bugs.webkit.org/show_bug.cgi?id=169650).
+
+        Test: fast/media/video-element-in-details-collapse.html
+
+        * rendering/RenderElement.cpp:
+        (WebCore::RenderElement::willBeDestroyed):
+
</ins><span class="cx"> 2017-03-14  Dean Jackson  &lt;dino@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Rename LayerTypeWebGLLayer and use it for both WebGL and WebGPU
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderElement.cpp (213966 => 213967)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderElement.cpp        2017-03-15 00:53:17 UTC (rev 213966)
+++ trunk/Source/WebCore/rendering/RenderElement.cpp        2017-03-15 01:20:57 UTC (rev 213967)
</span><span class="lines">@@ -1132,6 +1132,9 @@
</span><span class="cx"> 
</span><span class="cx">     destroyLeftoverChildren();
</span><span class="cx"> 
</span><ins>+    if (isRegisteredForVisibleInViewportCallback())
+        unregisterForVisibleInViewportCallback();
+
</ins><span class="cx">     if (hasCounterNodeMap())
</span><span class="cx">         RenderCounter::destroyCounterNodes(*this);
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>