<!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>[168119] 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/168119">168119</a></dd>
<dt>Author</dt> <dd>simon.fraser@apple.com</dd>
<dt>Date</dt> <dd>2014-05-01 13:56:21 -0700 (Thu, 01 May 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Don't always make backing store for -webkit-backface-visibility:hidden
https://bugs.webkit.org/show_bug.cgi?id=132420

Reviewed by Sam Weinig.

Source/WebCore:
Previously, -webkit-backface-visibility:hidden unconditionally created
compositing layers with backing store. This results in high memory use
on pages with this style applied to many elements (a cargo-cult &quot;optimization&quot;).

Fix by only having -webkit-backface-visibility:hidden create compositing layers
if some ancestor has a 3D transform. That's the only scenario in which the
element can be flipped around to reveal the back side, so the only time we need
to do compositing for this property. In future, we could be smarter, and only
consider 3D transforms in the current preserve-3d context.

Tests: compositing/backing/backface-visibility-in-3dtransformed.html
       compositing/backing/backface-visibility-in-transformed.html
       compositing/backing/backface-visibility.html

* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::RenderLayer):
(WebCore::RenderLayer::updateLayerPositions):
(WebCore::RenderLayer::hitTestLayer):
* rendering/RenderLayer.h:
* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::requiresCompositingLayer):
(WebCore::RenderLayerCompositor::requiresOwnBackingStore):
(WebCore::RenderLayerCompositor::requiresCompositingForBackfaceVisibility):
* rendering/RenderLayerCompositor.h:

LayoutTests:
Dump layers for elements with backface-visibility: hidden with various types
of ancestors.

