<!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>[182809] 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/182809">182809</a></dd>
<dt>Author</dt> <dd>simon.fraser@apple.com</dd>
<dt>Date</dt> <dd>2015-04-14 14:14:07 -0700 (Tue, 14 Apr 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>[iOS] Clean up registration of layers with the ScrollingCoordinator
https://bugs.webkit.org/show_bug.cgi?id=143725

Reviewed by Tim Horton.

Simplify a couple of bits of code related to the registration of layers with
the ScrollingCoordinator in RenderLayerCompositor.

First, RenderLayerBacking was using ScrollingNodeTypes to choose which scrolling
roles a layer has, which let to ambiguous code where we hardcoded a ScrollingNodeType
with knowledge of what RenderLayerBacking did with it. Clean up by using LayerScrollCoordinationRole,
which is moved to RenderLayer.h so that RenderLayerCompositor.h and RenderLayerBacking.h
both see it.

Secondly, avoid having both detachFromScrollingCoordinator() and detachFromScrollingCoordinatorForRole()
by passing in the bitmask of roles.

* page/FrameView.cpp:
(WebCore::FrameView::scrollLayerID):
* rendering/RenderLayer.h:
* rendering/RenderLayerBacking.cpp:
(WebCore::RenderLayerBacking::~RenderLayerBacking):
(WebCore::RenderLayerBacking::detachFromScrollingCoordinator):
(WebCore::RenderLayerBacking::detachFromScrollingCoordinatorForRole): Deleted.
* rendering/RenderLayerBacking.h:
* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::updateScrollCoordinatedStatus):
(WebCore::RenderLayerCompositor::removeFromScrollCoordinatedLayers):
(WebCore::scrollCoordinationRoleForNodeType):
(WebCore::RenderLayerCompositor::attachScrollingNode):
(WebCore::RenderLayerCompositor::detachScrollCoordinatedLayer):
(WebCore::RenderLayerCompositor::updateScrollCoordinatedLayer):
(WebCore::RenderLayerCompositor::willRemoveScrollingLayerWithBacking):
(WebCore::RenderLayerCompositor::detachScrollCoordinatedLayerForRole): Deleted.
* rendering/RenderLayerCompositor.h:</pre>

