<!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>[171074] 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/171074">171074</a></dd>
<dt>Author</dt> <dd>hyatt@apple.com</dd>
<dt>Date</dt> <dd>2014-07-14 12:51:28 -0700 (Mon, 14 Jul 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>&lt;rdar://problem/17305458&gt; Cannot interact with video controls in ePubs
Bug 134836 - [New Multicolumn] Crawl to check for compositing between us and the enclosingPaginationLayer
https://bugs.webkit.org/show_bug.cgi?id=134836

Reviewed by Dean Jackson.

The paginatedAndComposited bit being set in updateLayerPositions just didn't work, since compositing states
can change without triggering that function. This patch just gets rid of the bit and does a crawl every time
to check. This ensures that changes in compositing states don't necessitate any changes in pagination,
since the lookup will always check the current compositing state.
        
The new function that does this check is hasCompositedLayerInEnclosingPaginationChain.
        
I have been unable to reproduce this issue, and this is therefore a purely speculative fix. I have no test
case to provide because of this.

* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::RenderLayer):
(WebCore::RenderLayer::updateLayerPositions):
(WebCore::RenderLayer::hasCompositedLayerInEnclosingPaginationChain):
(WebCore::RenderLayer::updatePagination):
* rendering/RenderLayer.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayercpp">trunk/Source/WebCore/rendering/RenderLayer.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayerh">trunk/Source/WebCore/rendering/RenderLayer.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (171073 => 171074)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-07-14 19:15:24 UTC (rev 171073)
+++ trunk/Source/WebCore/ChangeLog        2014-07-14 19:51:28 UTC (rev 171074)
</span><span class="lines">@@ -1,3 +1,28 @@
</span><ins>+2014-07-11  David Hyatt  &lt;hyatt@apple.com&gt;
+
+        &lt;rdar://problem/17305458&gt; Cannot interact with video controls in ePubs
+        Bug 134836 - [New Multicolumn] Crawl to check for compositing between us and the enclosingPaginationLayer
+        https://bugs.webkit.org/show_bug.cgi?id=134836
+
+        Reviewed by Dean Jackson.
+
+        The paginatedAndComposited bit being set in updateLayerPositions just didn't work, since compositing states
+        can change without triggering that function. This patch just gets rid of the bit and does a crawl every time
+        to check. This ensures that changes in compositing states don't necessitate any changes in pagination,
+        since the lookup will always check the current compositing state.
+        
+        The new function that does this check is hasCompositedLayerInEnclosingPaginationChain.
+        
+        I have been unable to reproduce this issue, and this is therefore a purely speculative fix. I have no test
+        case to provide because of this.
+
+        * rendering/RenderLayer.cpp:
+        (WebCore::RenderLayer::RenderLayer):
+        (WebCore::RenderLayer::updateLayerPositions):
+        (WebCore::RenderLayer::hasCompositedLayerInEnclosingPaginationChain):
+        (WebCore::RenderLayer::updatePagination):
+        * rendering/RenderLayer.h:
+
</ins><span class="cx"> 2014-07-14  Zalan Bujtas  &lt;zalan@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Move composite bounds calculation to RenderLayerBacking.
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (171073 => 171074)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayer.cpp        2014-07-14 19:15:24 UTC (rev 171073)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp        2014-07-14 19:51:28 UTC (rev 171074)
</span><span class="lines">@@ -199,7 +199,6 @@
</span><span class="cx">     , m_staticInlinePosition(0)
</span><span class="cx">     , m_staticBlockPosition(0)
</span><span class="cx">     , m_enclosingPaginationLayer(0)
</span><del>-    , m_enclosingLayerIsPaginatedAndComposited(false)
</del><span class="cx"> {
</span><span class="cx">     m_isNormalFlowOnly = shouldBeNormalFlowOnly();
</span><span class="cx">     m_isSelfPaintingLayer = shouldBeSelfPaintingLayer();
</span><span class="lines">@@ -382,10 +381,8 @@
</span><span class="cx"> 
</span><span class="cx">     if (flags &amp; UpdatePagination)
</span><span class="cx">         updatePagination();
</span><del>-    else {
</del><ins>+    else
</ins><span class="cx">         m_enclosingPaginationLayer = nullptr;
</span><del>-        m_enclosingLayerIsPaginatedAndComposited = false;
-    }
</del><span class="cx">     
</span><span class="cx">     if (m_hasVisibleContent) {
</span><span class="cx">         // FIXME: LayoutState does not work with RenderLayers as there is not a 1-to-1
</span><span class="lines">@@ -916,10 +913,46 @@
</span><span class="cx">     return 0;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+// FIXME: This is terrible. Bring back a cached bit for this someday. This crawl is going to slow down all
+// painting of content inside paginated layers.
+bool RenderLayer::hasCompositedLayerInEnclosingPaginationChain() const
+{
+    // No enclosing layer means no compositing in the chain.
+    if (!m_enclosingPaginationLayer)
+        return false;
+    
+    // If the enclosing layer is composited, we don't have to check anything in between us and that
+    // layer.
+    if (m_enclosingPaginationLayer-&gt;isComposited())
+        return true;
+
+    // If we are the enclosing pagination layer, then we can't be composited or we'd have passed the
+    // previous check.
+    if (m_enclosingPaginationLayer == this)
+        return false;
+
+    // The enclosing paginated layer is our ancestor and is not composited, so we have to check
+    // intermediate layers between us and the enclosing pagination layer. Start with our own layer.
+    if (isComposited())
+        return true;
+    
+    // For normal flow layers, we can recur up the layer tree.
+    if (isNormalFlowOnly())
+        return parent()-&gt;hasCompositedLayerInEnclosingPaginationChain();
+    
+    // Otherwise we have to go up the containing block chain. Find the first enclosing
+    // containing block layer ancestor, and check that.
+    RenderView* renderView = &amp;renderer().view();
+    for (RenderBlock* containingBlock = renderer().containingBlock(); containingBlock &amp;&amp; containingBlock != renderView; containingBlock = containingBlock-&gt;containingBlock()) {
+        if (containingBlock-&gt;hasLayer())
+            return containingBlock-&gt;layer()-&gt;hasCompositedLayerInEnclosingPaginationChain();
+    }
+    return false;
+}
+
</ins><span class="cx"> void RenderLayer::updatePagination()
</span><span class="cx"> {
</span><span class="cx">     m_enclosingPaginationLayer = nullptr;
</span><del>-    m_enclosingLayerIsPaginatedAndComposited = false;
</del><span class="cx">     
</span><span class="cx">     if (!parent())
</span><span class="cx">         return;
</span><span class="lines">@@ -930,7 +963,6 @@
</span><span class="cx">     // to that layer easily.
</span><span class="cx">     if (renderer().isInFlowRenderFlowThread()) {
</span><span class="cx">         m_enclosingPaginationLayer = this;
</span><del>-        m_enclosingLayerIsPaginatedAndComposited = isComposited();
</del><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -938,13 +970,10 @@
</span><span class="cx">         // Content inside a transform is not considered to be paginated, since we simply
</span><span class="cx">         // paint the transform multiple times in each column, so we don't have to use
</span><span class="cx">         // fragments for the transformed content.
</span><del>-        if (parent()-&gt;hasTransform()) {
</del><ins>+        if (parent()-&gt;hasTransform())
</ins><span class="cx">             m_enclosingPaginationLayer = nullptr;
</span><del>-            m_enclosingLayerIsPaginatedAndComposited = false;
-        } else {
</del><ins>+        else
</ins><span class="cx">             m_enclosingPaginationLayer = parent()-&gt;enclosingPaginationLayer(IncludeCompositedPaginatedLayers);
</span><del>-            m_enclosingLayerIsPaginatedAndComposited = isComposited() ? true : parent()-&gt;enclosingLayerIsPaginatedAndComposited();
-        }
</del><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -957,13 +986,10 @@
</span><span class="cx">             // Content inside a transform is not considered to be paginated, since we simply
</span><span class="cx">             // paint the transform multiple times in each column, so we don't have to use
</span><span class="cx">             // fragments for the transformed content.
</span><del>-            if (containingBlock-&gt;layer()-&gt;hasTransform()) {
</del><ins>+            if (containingBlock-&gt;layer()-&gt;hasTransform())
</ins><span class="cx">                 m_enclosingPaginationLayer = nullptr;
</span><del>-                m_enclosingLayerIsPaginatedAndComposited = false;
-            } else {
</del><ins>+            else
</ins><span class="cx">                 m_enclosingPaginationLayer = containingBlock-&gt;layer()-&gt;enclosingPaginationLayer(IncludeCompositedPaginatedLayers);
</span><del>-                m_enclosingLayerIsPaginatedAndComposited = isComposited() ? true : containingBlock-&gt;layer()-&gt;enclosingLayerIsPaginatedAndComposited();
-            }
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayer.h (171073 => 171074)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayer.h        2014-07-14 19:15:24 UTC (rev 171073)
+++ trunk/Source/WebCore/rendering/RenderLayer.h        2014-07-14 19:51:28 UTC (rev 171074)
</span><span class="lines">@@ -514,14 +514,14 @@
</span><span class="cx"> 
</span><span class="cx">     void positionNewlyCreatedOverflowControls();
</span><span class="cx"> 
</span><ins>+    bool hasCompositedLayerInEnclosingPaginationChain() const;
</ins><span class="cx">     enum PaginationInclusionMode { ExcludeCompositedPaginatedLayers, IncludeCompositedPaginatedLayers };
</span><span class="cx">     RenderLayer* enclosingPaginationLayer(PaginationInclusionMode mode) const
</span><span class="cx">     {
</span><del>-        if (mode == ExcludeCompositedPaginatedLayers &amp;&amp; m_enclosingLayerIsPaginatedAndComposited)
</del><ins>+        if (mode == ExcludeCompositedPaginatedLayers &amp;&amp; hasCompositedLayerInEnclosingPaginationChain())
</ins><span class="cx">             return nullptr;
</span><span class="cx">         return m_enclosingPaginationLayer;
</span><span class="cx">     }
</span><del>-    bool enclosingLayerIsPaginatedAndComposited() const { return m_enclosingLayerIsPaginatedAndComposited; }
</del><span class="cx"> 
</span><span class="cx">     void updateTransform();
</span><span class="cx">     
</span><span class="lines">@@ -1337,7 +1337,6 @@
</span><span class="cx"> 
</span><span class="cx">     // Pointer to the enclosing RenderLayer that caused us to be paginated. It is 0 if we are not paginated.
</span><span class="cx">     RenderLayer* m_enclosingPaginationLayer;
</span><del>-    bool m_enclosingLayerIsPaginatedAndComposited;
</del><span class="cx"> 
</span><span class="cx">     IntRect m_blockSelectionGapsBounds;
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>