* compositing/backing/backface-visibility-expected.txt: Added.
* compositing/backing/backface-visibility-in-3dtransformed-expected.txt: Added.
* compositing/backing/backface-visibility-in-3dtransformed.html: Added.
* compositing/backing/backface-visibility-in-transformed-expected.txt: Added.
* compositing/backing/backface-visibility-in-transformed.html: Added.
* compositing/backing/backface-visibility.html: Added.
* inspector-protocol/layers/layers-anonymous.html: Don't use backface-visibility
for force a layer.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsinspectorprotocollayerslayersanonymoushtml">trunk/LayoutTests/inspector-protocol/layers/layers-anonymous.html</a></li>
<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>
<li><a href="#trunkSourceWebCorerenderingRenderLayerCompositorcpp">trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayerCompositorh">trunk/Source/WebCore/rendering/RenderLayerCompositor.h</a></li>
<li><a href="#trunkWebKitxcworkspacexcshareddataxcschemesAllSourcetargetWebProcessxcscheme">trunk/WebKit.xcworkspace/xcshareddata/xcschemes/All Source (target WebProcess).xcscheme</a></li>
<li><a href="#trunkWebKitxcworkspacexcshareddataxcschemesAllSourcexcscheme">trunk/WebKit.xcworkspace/xcshareddata/xcschemes/All Source.xcscheme</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestscompositingbackingbackfacevisibilityexpectedtxt">trunk/LayoutTests/compositing/backing/backface-visibility-expected.txt</a></li>
<li><a href="#trunkLayoutTestscompositingbackingbackfacevisibilityin3dtransformedexpectedtxt">trunk/LayoutTests/compositing/backing/backface-visibility-in-3dtransformed-expected.txt</a></li>
<li><a href="#trunkLayoutTestscompositingbackingbackfacevisibilityin3dtransformedhtml">trunk/LayoutTests/compositing/backing/backface-visibility-in-3dtransformed.html</a></li>
<li><a href="#trunkLayoutTestscompositingbackingbackfacevisibilityintransformedexpectedtxt">trunk/LayoutTests/compositing/backing/backface-visibility-in-transformed-expected.txt</a></li>
<li><a href="#trunkLayoutTestscompositingbackingbackfacevisibilityintransformedhtml">trunk/LayoutTests/compositing/backing/backface-visibility-in-transformed.html</a></li>
<li><a href="#trunkLayoutTestscompositingbackingbackfacevisibilityhtml">trunk/LayoutTests/compositing/backing/backface-visibility.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (168118 => 168119)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-05-01 20:39:55 UTC (rev 168118)
+++ trunk/LayoutTests/ChangeLog        2014-05-01 20:56:21 UTC (rev 168119)
</span><span class="lines">@@ -1,3 +1,22 @@
</span><ins>+2014-05-01  Simon Fraser  &lt;simon.fraser@apple.com&gt;
+
+        Don't always make backing store for -webkit-backface-visibility:hidden
+        https://bugs.webkit.org/show_bug.cgi?id=132420
+
+        Reviewed by Sam Weinig.
+        
+        Dump layers for elements with backface-visibility: hidden with various types
+        of ancestors.
+
+        * compositing/backing/backface-visibility-expected.txt: Added.
+        * compositing/backing/backface-visibility-in-3dtransformed-expected.txt: Added.
+        * compositing/backing/backface-visibility-in-3dtransformed.html: Added.
+        * compositing/backing/backface-visibility-in-transformed-expected.txt: Added.
+        * compositing/backing/backface-visibility-in-transformed.html: Added.
+        * compositing/backing/backface-visibility.html: Added.
+        * inspector-protocol/layers/layers-anonymous.html: Don't use backface-visibility
+        for force a layer.
+
</ins><span class="cx"> 2014-05-01  Brent Fulgham  &lt;bfulgham@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Fix handling of attributes prior to compiling shader
</span></span></pre></div>
<a id="trunkLayoutTestscompositingbackingbackfacevisibilityexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/compositing/backing/backface-visibility-expected.txt (0 => 168119)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/compositing/backing/backface-visibility-expected.txt                                (rev 0)
+++ trunk/LayoutTests/compositing/backing/backface-visibility-expected.txt        2014-05-01 20:56:21 UTC (rev 168119)
</span><span class="lines">@@ -0,0 +1,3 @@
</span><ins>+Should be no layers here.
+
+
</ins></span></pre></div>
<a id="trunkLayoutTestscompositingbackingbackfacevisibilityin3dtransformedexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/compositing/backing/backface-visibility-in-3dtransformed-expected.txt (0 => 168119)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/compositing/backing/backface-visibility-in-3dtransformed-expected.txt                                (rev 0)
+++ trunk/LayoutTests/compositing/backing/backface-visibility-in-3dtransformed-expected.txt        2014-05-01 20:56:21 UTC (rev 168119)
</span><span class="lines">@@ -0,0 +1,28 @@
</span><ins>+Should be several layers here.
+
+(GraphicsLayer
+  (bounds 800.00 600.00)
+  (children 1
+    (GraphicsLayer
+      (bounds 800.00 600.00)
+      (contentsOpaque 1)
+      (children 1
+        (GraphicsLayer
+          (position 8.00 50.00)
+          (bounds 122.00 122.00)
+          (drawsContent 1)
+          (transform [1.00 0.00 0.00 0.00] [0.00 1.00 0.00 0.00] [0.00 0.00 1.00 0.00] [0.00 0.00 10.00 1.00])
+          (children 1
+            (GraphicsLayer
+              (position 11.00 11.00)
+              (bounds 100.00 100.00)
+              (contentsOpaque 1)
+              (backfaceVisibility hidden)
+            )
+          )
+        )
+      )
+    )
+  )
+)
+
</ins></span></pre></div>
<a id="trunkLayoutTestscompositingbackingbackfacevisibilityin3dtransformedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/compositing/backing/backface-visibility-in-3dtransformed.html (0 => 168119)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/compositing/backing/backface-visibility-in-3dtransformed.html                                (rev 0)
+++ trunk/LayoutTests/compositing/backing/backface-visibility-in-3dtransformed.html        2014-05-01 20:56:21 UTC (rev 168119)
</span><span class="lines">@@ -0,0 +1,46 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+
+&lt;html&gt;
+&lt;head&gt;
+    &lt;style&gt;
+        .container {
+            height: 100px;
+            width: 100px;
+            padding: 10px;
+            border: 1px solid gray;
+        }
+        .box {
+          width: 100px;
+          height: 100px;
+          background-color: silver;
+        }
+        
+        .transformed {
+            -webkit-transform: translateZ(10px);
+        }
+        .backface-hidden {
+            -webkit-backface-visibility: hidden;
+        }
+    &lt;/style&gt;
+    &lt;script&gt;
+        if (window.testRunner)
+            testRunner.dumpAsText();
+
+        function dumpLayers()
+        {
+            var layersResult = document.getElementById('layers');
+            if (window.testRunner)
+                layersResult.innerText = window.internals.layerTreeAsText(document);
+
+        }
+        window.addEventListener('load', dumpLayers, false)
+    &lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+    &lt;p&gt;Should be several layers here.&lt;/p&gt;
+    &lt;div class=&quot;transformed container&quot;&gt;
+        &lt;div class=&quot;backface-hidden box&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+&lt;pre id=&quot;layers&quot;&gt;&lt;/pre&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestscompositingbackingbackfacevisibilityintransformedexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/compositing/backing/backface-visibility-in-transformed-expected.txt (0 => 168119)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/compositing/backing/backface-visibility-in-transformed-expected.txt                                (rev 0)
+++ trunk/LayoutTests/compositing/backing/backface-visibility-in-transformed-expected.txt        2014-05-01 20:56:21 UTC (rev 168119)
</span><span class="lines">@@ -0,0 +1,3 @@
</span><ins>+Should be no layers here.
+
+
</ins></span></pre></div>
<a id="trunkLayoutTestscompositingbackingbackfacevisibilityintransformedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/compositing/backing/backface-visibility-in-transformed.html (0 => 168119)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/compositing/backing/backface-visibility-in-transformed.html                                (rev 0)
+++ trunk/LayoutTests/compositing/backing/backface-visibility-in-transformed.html        2014-05-01 20:56:21 UTC (rev 168119)
</span><span class="lines">@@ -0,0 +1,46 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+
+&lt;html&gt;
+&lt;head&gt;
+    &lt;style&gt;
+        .container {
+            height: 100px;
+            width: 100px;
+            padding: 10px;
+            border: 1px solid gray;
+        }
+        .box {
+          width: 100px;
+          height: 100px;
+          background-color: silver;
+        }
+        
+        .transformed {
+            -webkit-transform: translate(10px, 10px);
+        }
+        .backface-hidden {
+            -webkit-backface-visibility: hidden;
+        }
+    &lt;/style&gt;
+    &lt;script&gt;
+        if (window.testRunner)
+            testRunner.dumpAsText();
+
+        function dumpLayers()
+        {
+            var layersResult = document.getElementById('layers');
+            if (window.testRunner)
+                layersResult.innerText = window.internals.layerTreeAsText(document);
+
+        }
+        window.addEventListener('load', dumpLayers, false)
+    &lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+    &lt;p&gt;Should be no layers here.&lt;/p&gt;
+    &lt;div class=&quot;transformed container&quot;&gt;
+        &lt;div class=&quot;backface-hidden box&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+&lt;pre id=&quot;layers&quot;&gt;&lt;/pre&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestscompositingbackingbackfacevisibilityhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/compositing/backing/backface-visibility.html (0 => 168119)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/compositing/backing/backface-visibility.html                                (rev 0)
+++ trunk/LayoutTests/compositing/backing/backface-visibility.html        2014-05-01 20:56:21 UTC (rev 168119)
</span><span class="lines">@@ -0,0 +1,35 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+
+&lt;html&gt;
+&lt;head&gt;
+    &lt;style&gt;
+        .box {
+          width: 100px;
+          height: 100px;
+          background-color: silver;
+        }
+        
+        .backface-hidden {
+            -webkit-backface-visibility: hidden;
+        }
+    &lt;/style&gt;
+    &lt;script&gt;
+        if (window.testRunner)
+            testRunner.dumpAsText();
+
+        function dumpLayers()
+        {
+            var layersResult = document.getElementById('layers');
+            if (window.testRunner)
+                layersResult.innerText = window.internals.layerTreeAsText(document);
+
+        }
+        window.addEventListener('load', dumpLayers, false)
+    &lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+    &lt;p&gt;Should be no layers here.&lt;/p&gt;
+    &lt;div class=&quot;backface-hidden box&quot;&gt;&lt;/div&gt;
+&lt;pre id=&quot;layers&quot;&gt;&lt;/pre&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsinspectorprotocollayerslayersanonymoushtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/inspector-protocol/layers/layers-anonymous.html (168118 => 168119)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector-protocol/layers/layers-anonymous.html        2014-05-01 20:39:55 UTC (rev 168118)
+++ trunk/LayoutTests/inspector-protocol/layers/layers-anonymous.html        2014-05-01 20:56:21 UTC (rev 168119)
</span><span class="lines">@@ -127,7 +127,7 @@
</span><span class="cx"> 
</span><span class="cx">     #first-letter::first-letter {
</span><span class="cx">         float: left;
</span><del>-        -webkit-backface-visibility: hidden;
</del><ins>+        -webkit-transform: translateZ(0);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx"> &lt;/style&gt;
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (168118 => 168119)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-05-01 20:39:55 UTC (rev 168118)
+++ trunk/Source/WebCore/ChangeLog        2014-05-01 20:56:21 UTC (rev 168119)
</span><span class="lines">@@ -1,3 +1,35 @@
</span><ins>+2014-05-01  Simon Fraser  &lt;simon.fraser@apple.com&gt;
+
+        Don't always make backing store for -webkit-backface-visibility:hidden
+        https://bugs.webkit.org/show_bug.cgi?id=132420
+
+        Reviewed by Sam Weinig.
+        
+        Previously, -webkit-backface-visibility:hidden unconditionally created
+        compositing layers with backing store. This results in high memory use
+        on pages with this style applied to many elements (a cargo-cult &quot;optimization&quot;).
+        
+        Fix by only having -webkit-backface-visibility:hidden create compositing layers
+        if some ancestor has a 3D transform. That's the only scenario in which the
+        element can be flipped around to reveal the back side, so the only time we need
+        to do compositing for this property. In future, we could be smarter, and only
+        consider 3D transforms in the current preserve-3d context.
+
+        Tests: compositing/backing/backface-visibility-in-3dtransformed.html
+               compositing/backing/backface-visibility-in-transformed.html
+               compositing/backing/backface-visibility.html
+
+        * rendering/RenderLayer.cpp:
+        (WebCore::RenderLayer::RenderLayer):
+        (WebCore::RenderLayer::updateLayerPositions):
+        (WebCore::RenderLayer::hitTestLayer):
+        * rendering/RenderLayer.h:
+        * rendering/RenderLayerCompositor.cpp:
+        (WebCore::RenderLayerCompositor::requiresCompositingLayer):
+        (WebCore::RenderLayerCompositor::requiresOwnBackingStore):
+        (WebCore::RenderLayerCompositor::requiresCompositingForBackfaceVisibility):
+        * rendering/RenderLayerCompositor.h:
+
</ins><span class="cx"> 2014-05-01  Alex Christensen  &lt;achristensen@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Finish updating ANGLE.
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (168118 => 168119)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayer.cpp        2014-05-01 20:39:55 UTC (rev 168118)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp        2014-05-01 20:56:21 UTC (rev 168119)
</span><span class="lines">@@ -169,6 +169,8 @@
</span><span class="cx">     , m_3DTransformedDescendantStatusDirty(true)
</span><span class="cx">     , m_has3DTransformedDescendant(false)
</span><span class="cx">     , m_hasCompositingDescendant(false)
</span><ins>+    , m_hasTransformedAncestor(false)
+    , m_has3DTransformedAncestor(false)
</ins><span class="cx">     , m_indirectCompositingReason(NoIndirectCompositingReason)
</span><span class="cx">     , m_viewportConstrainedNotCompositedReason(NoNotCompositedReason)
</span><span class="cx"> #if PLATFORM(IOS)
</span><span class="lines">@@ -449,6 +451,8 @@
</span><span class="cx">         clearRepaintRects();
</span><span class="cx"> 
</span><span class="cx">     m_repaintStatus = NeedsNormalRepaint;
</span><ins>+    m_hasTransformedAncestor = flags &amp; SeenTransformedLayer;
+    m_has3DTransformedAncestor = flags &amp; Seen3DTransformedLayer;
</ins><span class="cx"> 
</span><span class="cx">     // Go ahead and update the reflection's position and size.
</span><span class="cx">     if (m_reflection)
</span><span class="lines">@@ -467,6 +471,12 @@
</span><span class="cx">     if (renderer().hasColumns())
</span><span class="cx">         flags |= UpdatePagination;
</span><span class="cx"> 
</span><ins>+    if (transform()) {
+        flags |= SeenTransformedLayer;
+        if (!transform()-&gt;isAffine())
+            flags |= Seen3DTransformedLayer;
+    }
+
</ins><span class="cx">     for (RenderLayer* child = firstChild(); child; child = child-&gt;nextSibling())
</span><span class="cx">         child-&gt;updateLayerPositions(geometryMap, flags);
</span><span class="cx"> 
</span><span class="lines">@@ -4931,7 +4941,7 @@
</span><span class="cx">         // We computed the correct state in the caller (above code), so just reference it.
</span><span class="cx">         ASSERT(transformState);
</span><span class="cx">         localTransformState = const_cast&lt;HitTestingTransformState*&gt;(transformState);
</span><del>-    } else if (transformState || m_has3DTransformedDescendant || preserves3D()) {
</del><ins>+    } else if (transformState || has3DTransformedDescendant() || preserves3D()) {
</ins><span class="cx">         // We need transform state for the first time, or to offset the container state, so create it here.
</span><span class="cx">         localTransformState = createLocalTransformState(rootLayer, containerLayer, hitTestRect, hitTestLocation, transformState);
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayer.h (168118 => 168119)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayer.h        2014-05-01 20:39:55 UTC (rev 168118)
+++ trunk/Source/WebCore/rendering/RenderLayer.h        2014-05-01 20:56:21 UTC (rev 168119)
</span><span class="lines">@@ -499,7 +499,9 @@
</span><span class="cx">         NeedsFullRepaintInBacking = 1 &lt;&lt; 1,
</span><span class="cx">         IsCompositingUpdateRoot = 1 &lt;&lt; 2,
</span><span class="cx">         UpdateCompositingLayers = 1 &lt;&lt; 3,
</span><del>-        UpdatePagination = 1 &lt;&lt; 4
</del><ins>+        UpdatePagination = 1 &lt;&lt; 4,
+        SeenTransformedLayer = 1 &lt;&lt; 5,
+        Seen3DTransformedLayer = 1 &lt;&lt; 6
</ins><span class="cx">     };
</span><span class="cx">     typedef unsigned UpdateLayerPositionsFlags;
</span><span class="cx">     static const UpdateLayerPositionsFlags defaultFlags = CheckForRepaint | IsCompositingUpdateRoot | UpdateCompositingLayers;
</span><span class="lines">@@ -1113,10 +1115,11 @@
</span><span class="cx">     void updateDescendantDependentFlags(HashSet&lt;const RenderObject*&gt;* outOfFlowDescendantContainingBlocks = 0);
</span><span class="cx">     bool checkIfDescendantClippingContextNeedsUpdate(bool isClipping);
</span><span class="cx"> 
</span><del>-    // This flag is computed by RenderLayerCompositor, which knows more about 3d hierarchies than we do.
-    void setHas3DTransformedDescendant(bool b) { m_has3DTransformedDescendant = b; }
</del><span class="cx">     bool has3DTransformedDescendant() const { return m_has3DTransformedDescendant; }
</span><del>-    
</del><ins>+
+    bool hasTransformedAncestor() const { return m_hasTransformedAncestor; }
+    bool has3DTransformedAncestor() const { return m_has3DTransformedAncestor; }
+
</ins><span class="cx">     void dirty3DTransformedDescendantStatus();
</span><span class="cx">     // Both updates the status, and returns true if descendants of this have 3d.
</span><span class="cx">     bool update3DTransformedDescendantStatus();
</span><span class="lines">@@ -1253,6 +1256,10 @@
</span><span class="cx">     bool m_has3DTransformedDescendant : 1;  // Set on a stacking context layer that has 3D descendants anywhere
</span><span class="cx">                                             // in a preserves3D hierarchy. Hint to do 3D-aware hit testing.
</span><span class="cx">     bool m_hasCompositingDescendant : 1; // In the z-order tree.
</span><ins>+
+    bool m_hasTransformedAncestor : 1;
+    bool m_has3DTransformedAncestor : 1;
+
</ins><span class="cx">     unsigned m_indirectCompositingReason : 3;
</span><span class="cx">     unsigned m_viewportConstrainedNotCompositedReason : 2;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerCompositorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (168118 => 168119)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp        2014-05-01 20:39:55 UTC (rev 168118)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp        2014-05-01 20:56:21 UTC (rev 168119)
</span><span class="lines">@@ -2032,7 +2032,7 @@
</span><span class="cx">         || requiresCompositingForCanvas(*renderer)
</span><span class="cx">         || requiresCompositingForPlugin(*renderer)
</span><span class="cx">         || requiresCompositingForFrame(*renderer)
</span><del>-        || (canRender3DTransforms() &amp;&amp; renderer-&gt;style().backfaceVisibility() == BackfaceVisibilityHidden)
</del><ins>+        || requiresCompositingForBackfaceVisibility(*renderer)
</ins><span class="cx">         || clipsCompositingDescendants(*renderer-&gt;layer())
</span><span class="cx">         || requiresCompositingForAnimation(*renderer)
</span><span class="cx">         || requiresCompositingForFilters(*renderer)
</span><span class="lines">@@ -2075,7 +2075,7 @@
</span><span class="cx">         || requiresCompositingForCanvas(renderer)
</span><span class="cx">         || requiresCompositingForPlugin(renderer)
</span><span class="cx">         || requiresCompositingForFrame(renderer)
</span><del>-        || (canRender3DTransforms() &amp;&amp; renderer.style().backfaceVisibility() == BackfaceVisibilityHidden)
</del><ins>+        || requiresCompositingForBackfaceVisibility(renderer)
</ins><span class="cx">         || requiresCompositingForAnimation(renderer)
</span><span class="cx">         || requiresCompositingForFilters(renderer)
</span><span class="cx">         || requiresCompositingForPosition(renderer, layer)
</span><span class="lines">@@ -2342,6 +2342,14 @@
</span><span class="cx">     return renderer.hasTransform() &amp;&amp; renderer.style().transform().has3DOperation();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool RenderLayerCompositor::requiresCompositingForBackfaceVisibility(RenderLayerModelObject&amp; renderer) const
+{
+    if (!(m_compositingTriggers &amp; ChromeClient::ThreeDTransformTrigger))
+        return false;
+
+    return renderer.style().backfaceVisibility() == BackfaceVisibilityHidden &amp;&amp; renderer.layer()-&gt;has3DTransformedAncestor();
+}
+
</ins><span class="cx"> bool RenderLayerCompositor::requiresCompositingForVideo(RenderLayerModelObject&amp; renderer) const
</span><span class="cx"> {
</span><span class="cx">     if (!(m_compositingTriggers &amp; ChromeClient::VideoTrigger))
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerCompositorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.h (168118 => 168119)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayerCompositor.h        2014-05-01 20:39:55 UTC (rev 168118)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.h        2014-05-01 20:56:21 UTC (rev 168119)
</span><span class="lines">@@ -392,6 +392,7 @@
</span><span class="cx">     // Whether a running transition or animation enforces the need for a compositing layer.
</span><span class="cx">     bool requiresCompositingForAnimation(RenderLayerModelObject&amp;) const;
</span><span class="cx">     bool requiresCompositingForTransform(RenderLayerModelObject&amp;) const;
</span><ins>+    bool requiresCompositingForBackfaceVisibility(RenderLayerModelObject&amp;) const;
</ins><span class="cx">     bool requiresCompositingForVideo(RenderLayerModelObject&amp;) const;
</span><span class="cx">     bool requiresCompositingForCanvas(RenderLayerModelObject&amp;) const;
</span><span class="cx">     bool requiresCompositingForPlugin(RenderLayerModelObject&amp;) const;
</span></span></pre></div>
<a id="trunkWebKitxcworkspacexcshareddataxcschemesAllSourcetargetWebProcessxcscheme"></a>
<div class="modfile"><h4>Modified: trunk/WebKit.xcworkspace/xcshareddata/xcschemes/All Source (target WebProcess).xcscheme (168118 => 168119)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebKit.xcworkspace/xcshareddata/xcschemes/All Source (target WebProcess).xcscheme        2014-05-01 20:39:55 UTC (rev 168118)
+++ trunk/WebKit.xcworkspace/xcshareddata/xcschemes/All Source (target WebProcess).xcscheme        2014-05-01 20:56:21 UTC (rev 168119)
</span><span class="lines">@@ -115,9 +115,9 @@
</span><span class="cx">             buildForAnalyzing = &quot;YES&quot;&gt;
</span><span class="cx">             &lt;BuildableReference
</span><span class="cx">                BuildableIdentifier = &quot;primary&quot;
</span><del>-               BlueprintIdentifier = &quot;1AD7451818D0D26C006F3A1E&quot;
-               BuildableName = &quot;WebKit.framework&quot;
-               BlueprintName = &quot;WebKit&quot;
</del><ins>+               BlueprintIdentifier = &quot;9398100A0824BF01008DF038&quot;
+               BuildableName = &quot;WebKitLegacy.framework&quot;
+               BlueprintName = &quot;WebKitLegacy&quot;
</ins><span class="cx">                ReferencedContainer = &quot;container:Source/WebKit/WebKit.xcodeproj&quot;&gt;
</span><span class="cx">             &lt;/BuildableReference&gt;
</span><span class="cx">          &lt;/BuildActionEntry&gt;
</span></span></pre></div>
<a id="trunkWebKitxcworkspacexcshareddataxcschemesAllSourcexcscheme"></a>
<div class="modfile"><h4>Modified: trunk/WebKit.xcworkspace/xcshareddata/xcschemes/All Source.xcscheme (168118 => 168119)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebKit.xcworkspace/xcshareddata/xcschemes/All Source.xcscheme        2014-05-01 20:39:55 UTC (rev 168118)
+++ trunk/WebKit.xcworkspace/xcshareddata/xcschemes/All Source.xcscheme        2014-05-01 20:56:21 UTC (rev 168119)
</span><span class="lines">@@ -115,9 +115,9 @@
</span><span class="cx">             buildForAnalyzing = &quot;YES&quot;&gt;
</span><span class="cx">             &lt;BuildableReference
</span><span class="cx">                BuildableIdentifier = &quot;primary&quot;
</span><del>-               BlueprintIdentifier = &quot;1AD7451818D0D26C006F3A1E&quot;
-               BuildableName = &quot;WebKit.framework&quot;
-               BlueprintName = &quot;WebKit&quot;
</del><ins>+               BlueprintIdentifier = &quot;9398100A0824BF01008DF038&quot;
+               BuildableName = &quot;WebKitLegacy.framework&quot;
+               BlueprintName = &quot;WebKitLegacy&quot;
</ins><span class="cx">                ReferencedContainer = &quot;container:Source/WebKit/WebKit.xcodeproj&quot;&gt;
</span><span class="cx">             &lt;/BuildableReference&gt;
</span><span class="cx">          &lt;/BuildActionEntry&gt;
</span></span></pre>
</div>
</div>

</body>
</html>