<h3>Modified Paths</h3>
<ul>
<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="#trunkSourceWebCorerenderingRenderLayerh">trunk/Source/WebCore/rendering/RenderLayer.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayerBackingcpp">trunk/Source/WebCore/rendering/RenderLayerBacking.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayerBackingh">trunk/Source/WebCore/rendering/RenderLayerBacking.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayerCompositorcpp">trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayerCompositorh">trunk/Source/WebCore/rendering/RenderLayerCompositor.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (182808 => 182809)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-04-14 21:08:02 UTC (rev 182808)
+++ trunk/Source/WebCore/ChangeLog        2015-04-14 21:14:07 UTC (rev 182809)
</span><span class="lines">@@ -1,3 +1,41 @@
</span><ins>+2015-04-14  Simon Fraser  &lt;simon.fraser@apple.com&gt;
+
+        [iOS] Clean up registration of layers with the ScrollingCoordinator
+        https://bugs.webkit.org/show_bug.cgi?id=143725
+
+        Reviewed by Tim Horton.
+
+        Simplify a couple of bits of code related to the registration of layers with
+        the ScrollingCoordinator in RenderLayerCompositor.
+
+        First, RenderLayerBacking was using ScrollingNodeTypes to choose which scrolling
+        roles a layer has, which let to ambiguous code where we hardcoded a ScrollingNodeType
+        with knowledge of what RenderLayerBacking did with it. Clean up by using LayerScrollCoordinationRole,
+        which is moved to RenderLayer.h so that RenderLayerCompositor.h and RenderLayerBacking.h
+        both see it.
+
+        Secondly, avoid having both detachFromScrollingCoordinator() and detachFromScrollingCoordinatorForRole()
+        by passing in the bitmask of roles.
+
+        * page/FrameView.cpp:
+        (WebCore::FrameView::scrollLayerID):
+        * rendering/RenderLayer.h:
+        * rendering/RenderLayerBacking.cpp:
+        (WebCore::RenderLayerBacking::~RenderLayerBacking):
+        (WebCore::RenderLayerBacking::detachFromScrollingCoordinator):
+        (WebCore::RenderLayerBacking::detachFromScrollingCoordinatorForRole): Deleted.
+        * rendering/RenderLayerBacking.h:
+        * rendering/RenderLayerCompositor.cpp:
+        (WebCore::RenderLayerCompositor::updateScrollCoordinatedStatus):
+        (WebCore::RenderLayerCompositor::removeFromScrollCoordinatedLayers):
+        (WebCore::scrollCoordinationRoleForNodeType):
+        (WebCore::RenderLayerCompositor::attachScrollingNode):
+        (WebCore::RenderLayerCompositor::detachScrollCoordinatedLayer):
+        (WebCore::RenderLayerCompositor::updateScrollCoordinatedLayer):
+        (WebCore::RenderLayerCompositor::willRemoveScrollingLayerWithBacking):
+        (WebCore::RenderLayerCompositor::detachScrollCoordinatedLayerForRole): Deleted.
+        * rendering/RenderLayerCompositor.h:
+
</ins><span class="cx"> 2015-04-14  Benjamin Poulain  &lt;benjamin@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Add a conservative DFA minimizer for the content extension matcher
</span></span></pre></div>
<a id="trunkSourceWebCorepageFrameViewcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/FrameView.cpp (182808 => 182809)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/FrameView.cpp        2015-04-14 21:08:02 UTC (rev 182808)
+++ trunk/Source/WebCore/page/FrameView.cpp        2015-04-14 21:14:07 UTC (rev 182809)
</span><span class="lines">@@ -835,7 +835,7 @@
</span><span class="cx">     if (!backing)
</span><span class="cx">         return 0;
</span><span class="cx"> 
</span><del>-    return backing-&gt;scrollingNodeIDForRole(FrameScrollingNode);
</del><ins>+    return backing-&gt;scrollingNodeIDForRole(Scrolling);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> ScrollableArea* FrameView::scrollableAreaForScrollLayerID(uint64_t nodeID) const
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayer.h (182808 => 182809)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayer.h        2015-04-14 21:08:02 UTC (rev 182808)
+++ trunk/Source/WebCore/rendering/RenderLayer.h        2015-04-14 21:14:07 UTC (rev 182809)
</span><span class="lines">@@ -104,6 +104,12 @@
</span><span class="cx">     IgnoreRootOffsetForFragments
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+enum LayerScrollCoordinationRole {
+    ViewportConstrained = 1 &lt;&lt; 0,
+    Scrolling           = 1 &lt;&lt; 1
+};
+typedef unsigned LayerScrollCoordinationRoles;
+
</ins><span class="cx"> class RenderLayer final : public ScrollableArea {
</span><span class="cx">     WTF_MAKE_FAST_ALLOCATED;
</span><span class="cx"> public:
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerBackingcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayerBacking.cpp (182808 => 182809)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayerBacking.cpp        2015-04-14 21:08:02 UTC (rev 182808)
+++ trunk/Source/WebCore/rendering/RenderLayerBacking.cpp        2015-04-14 21:14:07 UTC (rev 182809)
</span><span class="lines">@@ -151,7 +151,7 @@
</span><span class="cx">     updateBackgroundLayer(false);
</span><span class="cx">     updateMaskingLayer(false, false);
</span><span class="cx">     updateScrollingLayers(false);
</span><del>-    detachFromScrollingCoordinator();
</del><ins>+    detachFromScrollingCoordinator(Scrolling | ViewportConstrained);
</ins><span class="cx">     destroyGraphicsLayers();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1551,7 +1551,7 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RenderLayerBacking::detachFromScrollingCoordinator()
</del><ins>+void RenderLayerBacking::detachFromScrollingCoordinator(LayerScrollCoordinationRoles roles)
</ins><span class="cx"> {
</span><span class="cx">     if (!m_scrollingNodeID &amp;&amp; !m_viewportConstrainedNodeID)
</span><span class="cx">         return;
</span><span class="lines">@@ -1560,30 +1560,17 @@
</span><span class="cx">     if (!scrollingCoordinator)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    if (m_scrollingNodeID)
</del><ins>+    if ((roles &amp; Scrolling) &amp;&amp; m_scrollingNodeID) {
</ins><span class="cx">         scrollingCoordinator-&gt;detachFromStateTree(m_scrollingNodeID);
</span><del>-
-    if (m_viewportConstrainedNodeID)
</del><ins>+        m_scrollingNodeID = 0;
+    }
+    
+    if ((roles &amp; ViewportConstrained) &amp;&amp; m_viewportConstrainedNodeID) {
</ins><span class="cx">         scrollingCoordinator-&gt;detachFromStateTree(m_viewportConstrainedNodeID);
</span><del>-
-    m_scrollingNodeID = 0;
-    m_viewportConstrainedNodeID = 0;
</del><ins>+        m_viewportConstrainedNodeID = 0;
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RenderLayerBacking::detachFromScrollingCoordinatorForRole(ScrollingNodeType role)
-{
-    ScrollingNodeID nodeID = scrollingNodeIDForRole(role);
-    if (!nodeID)
-        return;
-
-    ScrollingCoordinator* scrollingCoordinator = scrollingCoordinatorFromLayer(m_owningLayer);
-    if (!scrollingCoordinator)
-        return;
-
-    scrollingCoordinator-&gt;detachFromStateTree(nodeID);
-    setScrollingNodeIDForRole(0, role);
-}
-
</del><span class="cx"> GraphicsLayerPaintingPhase RenderLayerBacking::paintingPhaseForPrimaryLayer() const
</span><span class="cx"> {
</span><span class="cx">     unsigned phase = 0;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerBackingh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayerBacking.h (182808 => 182809)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayerBacking.h        2015-04-14 21:08:02 UTC (rev 182808)
+++ trunk/Source/WebCore/rendering/RenderLayerBacking.h        2015-04-14 21:14:07 UTC (rev 182809)
</span><span class="lines">@@ -107,31 +107,26 @@
</span><span class="cx">     GraphicsLayer* scrollingLayer() const { return m_scrollingLayer.get(); }
</span><span class="cx">     GraphicsLayer* scrollingContentsLayer() const { return m_scrollingContentsLayer.get(); }
</span><span class="cx"> 
</span><del>-    void detachFromScrollingCoordinator();
-    void detachFromScrollingCoordinatorForRole(ScrollingNodeType);
</del><ins>+    void detachFromScrollingCoordinator(LayerScrollCoordinationRoles);
</ins><span class="cx">     
</span><del>-    ScrollingNodeID scrollingNodeIDForRole(ScrollingNodeType nodeType) const
</del><ins>+    ScrollingNodeID scrollingNodeIDForRole(LayerScrollCoordinationRole role) const
</ins><span class="cx">     {
</span><del>-        switch (nodeType) {
-        case FrameScrollingNode:
-        case OverflowScrollingNode:
</del><ins>+        switch (role) {
+        case Scrolling:
</ins><span class="cx">             return m_scrollingNodeID;
</span><del>-        case FixedNode:
-        case StickyNode:
</del><ins>+        case ViewportConstrained:
</ins><span class="cx">             return m_viewportConstrainedNodeID;
</span><span class="cx">         }
</span><span class="cx">         return 0;
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    void setScrollingNodeIDForRole(ScrollingNodeID nodeID, ScrollingNodeType nodeType)
</del><ins>+    void setScrollingNodeIDForRole(ScrollingNodeID nodeID, LayerScrollCoordinationRole role)
</ins><span class="cx">     {
</span><del>-        switch (nodeType) {
-        case FrameScrollingNode:
-        case OverflowScrollingNode:
</del><ins>+        switch (role) {
+        case Scrolling:
</ins><span class="cx">             m_scrollingNodeID = nodeID;
</span><span class="cx">             break;
</span><del>-        case FixedNode:
-        case StickyNode:
</del><ins>+        case ViewportConstrained:
</ins><span class="cx">             m_viewportConstrainedNodeID = nodeID;
</span><span class="cx">             break;
</span><span class="cx">         }
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerCompositorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (182808 => 182809)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp        2015-04-14 21:08:02 UTC (rev 182808)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp        2015-04-14 21:14:07 UTC (rev 182809)
</span><span class="lines">@@ -3643,18 +3643,18 @@
</span><span class="cx"> 
</span><span class="cx"> void RenderLayerCompositor::updateScrollCoordinatedStatus(RenderLayer&amp; layer)
</span><span class="cx"> {
</span><del>-    ScrollCoordinationReasons coordinationReasons = 0;
</del><ins>+    LayerScrollCoordinationRoles coordinationRoles = 0;
</ins><span class="cx">     if (isViewportConstrainedFixedOrStickyLayer(layer))
</span><del>-        coordinationReasons |= FixedOrSticky;
</del><ins>+        coordinationRoles |= ViewportConstrained;
</ins><span class="cx"> 
</span><span class="cx">     if (useCoordinatedScrollingForLayer(m_renderView, layer))
</span><del>-        coordinationReasons |= Scrolling;
</del><ins>+        coordinationRoles |= Scrolling;
</ins><span class="cx"> 
</span><del>-    if (coordinationReasons) {
</del><ins>+    if (coordinationRoles) {
</ins><span class="cx">         if (m_scrollCoordinatedLayers.add(&amp;layer).isNewEntry)
</span><span class="cx">             m_subframeScrollLayersNeedReattach = true;
</span><span class="cx"> 
</span><del>-        updateScrollCoordinatedLayer(layer, coordinationReasons);
</del><ins>+        updateScrollCoordinatedLayer(layer, coordinationRoles);
</ins><span class="cx">     } else
</span><span class="cx">         removeFromScrollCoordinatedLayers(layer);
</span><span class="cx"> }
</span><span class="lines">@@ -3669,7 +3669,7 @@
</span><span class="cx">     m_scrollCoordinatedLayers.remove(&amp;layer);
</span><span class="cx">     m_scrollCoordinatedLayersNeedingUpdate.remove(&amp;layer);
</span><span class="cx"> 
</span><del>-    detachScrollCoordinatedLayer(layer);
</del><ins>+    detachScrollCoordinatedLayer(layer, Scrolling | ViewportConstrained);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> FixedPositionViewportConstraints RenderLayerCompositor::computeFixedViewportConstraints(RenderLayer&amp; layer) const
</span><span class="lines">@@ -3790,6 +3790,20 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static inline LayerScrollCoordinationRole scrollCoordinationRoleForNodeType(ScrollingNodeType nodeType)
+{
+    switch (nodeType) {
+    case FrameScrollingNode:
+    case OverflowScrollingNode:
+        return Scrolling;
+    case FixedNode:
+    case StickyNode:
+        return ViewportConstrained;
+    }
+    ASSERT_NOT_REACHED();
+    return Scrolling;
+}
+
</ins><span class="cx"> ScrollingNodeID RenderLayerCompositor::attachScrollingNode(RenderLayer&amp; layer, ScrollingNodeType nodeType, ScrollingNodeID parentNodeID)
</span><span class="cx"> {
</span><span class="cx">     ScrollingCoordinator* scrollingCoordinator = this-&gt;scrollingCoordinator();
</span><span class="lines">@@ -3799,7 +3813,8 @@
</span><span class="cx">     if (!backing)
</span><span class="cx">         return 0;
</span><span class="cx"> 
</span><del>-    ScrollingNodeID nodeID = backing-&gt;scrollingNodeIDForRole(nodeType);
</del><ins>+    LayerScrollCoordinationRole role = scrollCoordinationRoleForNodeType(nodeType);
+    ScrollingNodeID nodeID = backing-&gt;scrollingNodeIDForRole(role);
</ins><span class="cx">     if (!nodeID)
</span><span class="cx">         nodeID = scrollingCoordinator-&gt;uniqueScrollLayerID();
</span><span class="cx"> 
</span><span class="lines">@@ -3807,37 +3822,29 @@
</span><span class="cx">     if (!nodeID)
</span><span class="cx">         return 0;
</span><span class="cx"> 
</span><del>-    backing-&gt;setScrollingNodeIDForRole(nodeID, nodeType);
</del><ins>+    backing-&gt;setScrollingNodeIDForRole(nodeID, role);
</ins><span class="cx">     m_scrollingNodeToLayerMap.add(nodeID, &amp;layer);
</span><span class="cx">     
</span><span class="cx">     return nodeID;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RenderLayerCompositor::detachScrollCoordinatedLayerForRole(RenderLayer&amp; layer, ScrollingNodeType role)
</del><ins>+void RenderLayerCompositor::detachScrollCoordinatedLayer(RenderLayer&amp; layer, LayerScrollCoordinationRoles roles)
</ins><span class="cx"> {
</span><span class="cx">     RenderLayerBacking* backing = layer.backing();
</span><span class="cx">     if (!backing)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    if (ScrollingNodeID nodeID = backing-&gt;scrollingNodeIDForRole(role))
-        m_scrollingNodeToLayerMap.remove(nodeID);
</del><ins>+    if (roles &amp; Scrolling) {
+        if (ScrollingNodeID nodeID = backing-&gt;scrollingNodeIDForRole(Scrolling))
+            m_scrollingNodeToLayerMap.remove(nodeID);
+    }
</ins><span class="cx"> 
</span><del>-    backing-&gt;detachFromScrollingCoordinatorForRole(role);
-}
</del><ins>+    if (roles &amp; ViewportConstrained) {
+        if (ScrollingNodeID nodeID = backing-&gt;scrollingNodeIDForRole(ViewportConstrained))
+            m_scrollingNodeToLayerMap.remove(nodeID);
+    }
</ins><span class="cx"> 
</span><del>-void RenderLayerCompositor::detachScrollCoordinatedLayer(RenderLayer&amp; layer)
-{
-    RenderLayerBacking* backing = layer.backing();
-    if (!backing)
-        return;
-
-    if (ScrollingNodeID nodeID = backing-&gt;scrollingNodeIDForRole(FrameScrollingNode))
-        m_scrollingNodeToLayerMap.remove(nodeID);
-
-    if (ScrollingNodeID nodeID = backing-&gt;scrollingNodeIDForRole(FixedNode))
-        m_scrollingNodeToLayerMap.remove(nodeID);
-
-    backing-&gt;detachFromScrollingCoordinator();
</del><ins>+    backing-&gt;detachFromScrollingCoordinator(roles);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RenderLayerCompositor::updateScrollCoordinationForThisFrame(ScrollingNodeID parentNodeID)
</span><span class="lines">@@ -3849,7 +3856,7 @@
</span><span class="cx">     scrollingCoordinator-&gt;updateFrameScrollingNode(nodeID, m_scrollLayer.get(), m_rootContentLayer.get(), fixedRootBackgroundLayer(), clipLayer());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RenderLayerCompositor::updateScrollCoordinatedLayer(RenderLayer&amp; layer, ScrollCoordinationReasons reasons)
</del><ins>+void RenderLayerCompositor::updateScrollCoordinatedLayer(RenderLayer&amp; layer, LayerScrollCoordinationRoles reasons)
</ins><span class="cx"> {
</span><span class="cx">     ScrollingCoordinator* scrollingCoordinator = this-&gt;scrollingCoordinator();
</span><span class="cx">     if (!scrollingCoordinator || !scrollingCoordinator-&gt;coordinatesScrollingForFrameView(m_renderView.frameView()))
</span><span class="lines">@@ -3874,7 +3881,7 @@
</span><span class="cx">             return;
</span><span class="cx"> 
</span><span class="cx">         updateScrollCoordinationForThisFrame(parentDocumentHostingNodeID);
</span><del>-        if (!(reasons &amp; FixedOrSticky) &amp;&amp; isRootLayer)
</del><ins>+        if (!(reasons &amp; ViewportConstrained) &amp;&amp; isRootLayer)
</ins><span class="cx">             return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -3884,7 +3891,7 @@
</span><span class="cx">     
</span><span class="cx">     // Always call this even if the backing is already attached because the parent may have changed.
</span><span class="cx">     // If a node plays both roles, fixed/sticky is always the ancestor node of scrolling.
</span><del>-    if (reasons &amp; FixedOrSticky) {
</del><ins>+    if (reasons &amp; ViewportConstrained) {
</ins><span class="cx">         ScrollingNodeType nodeType = FrameScrollingNode;
</span><span class="cx">         if (layer.renderer().style().position() == FixedPosition)
</span><span class="cx">             nodeType = FixedNode;
</span><span class="lines">@@ -3911,7 +3918,7 @@
</span><span class="cx">         
</span><span class="cx">         parentNodeID = nodeID;
</span><span class="cx">     } else
</span><del>-        detachScrollCoordinatedLayerForRole(layer, FixedNode);
</del><ins>+        detachScrollCoordinatedLayer(layer, ViewportConstrained);
</ins><span class="cx"> 
</span><span class="cx">     if (reasons &amp; Scrolling) {
</span><span class="cx">         if (isRootLayer)
</span><span class="lines">@@ -3937,7 +3944,7 @@
</span><span class="cx">             scrollingCoordinator-&gt;updateOverflowScrollingNode(nodeID, backing-&gt;scrollingLayer(), backing-&gt;scrollingContentsLayer(), &amp;scrollingGeometry);
</span><span class="cx">         }
</span><span class="cx">     } else
</span><del>-        detachScrollCoordinatedLayerForRole(layer, OverflowScrollingNode);
</del><ins>+        detachScrollCoordinatedLayer(layer, Scrolling);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> ScrollableArea* RenderLayerCompositor::scrollableAreaForScrollLayerID(ScrollingNodeID nodeID) const
</span><span class="lines">@@ -4030,7 +4037,7 @@
</span><span class="cx"> void RenderLayerCompositor::willRemoveScrollingLayerWithBacking(RenderLayer&amp; layer, RenderLayerBacking&amp; backing)
</span><span class="cx"> {
</span><span class="cx">     if (ScrollingCoordinator* scrollingCoordinator = this-&gt;scrollingCoordinator()) {
</span><del>-        backing.detachFromScrollingCoordinator();
</del><ins>+        backing.detachFromScrollingCoordinator(Scrolling);
</ins><span class="cx"> 
</span><span class="cx">         // For Coordinated Graphics.
</span><span class="cx">         scrollingCoordinator-&gt;scrollableAreaScrollLayerDidChange(layer);
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerCompositorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.h (182808 => 182809)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayerCompositor.h        2015-04-14 21:08:02 UTC (rev 182808)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.h        2015-04-14 21:14:07 UTC (rev 182809)
</span><span class="lines">@@ -424,17 +424,10 @@
</span><span class="cx"> 
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    enum ScrollCoordinationReason {
-        FixedOrSticky = 1 &lt;&lt; 0,
-        Scrolling = 1 &lt;&lt; 1
-    };
-    typedef unsigned ScrollCoordinationReasons;
-
</del><span class="cx">     void updateScrollCoordinationForThisFrame(ScrollingNodeID);
</span><span class="cx">     ScrollingNodeID attachScrollingNode(RenderLayer&amp;, ScrollingNodeType, ScrollingNodeID parentNodeID);
</span><del>-    void updateScrollCoordinatedLayer(RenderLayer&amp;, ScrollCoordinationReasons);
-    void detachScrollCoordinatedLayer(RenderLayer&amp;);
-    void detachScrollCoordinatedLayerForRole(RenderLayer&amp;, ScrollingNodeType);
</del><ins>+    void updateScrollCoordinatedLayer(RenderLayer&amp;, LayerScrollCoordinationRoles);
+    void detachScrollCoordinatedLayer(RenderLayer&amp;, LayerScrollCoordinationRoles);
</ins><span class="cx">     void reattachSubframeScrollLayers();
</span><span class="cx">     
</span><span class="cx">     FixedPositionViewportConstraints computeFixedViewportConstraints(RenderLayer&amp;) const;
</span></span></pre>
</div>
</div>

</body>
</html>