<!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>[169651] 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/169651">169651</a></dd>
<dt>Author</dt> <dd>hyatt@apple.com</dd>
<dt>Date</dt> <dd>2014-06-06 10:57:44 -0700 (Fri, 06 Jun 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>REGRESSION: Hit testing of composited elements is broken in new multicolumn layout.
https://bugs.webkit.org/show_bug.cgi?id=133522 (&lt;rdar://problem/17060556&gt;)
        
Reviewed by Simon Fraser.


Source/WebCore: 
Hit testing for the new columns doesn't care about compositing but does still
need a pagination layer set to work. The old column code didn't care about this
because it was top down (and wrong). The new code lets each layer paint and hit
test its own fragments, so having a pagination layer set suddenly becomes relevant
for composited layers.
    
The solution is to cache whether or not the pagination layer crosses a compositing
boundary, and then to force call sites of enclosingPaginationLayer to pass an argument
indicating whether compositing layers should be included. Typically painting wants to
exclude them but hit testing wants to include them.

* page/FrameView.cpp:
(WebCore::updateLayerPositionFlags):
* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::RenderLayer):
(WebCore::RenderLayer::updateLayerPositions):
(WebCore::RenderLayer::updatePagination):
(WebCore::transparencyClipBox):
(WebCore::RenderLayer::paintLayer):
(WebCore::RenderLayer::paintLayerContents):
(WebCore::RenderLayer::enclosingPaginationLayerInSubtree):
(WebCore::RenderLayer::collectFragments):
(WebCore::RenderLayer::paintTransformedLayerIntoFragments):
(WebCore::RenderLayer::hitTestLayer):
(WebCore::RenderLayer::hitTestTransformedLayerInFragments):
(WebCore::RenderLayer::calculateClipRects):
* rendering/RenderLayer.h:
* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::requiresCompositingForPosition):

LayoutTests: 
* compositing/columns/hittest-composited-in-paginated-expected.txt:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestscompositingcolumnshittestcompositedinpaginatedexpectedtxt">trunk/LayoutTests/compositing/columns/hittest-composited-in-paginated-expected.txt</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorepageFrameViewcpp">trunk/Source/WebCore/page/FrameView.cpp</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>
<li><a href="#trunkSourceWebCorerenderingRenderLayerCompositorcpp">trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (169650 => 169651)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-06-06 17:41:36 UTC (rev 169650)
+++ trunk/LayoutTests/ChangeLog        2014-06-06 17:57:44 UTC (rev 169651)
</span><span class="lines">@@ -1,3 +1,12 @@
</span><ins>+2014-06-06  David Hyatt  &lt;hyatt@apple.com&gt;
+
+        REGRESSION: Hit testing of composited elements is broken in new multicolumn layout.
+        https://bugs.webkit.org/show_bug.cgi?id=133522 (&lt;rdar://problem/17060556&gt;)
+        
+        Reviewed by Simon Fraser.
+
+        * compositing/columns/hittest-composited-in-paginated-expected.txt:
+
</ins><span class="cx"> 2014-06-06  Simon Fraser  &lt;simon.fraser@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Latched scrolling tests are flakey on Mavericks
</span></span></pre></div>
<a id="trunkLayoutTestscompositingcolumnshittestcompositedinpaginatedexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/compositing/columns/hittest-composited-in-paginated-expected.txt (169650 => 169651)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/compositing/columns/hittest-composited-in-paginated-expected.txt        2014-06-06 17:41:36 UTC (rev 169650)
+++ trunk/LayoutTests/compositing/columns/hittest-composited-in-paginated-expected.txt        2014-06-06 17:57:44 UTC (rev 169651)
</span><span class="lines">@@ -1,4 +1,4 @@
</span><del>-Element at 500, 200: 
</del><ins>+Element at 500, 200: composited box
</ins><span class="cx"> (GraphicsLayer
</span><span class="cx">   (anchor 0.00 0.00)
</span><span class="cx">   (bounds 810.00 585.00)
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (169650 => 169651)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-06-06 17:41:36 UTC (rev 169650)
+++ trunk/Source/WebCore/ChangeLog        2014-06-06 17:57:44 UTC (rev 169651)
</span><span class="lines">@@ -1,3 +1,40 @@
</span><ins>+2014-06-05  David Hyatt  &lt;hyatt@apple.com&gt;
+
+        REGRESSION: Hit testing of composited elements is broken in new multicolumn layout.
+        https://bugs.webkit.org/show_bug.cgi?id=133522 (&lt;rdar://problem/17060556&gt;)
+        
+        Reviewed by Simon Fraser.
+
+        Hit testing for the new columns doesn't care about compositing but does still
+        need a pagination layer set to work. The old column code didn't care about this
+        because it was top down (and wrong). The new code lets each layer paint and hit
+        test its own fragments, so having a pagination layer set suddenly becomes relevant
+        for composited layers.
+    
+        The solution is to cache whether or not the pagination layer crosses a compositing
+        boundary, and then to force call sites of enclosingPaginationLayer to pass an argument
+        indicating whether compositing layers should be included. Typically painting wants to
+        exclude them but hit testing wants to include them.
+
+        * page/FrameView.cpp:
+        (WebCore::updateLayerPositionFlags):
+        * rendering/RenderLayer.cpp:
+        (WebCore::RenderLayer::RenderLayer):
+        (WebCore::RenderLayer::updateLayerPositions):
+        (WebCore::RenderLayer::updatePagination):
+        (WebCore::transparencyClipBox):
+        (WebCore::RenderLayer::paintLayer):
+        (WebCore::RenderLayer::paintLayerContents):
+        (WebCore::RenderLayer::enclosingPaginationLayerInSubtree):
+        (WebCore::RenderLayer::collectFragments):
+        (WebCore::RenderLayer::paintTransformedLayerIntoFragments):
+        (WebCore::RenderLayer::hitTestLayer):
+        (WebCore::RenderLayer::hitTestTransformedLayerInFragments):
+        (WebCore::RenderLayer::calculateClipRects):
+        * rendering/RenderLayer.h:
+        * rendering/RenderLayerCompositor.cpp:
+        (WebCore::RenderLayerCompositor::requiresCompositingForPosition):
+
</ins><span class="cx"> 2014-06-06  Kiran  &lt;kiran.guduru@samsung.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [MediaStream] 'get' prefix is missing for capabilities and constraints.
</span></span></pre></div>
<a id="trunkSourceWebCorepageFrameViewcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/FrameView.cpp (169650 => 169651)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/FrameView.cpp        2014-06-06 17:41:36 UTC (rev 169650)
+++ trunk/Source/WebCore/page/FrameView.cpp        2014-06-06 17:57:44 UTC (rev 169651)
</span><span class="lines">@@ -120,7 +120,7 @@
</span><span class="cx">         flags &amp;= ~RenderLayer::CheckForRepaint;
</span><span class="cx">         flags |= RenderLayer::NeedsFullRepaintInBacking;
</span><span class="cx">     }
</span><del>-    if (isRelayoutingSubtree &amp;&amp; layer-&gt;enclosingPaginationLayer())
</del><ins>+    if (isRelayoutingSubtree &amp;&amp; layer-&gt;enclosingPaginationLayer(RenderLayer::IncludeCompositedPaginatedLayers))
</ins><span class="cx">         flags |= RenderLayer::UpdatePagination;
</span><span class="cx">     return flags;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (169650 => 169651)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayer.cpp        2014-06-06 17:41:36 UTC (rev 169650)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp        2014-06-06 17:57:44 UTC (rev 169651)
</span><span class="lines">@@ -199,6 +199,7 @@
</span><span class="cx">     , m_staticInlinePosition(0)
</span><span class="cx">     , m_staticBlockPosition(0)
</span><span class="cx">     , m_enclosingPaginationLayer(0)
</span><ins>+    , m_enclosingLayerIsPaginatedAndComposited(false)
</ins><span class="cx"> {
</span><span class="cx">     m_isNormalFlowOnly = shouldBeNormalFlowOnly();
</span><span class="cx">     m_isSelfPaintingLayer = shouldBeSelfPaintingLayer();
</span><span class="lines">@@ -403,9 +404,11 @@
</span><span class="cx"> 
</span><span class="cx">     if (flags &amp; UpdatePagination)
</span><span class="cx">         updatePagination();
</span><del>-    else
-        m_enclosingPaginationLayer = 0;
-
</del><ins>+    else {
+        m_enclosingPaginationLayer = nullptr;
+        m_enclosingLayerIsPaginatedAndComposited = false;
+    }
+    
</ins><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="cx">         // mapping between them and the RenderObjects. It would be neat to enable
</span><span class="lines">@@ -937,18 +940,19 @@
</span><span class="cx"> 
</span><span class="cx"> void RenderLayer::updatePagination()
</span><span class="cx"> {
</span><del>-    m_enclosingPaginationLayer = 0;
-
-    if (isComposited() || !parent())
-        return; // FIXME: We will have to deal with paginated compositing layers someday.
-                // FIXME: For now the RenderView can't be paginated.  Eventually printing will move to a model where it is though.
-
</del><ins>+    m_enclosingPaginationLayer = nullptr;
+    m_enclosingLayerIsPaginatedAndComposited = false;
+    
+    if (!parent())
+        return;
+    
</ins><span class="cx">     // Each layer that is inside a multicolumn flow thread has to be checked individually and
</span><span class="cx">     // genuinely know if it is going to have to split itself up when painting only its contents (and not any other descendant
</span><span class="cx">     // layers). We track an enclosingPaginationLayer instead of using a simple bit, since we want to be able to get back
</span><span class="cx">     // to that layer easily.
</span><span class="cx">     if (renderer().isInFlowRenderFlowThread()) {
</span><span class="cx">         m_enclosingPaginationLayer = this;
</span><ins>+        m_enclosingLayerIsPaginatedAndComposited = isComposited();
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -956,9 +960,13 @@
</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>-        m_enclosingPaginationLayer = parent()-&gt;enclosingPaginationLayer();
-        if (parent()-&gt;hasTransform())
-            m_enclosingPaginationLayer = 0;
</del><ins>+        if (parent()-&gt;hasTransform()) {
+            m_enclosingPaginationLayer = nullptr;
+            m_enclosingLayerIsPaginatedAndComposited = false;
+        } else {
+            m_enclosingPaginationLayer = parent()-&gt;enclosingPaginationLayer(IncludeCompositedPaginatedLayers);
+            m_enclosingLayerIsPaginatedAndComposited = isComposited() ? true : parent()-&gt;enclosingLayerIsPaginatedAndComposited();
+        }
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -971,9 +979,13 @@
</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>-            m_enclosingPaginationLayer = containingBlock-&gt;layer()-&gt;enclosingPaginationLayer();
-            if (containingBlock-&gt;layer()-&gt;hasTransform())
-                m_enclosingPaginationLayer = 0;
</del><ins>+            if (containingBlock-&gt;layer()-&gt;hasTransform()) {
+                m_enclosingPaginationLayer = nullptr;
+                m_enclosingLayerIsPaginatedAndComposited = false;
+            } else {
+                m_enclosingPaginationLayer = containingBlock-&gt;layer()-&gt;enclosingPaginationLayer(IncludeCompositedPaginatedLayers);
+                m_enclosingLayerIsPaginatedAndComposited = isComposited() ? true : containingBlock-&gt;layer()-&gt;enclosingLayerIsPaginatedAndComposited();
+            }
</ins><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="lines">@@ -1622,7 +1634,8 @@
</span><span class="cx">         || (transparencyBehavior == HitTestingTransparencyClipBox &amp;&amp; layer-&gt;hasTransform()))) {
</span><span class="cx">         // The best we can do here is to use enclosed bounding boxes to establish a &quot;fuzzy&quot; enough clip to encompass
</span><span class="cx">         // the transformed layer and all of its children.
</span><del>-        const RenderLayer* paginationLayer = transparencyMode == DescendantsOfTransparencyClipBox ? layer-&gt;enclosingPaginationLayer() : 0;
</del><ins>+        RenderLayer::PaginationInclusionMode mode = transparencyBehavior == HitTestingTransparencyClipBox ? RenderLayer::IncludeCompositedPaginatedLayers : RenderLayer::ExcludeCompositedPaginatedLayers;
+        const RenderLayer* paginationLayer = transparencyMode == DescendantsOfTransparencyClipBox ? layer-&gt;enclosingPaginationLayer(mode) : 0;
</ins><span class="cx">         const RenderLayer* rootLayerForTransform = paginationLayer ? paginationLayer : rootLayer;
</span><span class="cx">         LayoutPoint delta;
</span><span class="cx">         layer-&gt;convertToLayerCoords(rootLayerForTransform, delta);
</span><span class="lines">@@ -1654,7 +1667,7 @@
</span><span class="cx">         return result;
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    LayoutRect clipRect = layer-&gt;boundingBox(rootLayer, RenderLayer::UseFragmentBoxes);
</del><ins>+    LayoutRect clipRect = layer-&gt;boundingBox(rootLayer, transparencyBehavior == HitTestingTransparencyClipBox ? RenderLayer::UseFragmentBoxesIncludingCompositing : RenderLayer::UseFragmentBoxesExcludingCompositing);
</ins><span class="cx">     expandClipRectForDescendantsAndReflection(clipRect, layer, rootLayer, transparencyBehavior, paintBehavior);
</span><span class="cx"> #if ENABLE(CSS_FILTERS)
</span><span class="cx">     layer-&gt;renderer().style().filterOutsets().expandRect(clipRect);
</span><span class="lines">@@ -3676,7 +3689,7 @@
</span><span class="cx"> 
</span><span class="cx">     // Disable named flow region information for in flow threads such as multi-col.
</span><span class="cx">     std::unique_ptr&lt;CurrentRenderFlowThreadDisabler&gt; flowThreadDisabler;
</span><del>-    if (enclosingPaginationLayer())
</del><ins>+    if (enclosingPaginationLayer(ExcludeCompositedPaginatedLayers))
</ins><span class="cx">         flowThreadDisabler = std::make_unique&lt;CurrentRenderFlowThreadDisabler&gt;(&amp;renderer().view());
</span><span class="cx"> 
</span><span class="cx">     RenderNamedFlowFragment* namedFlowFragment = currentRenderNamedFlowFragment();
</span><span class="lines">@@ -3705,7 +3718,7 @@
</span><span class="cx">                 beginTransparencyLayers(context, paintingInfo.rootLayer, paintingInfo.paintDirtyRect, paintingInfo.paintBehavior);
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (enclosingPaginationLayer()) {
</del><ins>+        if (enclosingPaginationLayer(ExcludeCompositedPaginatedLayers)) {
</ins><span class="cx">             paintTransformedLayerIntoFragments(context, paintingInfo, paintFlags);
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="lines">@@ -4045,7 +4058,7 @@
</span><span class="cx">             localPaintingInfo.clipToDirtyRect = true;
</span><span class="cx">             paintDirtyRect = selfClipRect();
</span><span class="cx">         }
</span><del>-        collectFragments(layerFragments, localPaintingInfo.rootLayer, paintDirtyRect,
</del><ins>+        collectFragments(layerFragments, localPaintingInfo.rootLayer, paintDirtyRect, ExcludeCompositedPaginatedLayers,
</ins><span class="cx">             (localPaintFlags &amp; PaintLayerTemporaryClipRects) ? TemporaryClipRects : PaintingClipRects, IgnoreOverlayScrollbarSize,
</span><span class="cx">             (isPaintingOverflowContents) ? IgnoreOverflowClip : RespectOverflowClip, &amp;offsetFromRoot);
</span><span class="cx">         updatePaintingInfoForFragments(layerFragments, localPaintingInfo, localPaintFlags, shouldPaintContent, &amp;offsetFromRoot);
</span><span class="lines">@@ -4166,12 +4179,13 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-RenderLayer* RenderLayer::enclosingPaginationLayerInSubtree(const RenderLayer* rootLayer) const
</del><ins>+RenderLayer* RenderLayer::enclosingPaginationLayerInSubtree(const RenderLayer* rootLayer, PaginationInclusionMode mode) const
</ins><span class="cx"> {
</span><span class="cx">     // If we don't have an enclosing layer, or if the root layer is the same as the enclosing layer,
</span><span class="cx">     // then just return the enclosing pagination layer (it will be 0 in the former case and the rootLayer in the latter case).
</span><del>-    if (!m_enclosingPaginationLayer || rootLayer == m_enclosingPaginationLayer)
-        return m_enclosingPaginationLayer;
</del><ins>+    RenderLayer* paginationLayer = enclosingPaginationLayer(mode);
+    if (!paginationLayer || rootLayer == paginationLayer)
+        return paginationLayer;
</ins><span class="cx">     
</span><span class="cx">     // Walk up the layer tree and see which layer we hit first. If it's the root, then the enclosing pagination
</span><span class="cx">     // layer isn't in our subtree and we return 0. If we hit the enclosing pagination layer first, then
</span><span class="lines">@@ -4179,8 +4193,8 @@
</span><span class="cx">     for (const RenderLayer* layer = this; layer; layer = layer-&gt;parent()) {
</span><span class="cx">         if (layer == rootLayer)
</span><span class="cx">             return 0;
</span><del>-        if (layer == m_enclosingPaginationLayer)
-            return m_enclosingPaginationLayer;
</del><ins>+        if (layer == paginationLayer)
+            return paginationLayer;
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     // This should never be reached, since an enclosing layer should always either be the rootLayer or be
</span><span class="lines">@@ -4189,11 +4203,11 @@
</span><span class="cx">     return 0;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RenderLayer::collectFragments(LayerFragments&amp; fragments, const RenderLayer* rootLayer, const LayoutRect&amp; dirtyRect,
</del><ins>+void RenderLayer::collectFragments(LayerFragments&amp; fragments, const RenderLayer* rootLayer, const LayoutRect&amp; dirtyRect, PaginationInclusionMode inclusionMode,
</ins><span class="cx">     ClipRectsType clipRectsType, OverlayScrollbarSizeRelevancy inOverlayScrollbarSizeRelevancy, ShouldRespectOverflowClip respectOverflowClip, const LayoutPoint* offsetFromRoot,
</span><span class="cx">     const LayoutRect* layerBoundingBox, ShouldApplyRootOffsetToFragments applyRootOffsetToFragments)
</span><span class="cx"> {
</span><del>-    RenderLayer* paginationLayer = enclosingPaginationLayerInSubtree(rootLayer);
</del><ins>+    RenderLayer* paginationLayer = enclosingPaginationLayerInSubtree(rootLayer, inclusionMode);
</ins><span class="cx">     if (!paginationLayer || hasTransform()) {
</span><span class="cx">         // For unpaginated layers, there is only one fragment.
</span><span class="cx">         LayerFragment fragment;
</span><span class="lines">@@ -4222,7 +4236,7 @@
</span><span class="cx">     layerBoundingBoxInFlowThread.intersect(backgroundRectInFlowThread.rect());
</span><span class="cx">     
</span><span class="cx">     RenderFlowThread&amp; enclosingFlowThread = toRenderFlowThread(paginationLayer-&gt;renderer());
</span><del>-    RenderLayer* parentPaginationLayer = paginationLayer-&gt;parent()-&gt;enclosingPaginationLayerInSubtree(rootLayer);
</del><ins>+    RenderLayer* parentPaginationLayer = paginationLayer-&gt;parent()-&gt;enclosingPaginationLayerInSubtree(rootLayer, inclusionMode);
</ins><span class="cx">     LayerFragments ancestorFragments;
</span><span class="cx">     if (parentPaginationLayer) {
</span><span class="cx">         // Compute a bounding box accounting for fragments.
</span><span class="lines">@@ -4234,7 +4248,7 @@
</span><span class="cx">         layerFragmentBoundingBoxInParentPaginationLayer.moveBy(offsetWithinParentPaginatedLayer);
</span><span class="cx">         
</span><span class="cx">         // Now collect ancestor fragments.
</span><del>-        parentPaginationLayer-&gt;collectFragments(ancestorFragments, rootLayer, dirtyRect, clipRectsType, inOverlayScrollbarSizeRelevancy, respectOverflowClip, nullptr, &amp;layerFragmentBoundingBoxInParentPaginationLayer, ApplyRootOffsetToFragments);
</del><ins>+        parentPaginationLayer-&gt;collectFragments(ancestorFragments, rootLayer, dirtyRect, inclusionMode, clipRectsType, inOverlayScrollbarSizeRelevancy, respectOverflowClip, nullptr, &amp;layerFragmentBoundingBoxInParentPaginationLayer, ApplyRootOffsetToFragments);
</ins><span class="cx">         
</span><span class="cx">         if (ancestorFragments.isEmpty())
</span><span class="cx">             return;
</span><span class="lines">@@ -4282,7 +4296,7 @@
</span><span class="cx">     
</span><span class="cx">     // Shift the dirty rect into flow thread coordinates.
</span><span class="cx">     LayoutPoint offsetOfPaginationLayerFromRoot;
</span><del>-    enclosingPaginationLayer()-&gt;convertToLayerCoords(rootLayer, offsetOfPaginationLayerFromRoot);
</del><ins>+    enclosingPaginationLayer(inclusionMode)-&gt;convertToLayerCoords(rootLayer, offsetOfPaginationLayerFromRoot);
</ins><span class="cx">     LayoutRect dirtyRectInFlowThread(dirtyRect);
</span><span class="cx">     dirtyRectInFlowThread.moveBy(-offsetOfPaginationLayerFromRoot);
</span><span class="cx"> 
</span><span class="lines">@@ -4341,8 +4355,9 @@
</span><span class="cx"> {
</span><span class="cx">     LayerFragments enclosingPaginationFragments;
</span><span class="cx">     LayoutPoint offsetOfPaginationLayerFromRoot;
</span><del>-    LayoutRect transformedExtent = transparencyClipBox(this, enclosingPaginationLayer(), PaintingTransparencyClipBox, RootOfTransparencyClipBox, paintingInfo.paintBehavior);
-    enclosingPaginationLayer()-&gt;collectFragments(enclosingPaginationFragments, paintingInfo.rootLayer, paintingInfo.paintDirtyRect,
</del><ins>+    RenderLayer* paginatedLayer = enclosingPaginationLayer(ExcludeCompositedPaginatedLayers);
+    LayoutRect transformedExtent = transparencyClipBox(this, paginatedLayer, PaintingTransparencyClipBox, RootOfTransparencyClipBox, paintingInfo.paintBehavior);
+    paginatedLayer-&gt;collectFragments(enclosingPaginationFragments, paintingInfo.rootLayer, paintingInfo.paintDirtyRect, ExcludeCompositedPaginatedLayers,
</ins><span class="cx">         (paintFlags &amp; PaintLayerTemporaryClipRects) ? TemporaryClipRects : PaintingClipRects, IgnoreOverlayScrollbarSize,
</span><span class="cx">         (paintFlags &amp; PaintLayerPaintingOverflowContents) ? IgnoreOverflowClip : RespectOverflowClip, &amp;offsetOfPaginationLayerFromRoot, &amp;transformedExtent);
</span><span class="cx">     
</span><span class="lines">@@ -4354,10 +4369,10 @@
</span><span class="cx">         LayoutRect clipRect = fragment.backgroundRect.rect();
</span><span class="cx">         
</span><span class="cx">         // Now compute the clips within a given fragment
</span><del>-        if (parent() != enclosingPaginationLayer()) {
-            enclosingPaginationLayer()-&gt;convertToLayerCoords(paintingInfo.rootLayer, offsetOfPaginationLayerFromRoot);
</del><ins>+        if (parent() != paginatedLayer) {
+            paginatedLayer-&gt;convertToLayerCoords(paintingInfo.rootLayer, offsetOfPaginationLayerFromRoot);
</ins><span class="cx">     
</span><del>-            ClipRectsContext clipRectsContext(enclosingPaginationLayer(), (paintFlags &amp; PaintLayerTemporaryClipRects) ? TemporaryClipRects : PaintingClipRects,
</del><ins>+            ClipRectsContext clipRectsContext(paginatedLayer, (paintFlags &amp; PaintLayerTemporaryClipRects) ? TemporaryClipRects : PaintingClipRects,
</ins><span class="cx">                 IgnoreOverlayScrollbarSize, (paintFlags &amp; PaintLayerPaintingOverflowContents) ? IgnoreOverflowClip : RespectOverflowClip);
</span><span class="cx">             LayoutRect parentClipRect = backgroundClipRect(clipRectsContext).rect();
</span><span class="cx">             parentClipRect.moveBy(fragment.paginationOffset + offsetOfPaginationLayerFromRoot);
</span><span class="lines">@@ -4741,7 +4756,7 @@
</span><span class="cx"> 
</span><span class="cx">     // Apply a transform if we have one.
</span><span class="cx">     if (transform() &amp;&amp; !appliedTransform) {
</span><del>-        if (enclosingPaginationLayer())
</del><ins>+        if (enclosingPaginationLayer(IncludeCompositedPaginatedLayers))
</ins><span class="cx">             return hitTestTransformedLayerInFragments(rootLayer, containerLayer, request, result, hitTestRect, hitTestLocation, transformState, zOffset);
</span><span class="cx"> 
</span><span class="cx">         // Make sure the parent's clip rects have been calculated.
</span><span class="lines">@@ -4836,7 +4851,7 @@
</span><span class="cx"> 
</span><span class="cx">     // Collect the fragments. This will compute the clip rectangles for each layer fragment.
</span><span class="cx">     LayerFragments layerFragments;
</span><del>-    collectFragments(layerFragments, rootLayer, hitTestRect, RootRelativeClipRects, IncludeOverlayScrollbarSize);
</del><ins>+    collectFragments(layerFragments, rootLayer, hitTestRect, IncludeCompositedPaginatedLayers, RootRelativeClipRects, IncludeOverlayScrollbarSize);
</ins><span class="cx"> 
</span><span class="cx">     if (canResize() &amp;&amp; hitTestResizerInFragments(layerFragments, hitTestLocation)) {
</span><span class="cx">         renderer().updateHitTestResult(result, hitTestLocation.point());
</span><span class="lines">@@ -4940,8 +4955,9 @@
</span><span class="cx"> {
</span><span class="cx">     LayerFragments enclosingPaginationFragments;
</span><span class="cx">     LayoutPoint offsetOfPaginationLayerFromRoot;
</span><del>-    LayoutRect transformedExtent = transparencyClipBox(this, enclosingPaginationLayer(), HitTestingTransparencyClipBox, RootOfTransparencyClipBox);
-    enclosingPaginationLayer()-&gt;collectFragments(enclosingPaginationFragments, rootLayer, hitTestRect,
</del><ins>+    RenderLayer* paginatedLayer = enclosingPaginationLayer(IncludeCompositedPaginatedLayers);
+    LayoutRect transformedExtent = transparencyClipBox(this, paginatedLayer, HitTestingTransparencyClipBox, RootOfTransparencyClipBox);
+    paginatedLayer-&gt;collectFragments(enclosingPaginationFragments, rootLayer, hitTestRect, IncludeCompositedPaginatedLayers,
</ins><span class="cx">         RootRelativeClipRects, IncludeOverlayScrollbarSize, RespectOverflowClip, &amp;offsetOfPaginationLayerFromRoot, &amp;transformedExtent);
</span><span class="cx"> 
</span><span class="cx">     for (int i = enclosingPaginationFragments.size() - 1; i &gt;= 0; --i) {
</span><span class="lines">@@ -4952,10 +4968,10 @@
</span><span class="cx">         LayoutRect clipRect = fragment.backgroundRect.rect();
</span><span class="cx">         
</span><span class="cx">         // Now compute the clips within a given fragment
</span><del>-        if (parent() != enclosingPaginationLayer()) {
-            enclosingPaginationLayer()-&gt;convertToLayerCoords(rootLayer, offsetOfPaginationLayerFromRoot);
</del><ins>+        if (parent() != paginatedLayer) {
+            paginatedLayer-&gt;convertToLayerCoords(rootLayer, offsetOfPaginationLayerFromRoot);
</ins><span class="cx">     
</span><del>-            ClipRectsContext clipRectsContext(enclosingPaginationLayer(), RootRelativeClipRects, IncludeOverlayScrollbarSize);
</del><ins>+            ClipRectsContext clipRectsContext(paginatedLayer, RootRelativeClipRects, IncludeOverlayScrollbarSize);
</ins><span class="cx">             LayoutRect parentClipRect = backgroundClipRect(clipRectsContext).rect();
</span><span class="cx">             parentClipRect.moveBy(fragment.paginationOffset + offsetOfPaginationLayerFromRoot);
</span><span class="cx">             clipRect.intersect(parentClipRect);
</span><span class="lines">@@ -5259,7 +5275,7 @@
</span><span class="cx"> 
</span><span class="cx">     // If we cross into a different pagination context, then we can't rely on the cache.
</span><span class="cx">     // Just switch over to using TemporaryClipRects.
</span><del>-    if (clipRectsContext.clipRectsType != TemporaryClipRects &amp;&amp; parent()-&gt;enclosingPaginationLayer() != enclosingPaginationLayer()) {
</del><ins>+    if (clipRectsContext.clipRectsType != TemporaryClipRects &amp;&amp; parent()-&gt;enclosingPaginationLayer(IncludeCompositedPaginatedLayers) != enclosingPaginationLayer(IncludeCompositedPaginatedLayers)) {
</ins><span class="cx">         ClipRectsContext tempContext(clipRectsContext);
</span><span class="cx">         tempContext.clipRectsType = TemporaryClipRects;
</span><span class="cx">         parentClipRects(tempContext, parentRects);
</span><span class="lines">@@ -5567,10 +5583,15 @@
</span><span class="cx">     else
</span><span class="cx">         renderer().containingBlock()-&gt;flipForWritingMode(result);
</span><span class="cx">     
</span><del>-    const RenderLayer* paginationLayer = (flags &amp; UseFragmentBoxes) ? enclosingPaginationLayerInSubtree(ancestorLayer) : 0;
</del><ins>+    PaginationInclusionMode inclusionMode = ExcludeCompositedPaginatedLayers;
+    if (flags &amp; UseFragmentBoxesIncludingCompositing)
+        inclusionMode = IncludeCompositedPaginatedLayers;
+    const RenderLayer* paginationLayer = nullptr;
+    if (flags &amp; UseFragmentBoxesExcludingCompositing || flags &amp; UseFragmentBoxesIncludingCompositing)
+        paginationLayer = enclosingPaginationLayerInSubtree(ancestorLayer, inclusionMode);
+    
</ins><span class="cx">     const RenderLayer* childLayer = this;
</span><span class="cx">     bool isPaginated = paginationLayer;
</span><del>-    
</del><span class="cx">     while (paginationLayer) {
</span><span class="cx">         // Split our box up into the actual fragment boxes that render in the columns/pages and unite those together to
</span><span class="cx">         // get our true bounding box.
</span><span class="lines">@@ -5582,7 +5603,7 @@
</span><span class="cx">         result = enclosingFlowThread.fragmentsBoundingBox(result);
</span><span class="cx">         
</span><span class="cx">         childLayer = paginationLayer;
</span><del>-        paginationLayer = paginationLayer-&gt;parent()-&gt;enclosingPaginationLayerInSubtree(ancestorLayer);
</del><ins>+        paginationLayer = paginationLayer-&gt;parent()-&gt;enclosingPaginationLayerInSubtree(ancestorLayer, inclusionMode);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (isPaginated) {
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayer.h (169650 => 169651)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayer.h        2014-06-06 17:41:36 UTC (rev 169650)
+++ trunk/Source/WebCore/rendering/RenderLayer.h        2014-06-06 17:57:44 UTC (rev 169651)
</span><span class="lines">@@ -514,9 +514,16 @@
</span><span class="cx">     void updateLayerPositionsAfterDocumentScroll();
</span><span class="cx"> 
</span><span class="cx">     void positionNewlyCreatedOverflowControls();
</span><del>-    
-    RenderLayer* enclosingPaginationLayer() const { return m_enclosingPaginationLayer; }
</del><span class="cx"> 
</span><ins>+    enum PaginationInclusionMode { ExcludeCompositedPaginatedLayers, IncludeCompositedPaginatedLayers };
+    RenderLayer* enclosingPaginationLayer(PaginationInclusionMode mode) const
+    {
+        if (mode == ExcludeCompositedPaginatedLayers &amp;&amp; m_enclosingLayerIsPaginatedAndComposited)
+            return nullptr;
+        return m_enclosingPaginationLayer;
+    }
+    bool enclosingLayerIsPaginatedAndComposited() const { return m_enclosingLayerIsPaginatedAndComposited; }
+
</ins><span class="cx">     void updateTransform();
</span><span class="cx">     
</span><span class="cx"> #if ENABLE(CSS_COMPOSITING)
</span><span class="lines">@@ -719,8 +726,9 @@
</span><span class="cx">         ExcludeHiddenDescendants = 1 &lt;&lt; 3,
</span><span class="cx">         DontConstrainForMask = 1 &lt;&lt; 4,
</span><span class="cx">         IncludeCompositedDescendants = 1 &lt;&lt; 5,
</span><del>-        UseFragmentBoxes = 1 &lt;&lt; 6,
-        DefaultCalculateLayerBoundsFlags =  IncludeSelfTransform | UseLocalClipRectIfPossible | IncludeLayerFilterOutsets | UseFragmentBoxes
</del><ins>+        UseFragmentBoxesExcludingCompositing = 1 &lt;&lt; 6,
+        UseFragmentBoxesIncludingCompositing = 1 &lt;&lt; 7,
+        DefaultCalculateLayerBoundsFlags =  IncludeSelfTransform | UseLocalClipRectIfPossible | IncludeLayerFilterOutsets | UseFragmentBoxesExcludingCompositing
</ins><span class="cx">     };
</span><span class="cx">     typedef unsigned CalculateLayerBoundsFlags;
</span><span class="cx"> 
</span><span class="lines">@@ -945,7 +953,7 @@
</span><span class="cx"> 
</span><span class="cx">     IntSize clampScrollOffset(const IntSize&amp;) const;
</span><span class="cx"> 
</span><del>-    RenderLayer* enclosingPaginationLayerInSubtree(const RenderLayer* rootLayer) const;
</del><ins>+    RenderLayer* enclosingPaginationLayerInSubtree(const RenderLayer* rootLayer, PaginationInclusionMode) const;
</ins><span class="cx"> 
</span><span class="cx">     void setNextSibling(RenderLayer* next) { m_next = next; }
</span><span class="cx">     void setPreviousSibling(RenderLayer* prev) { m_previous = prev; }
</span><span class="lines">@@ -993,6 +1001,7 @@
</span><span class="cx">     void paintList(Vector&lt;RenderLayer*&gt;*, GraphicsContext*, const LayerPaintingInfo&amp;, PaintLayerFlags);
</span><span class="cx"> 
</span><span class="cx">     void collectFragments(LayerFragments&amp;, const RenderLayer* rootLayer, const LayoutRect&amp; dirtyRect,
</span><ins>+        PaginationInclusionMode,
</ins><span class="cx">         ClipRectsType, OverlayScrollbarSizeRelevancy inOverlayScrollbarSizeRelevancy = IgnoreOverlayScrollbarSize,
</span><span class="cx">         ShouldRespectOverflowClip = RespectOverflowClip, const LayoutPoint* offsetFromRoot = nullptr, const LayoutRect* layerBoundingBox = nullptr, ShouldApplyRootOffsetToFragments = IgnoreRootOffsetForFragments);
</span><span class="cx">     void updatePaintingInfoForFragments(LayerFragments&amp;, const LayerPaintingInfo&amp;, PaintLayerFlags, bool shouldPaintContent, const LayoutPoint* offsetFromRoot);
</span><span class="lines">@@ -1332,6 +1341,7 @@
</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><ins>+    bool m_enclosingLayerIsPaginatedAndComposited;
</ins><span class="cx"> 
</span><span class="cx">     IntRect m_blockSelectionGapsBounds;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerCompositorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (169650 => 169651)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp        2014-06-06 17:41:36 UTC (rev 169650)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp        2014-06-06 17:57:44 UTC (rev 169651)
</span><span class="lines">@@ -2656,7 +2656,7 @@
</span><span class="cx"> 
</span><span class="cx">     // Fixed position elements that are invisible in the current view don't get their own layer.
</span><span class="cx">     LayoutRect viewBounds = m_renderView.frameView().viewportConstrainedVisibleContentRect();
</span><del>-    LayoutRect layerBounds = layer.calculateLayerBounds(&amp;layer, 0, RenderLayer::UseLocalClipRectIfPossible | RenderLayer::IncludeLayerFilterOutsets | RenderLayer::UseFragmentBoxes
</del><ins>+    LayoutRect layerBounds = layer.calculateLayerBounds(&amp;layer, 0, RenderLayer::UseLocalClipRectIfPossible | RenderLayer::IncludeLayerFilterOutsets | RenderLayer::UseFragmentBoxesExcludingCompositing
</ins><span class="cx">         | RenderLayer::ExcludeHiddenDescendants | RenderLayer::DontConstrainForMask | RenderLayer::IncludeCompositedDescendants);
</span><span class="cx">     // Map to m_renderView to ignore page scale.
</span><span class="cx">     FloatRect absoluteBounds = layer.renderer().localToContainerQuad(FloatRect(layerBounds), &amp;m_renderView).boundingBox();
</span></span></pre>
</div>
</div>

</body>
</html>