<!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>[177200] 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/177200">177200</a></dd>
<dt>Author</dt> <dd>simon.fraser@apple.com</dd>
<dt>Date</dt> <dd>2014-12-11 17:59:37 -0800 (Thu, 11 Dec 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Transform-style should not kill position:fixed
https://bugs.webkit.org/show_bug.cgi?id=138122

Reviewed by Dean Jackson.

Source/WebCore:

Various bits of rendering code checked RenderObject::hasTransform() for various
reasons. Confusingly, this meant &quot;has transform, or preserve-3d, or perspective&quot;.

This patch teases those behaviors apart to produce the following behavior:

1. &quot;transform&quot; acts as containing block for fixed position (no behavior change).
2. &quot;transform&quot; acts as containing block for absolute/relative position (no behavior change).
3. &quot;perspective&quot; does not act as containing block for fixed position (no behavior change).
4. &quot;perspective&quot; acts as containing block for absolute/relative position (no behavior change).
5. &quot;preserve-3d&quot; does not act as containing block for fixed position (behavior change).
6. &quot;preserve-3d&quot; acts as containing block for absolute/relative position. This is not a
behavior change, but seems like incorrect behavior (https://www.w3.org/Bugs/Public/show_bug.cgi?id=27566).
However, we may be forced to keep it for compatibility.

The gist of the change is to rename RenderObject::hasTransform() to RenderObject::hasTransformRelatedProperty(),
and add hasTransform() with the more restrictive meaning. All call sites of hasTransform() were examined
and fixed to produce the desired behaviors.

Tests: transforms/2d/perspective-not-fixed-container.html
       transforms/2d/preserve3d-not-fixed-container.html
       transforms/perspective-is-containing-block-for-absolute.html
       transforms/preserve3d-is-containing-block-for-absolute.html
       transforms/transform-is-containing-block-for-absolute.html

* css/CSSComputedStyleDeclaration.cpp:
(WebCore::computedTransform): Now we can just test hasTransform().
* rendering/LogicalSelectionOffsetCaches.h:
(WebCore::isContainingBlockCandidateForAbsolutelyPositionedObject): For now, this
can just use hasTransformRelatedProperty(), but if we change [6] above this will have
to change (as documented in the comment). Also FIXME comments about sharing code.
* rendering/RenderBox.cpp:
(WebCore::RenderBox::updateFromStyle):
(WebCore::RenderBox::mapLocalToContainer): Can just use hasTransform() now.
(WebCore::RenderBox::pushMappingToContainer): Ditto.
(WebCore::RenderBox::mapAbsoluteToLocalPoint): Ditto.
(WebCore::RenderBox::layoutOverflowRectForPropagation): Ditto.
* rendering/RenderBox.h: All transform-related properties create RenderLayers.
* rendering/RenderBoxModelObject.h: Ditto.
* rendering/RenderElement.cpp:
(WebCore::RenderElement::styleWillChange):
* rendering/RenderGeometryMap.cpp:
(WebCore::canMapBetweenRenderersViaLayers): Rename to clarify. We need to not map via
layers if we have a perspective (since we need to generate a perspective matrix). It's
OK with preserve-3d though.
(WebCore::RenderGeometryMap::pushMappingsToAncestor):
(WebCore::canMapBetweenRenderers): Deleted.
* rendering/RenderInline.cpp:
(WebCore::RenderInline::updateFromStyle):
* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::updateTransform): Can just check hasTransform().
(WebCore::RenderLayer::updateLayerPosition): Avoid calling parent() and enclosingPositionedAncestor() twice.
(WebCore::RenderLayer::perspectiveTransform): Do the fast bit check hasTransformRelatedProperty() first.
(WebCore::RenderLayer::perspectiveOrigin): Ditto.
(WebCore::isContainerForPositioned): This code has to now have different behavior for absolute and fixed
position. Changed it to call existing functions, rather than having a 3rd place that has to know about
containing block rules.
(WebCore::RenderLayer::enclosingAncestorForPosition): Call isContainerForPositioned() now.
(WebCore::accumulateOffsetTowardsAncestor): Call enclosingAncestorForPosition().
(WebCore::RenderLayer::createLocalTransformState):
(WebCore::RenderLayer::calculateClipRects):
(WebCore::isPositionedContainer): Deleted.
(WebCore::isFixedPositionedContainer): Deleted.
(WebCore::RenderLayer::enclosingPositionedAncestor): Deleted.
* rendering/RenderLayer.h:
* rendering/RenderLayerBacking.cpp:
(WebCore::RenderLayerBacking::updateGeometry):
* rendering/RenderLayerModelObject.cpp:
(WebCore::RenderLayerModelObject::styleDidChange):
* rendering/RenderObject.cpp:
(WebCore::RenderObject::shouldUseTransformFromContainer): Can just check hasTransform() now.
(WebCore::RenderObject::container):
* rendering/RenderObject.h:
(WebCore::RenderObject::hasTransformRelatedProperty):
(WebCore::RenderObject::hasTransform):
(WebCore::RenderObject::setHasTransformRelatedProperty):
(WebCore::RenderObject::RenderObjectBitfields::RenderObjectBitfields):
(WebCore::RenderObject::setHasTransform): Deleted.
* rendering/RenderTableRow.h:
* rendering/RenderView.cpp:
(WebCore::RenderView::mapLocalToContainer): nullptr goodness.
(WebCore::RenderView::pushMappingToContainer): Ditto.
(WebCore::RenderView::mapAbsoluteToLocalPoint): Ditto.

LayoutTests:

New tests and updated results:

* platform/mac/compositing/tiling/rotated-tiled-preserve3d-clamped-expected.txt: Progression, caused
by RenderLayerBacking::updateCompositedBounds() now allowing shouldClipCompositedBounds on
preserve-3d layers, since they are no longer considered to have a transform.
* platform/mac/compositing/visible-rect/3d-transform-style-expected.txt: Ditto.
* transforms/2d/perspective-not-fixed-container-expected.html: Added.
* transforms/2d/perspective-not-fixed-container.html: Added. Tests that
perspective does not act as containing block for fixed position (not a behavior change).
* transforms/2d/preserve3d-not-fixed-container-expected.html: Added.
* transforms/2d/preserve3d-not-fixed-container.html: Added. Tests that
preserve3d does not act as containing block for fixed position. This is a behavior change.
* transforms/perspective-is-containing-block-for-absolute-expected.html: Added.
* transforms/perspective-is-containing-block-for-absolute.html: Added. Tests that
perspective is a as containing block for absolute/relative position. This is not a behavior change.
* transforms/preserve3d-is-containing-block-for-absolute-expected.html: Added.
* transforms/preserve3d-is-containing-block-for-absolute.html: Added. Tests that
preserve3d is a as containing block for absolute/relative position. This is not a behavior change,
but seems like incorrect behavior for now.
* transforms/transform-is-containing-block-for-absolute-expected.html: Added.
* transforms/transform-is-containing-block-for-absolute.html: Added. Tests that
transform is a as containing block for absolute/relative position. This is not a behavior change.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsplatformiossimulatorcompositingtilingrotatedtiledpreserve3dclampedexpectedtxt">trunk/LayoutTests/platform/ios-simulator/compositing/tiling/rotated-tiled-preserve3d-clamped-expected.txt</a></li>
<li><a href="#trunkLayoutTestsplatformiossimulatorwk2compositingtilingrotatedtiledpreserve3dclampedexpectedtxt">trunk/LayoutTests/platform/ios-simulator-wk2/compositing/tiling/rotated-tiled-preserve3d-clamped-expected.txt</a></li>
<li><a href="#trunkLayoutTestsplatformmaccompositingtilingrotatedtiledpreserve3dclampedexpectedtxt">trunk/LayoutTests/platform/mac/compositing/tiling/rotated-tiled-preserve3d-clamped-expected.txt</a></li>
<li><a href="#trunkLayoutTestsplatformmaccompositingvisiblerect3dtransformstyleexpectedtxt">trunk/LayoutTests/platform/mac/compositing/visible-rect/3d-transform-style-expected.txt</a></li>
<li><a href="#trunkLayoutTestsplatformmacwk2compositingtilingrotatedtiledpreserve3dclampedexpectedtxt">trunk/LayoutTests/platform/mac-wk2/compositing/tiling/rotated-tiled-preserve3d-clamped-expected.txt</a></li>
<li><a href="#trunkLayoutTestsplatformwincompositingtilingrotatedtiledpreserve3dclampedexpectedtxt">trunk/LayoutTests/platform/win/compositing/tiling/rotated-tiled-preserve3d-clamped-expected.txt</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorecssCSSComputedStyleDeclarationcpp">trunk/Source/WebCore/css/CSSComputedStyleDeclaration.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingLogicalSelectionOffsetCachesh">trunk/Source/WebCore/rendering/LogicalSelectionOffsetCaches.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderBoxcpp">trunk/Source/WebCore/rendering/RenderBox.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderBoxh">trunk/Source/WebCore/rendering/RenderBox.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderBoxModelObjecth">trunk/Source/WebCore/rendering/RenderBoxModelObject.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderElementcpp">trunk/Source/WebCore/rendering/RenderElement.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderGeometryMapcpp">trunk/Source/WebCore/rendering/RenderGeometryMap.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderInlinecpp">trunk/Source/WebCore/rendering/RenderInline.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="#trunkSourceWebCorerenderingRenderLayerBackingcpp">trunk/Source/WebCore/rendering/RenderLayerBacking.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayerCompositorcpp">trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayerModelObjectcpp">trunk/Source/WebCore/rendering/RenderLayerModelObject.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderObjectcpp">trunk/Source/WebCore/rendering/RenderObject.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderObjecth">trunk/Source/WebCore/rendering/RenderObject.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderRegioncpp">trunk/Source/WebCore/rendering/RenderRegion.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderTableRowh">trunk/Source/WebCore/rendering/RenderTableRow.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderViewcpp">trunk/Source/WebCore/rendering/RenderView.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTeststransforms2dperspectivenotfixedcontainerexpectedhtml">trunk/LayoutTests/transforms/2d/perspective-not-fixed-container-expected.html</a></li>
<li><a href="#trunkLayoutTeststransforms2dperspectivenotfixedcontainerhtml">trunk/LayoutTests/transforms/2d/perspective-not-fixed-container.html</a></li>
<li><a href="#trunkLayoutTeststransforms2dpreserve3dnotfixedcontainerexpectedhtml">trunk/LayoutTests/transforms/2d/preserve3d-not-fixed-container-expected.html</a></li>
<li><a href="#trunkLayoutTeststransforms2dpreserve3dnotfixedcontainerhtml">trunk/LayoutTests/transforms/2d/preserve3d-not-fixed-container.html</a></li>
<li><a href="#trunkLayoutTeststransformsperspectiveiscontainingblockforabsoluteexpectedhtml">trunk/LayoutTests/transforms/perspective-is-containing-block-for-absolute-expected.html</a></li>
<li><a href="#trunkLayoutTeststransformsperspectiveiscontainingblockforabsolutehtml">trunk/LayoutTests/transforms/perspective-is-containing-block-for-absolute.html</a></li>
<li><a href="#trunkLayoutTeststransformspreserve3discontainingblockforabsoluteexpectedhtml">trunk/LayoutTests/transforms/preserve3d-is-containing-block-for-absolute-expected.html</a></li>
<li><a href="#trunkLayoutTeststransformspreserve3discontainingblockforabsolutehtml">trunk/LayoutTests/transforms/preserve3d-is-containing-block-for-absolute.html</a></li>
<li><a href="#trunkLayoutTeststransformstransformiscontainingblockforabsoluteexpectedhtml">trunk/LayoutTests/transforms/transform-is-containing-block-for-absolute-expected.html</a></li>
<li><a href="#trunkLayoutTeststransformstransformiscontainingblockforabsolutehtml">trunk/LayoutTests/transforms/transform-is-containing-block-for-absolute.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (177199 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-12-12 01:48:45 UTC (rev 177199)
+++ trunk/LayoutTests/ChangeLog        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -1,3 +1,33 @@
</span><ins>+2014-12-11  Simon Fraser  &lt;simon.fraser@apple.com&gt;
+
+        Transform-style should not kill position:fixed
+        https://bugs.webkit.org/show_bug.cgi?id=138122
+
+        Reviewed by Dean Jackson.
+        
+        New tests and updated results:
+
+        * platform/mac/compositing/tiling/rotated-tiled-preserve3d-clamped-expected.txt: Progression, caused
+        by RenderLayerBacking::updateCompositedBounds() now allowing shouldClipCompositedBounds on
+        preserve-3d layers, since they are no longer considered to have a transform.
+        * platform/mac/compositing/visible-rect/3d-transform-style-expected.txt: Ditto.
+        * transforms/2d/perspective-not-fixed-container-expected.html: Added.
+        * transforms/2d/perspective-not-fixed-container.html: Added. Tests that
+        perspective does not act as containing block for fixed position (not a behavior change).
+        * transforms/2d/preserve3d-not-fixed-container-expected.html: Added.
+        * transforms/2d/preserve3d-not-fixed-container.html: Added. Tests that
+        preserve3d does not act as containing block for fixed position. This is a behavior change.
+        * transforms/perspective-is-containing-block-for-absolute-expected.html: Added.
+        * transforms/perspective-is-containing-block-for-absolute.html: Added. Tests that
+        perspective is a as containing block for absolute/relative position. This is not a behavior change.
+        * transforms/preserve3d-is-containing-block-for-absolute-expected.html: Added.
+        * transforms/preserve3d-is-containing-block-for-absolute.html: Added. Tests that
+        preserve3d is a as containing block for absolute/relative position. This is not a behavior change,
+        but seems like incorrect behavior for now.
+        * transforms/transform-is-containing-block-for-absolute-expected.html: Added.
+        * transforms/transform-is-containing-block-for-absolute.html: Added. Tests that
+        transform is a as containing block for absolute/relative position. This is not a behavior change.
+
</ins><span class="cx"> 2014-12-11  Roger Fong  &lt;roger_fong@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Implement frag depth as a WebGL 1 extension.
</span></span></pre></div>
<a id="trunkLayoutTestsplatformiossimulatorcompositingtilingrotatedtiledpreserve3dclampedexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/ios-simulator/compositing/tiling/rotated-tiled-preserve3d-clamped-expected.txt (177199 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/ios-simulator/compositing/tiling/rotated-tiled-preserve3d-clamped-expected.txt        2014-12-12 01:48:45 UTC (rev 177199)
+++ trunk/LayoutTests/platform/ios-simulator/compositing/tiling/rotated-tiled-preserve3d-clamped-expected.txt        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -27,7 +27,6 @@
</span><span class="cx">               (contentsScale 2.00)
</span><span class="cx">               (children 1
</span><span class="cx">                 (GraphicsLayer
</span><del>-                  (bounds 500.00 0.00)
</del><span class="cx">                   (preserves3D 1)
</span><span class="cx">                   (visible rect 0.00, 0.00 0.00 x 0.00)
</span><span class="cx">                   (contentsScale 2.00)
</span></span></pre></div>
<a id="trunkLayoutTestsplatformiossimulatorwk2compositingtilingrotatedtiledpreserve3dclampedexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/ios-simulator-wk2/compositing/tiling/rotated-tiled-preserve3d-clamped-expected.txt (177199 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/ios-simulator-wk2/compositing/tiling/rotated-tiled-preserve3d-clamped-expected.txt        2014-12-12 01:48:45 UTC (rev 177199)
+++ trunk/LayoutTests/platform/ios-simulator-wk2/compositing/tiling/rotated-tiled-preserve3d-clamped-expected.txt        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -27,7 +27,6 @@
</span><span class="cx">               (contentsScale 2.00)
</span><span class="cx">               (children 1
</span><span class="cx">                 (GraphicsLayer
</span><del>-                  (bounds 500.00 0.00)
</del><span class="cx">                   (preserves3D 1)
</span><span class="cx">                   (visible rect 0.00, 0.00 0.00 x 0.00)
</span><span class="cx">                   (contentsScale 2.00)
</span></span></pre></div>
<a id="trunkLayoutTestsplatformmaccompositingtilingrotatedtiledpreserve3dclampedexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/mac/compositing/tiling/rotated-tiled-preserve3d-clamped-expected.txt (177199 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/mac/compositing/tiling/rotated-tiled-preserve3d-clamped-expected.txt        2014-12-12 01:48:45 UTC (rev 177199)
+++ trunk/LayoutTests/platform/mac/compositing/tiling/rotated-tiled-preserve3d-clamped-expected.txt        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -24,7 +24,6 @@
</span><span class="cx">               (contentsScale 1.00)
</span><span class="cx">               (children 1
</span><span class="cx">                 (GraphicsLayer
</span><del>-                  (bounds 500.00 0.00)
</del><span class="cx">                   (preserves3D 1)
</span><span class="cx">                   (visible rect 0.00, 0.00 0.00 x 0.00)
</span><span class="cx">                   (contentsScale 1.00)
</span></span></pre></div>
<a id="trunkLayoutTestsplatformmaccompositingvisiblerect3dtransformstyleexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/mac/compositing/visible-rect/3d-transform-style-expected.txt (177199 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/mac/compositing/visible-rect/3d-transform-style-expected.txt        2014-12-12 01:48:45 UTC (rev 177199)
+++ trunk/LayoutTests/platform/mac/compositing/visible-rect/3d-transform-style-expected.txt        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -24,7 +24,6 @@
</span><span class="cx">               (contentsScale 1.00)
</span><span class="cx">               (children 1
</span><span class="cx">                 (GraphicsLayer
</span><del>-                  (bounds 200.00 0.00)
</del><span class="cx">                   (preserves3D 1)
</span><span class="cx">                   (visible rect 0.00, 0.00 0.00 x 0.00)
</span><span class="cx">                   (contentsScale 1.00)
</span><span class="lines">@@ -56,7 +55,6 @@
</span><span class="cx">               (contentsScale 1.00)
</span><span class="cx">               (children 1
</span><span class="cx">                 (GraphicsLayer
</span><del>-                  (bounds 200.00 0.00)
</del><span class="cx">                   (preserves3D 1)
</span><span class="cx">                   (visible rect 0.00, 0.00 0.00 x 0.00)
</span><span class="cx">                   (contentsScale 1.00)
</span></span></pre></div>
<a id="trunkLayoutTestsplatformmacwk2compositingtilingrotatedtiledpreserve3dclampedexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/mac-wk2/compositing/tiling/rotated-tiled-preserve3d-clamped-expected.txt (177199 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/mac-wk2/compositing/tiling/rotated-tiled-preserve3d-clamped-expected.txt        2014-12-12 01:48:45 UTC (rev 177199)
+++ trunk/LayoutTests/platform/mac-wk2/compositing/tiling/rotated-tiled-preserve3d-clamped-expected.txt        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -27,7 +27,6 @@
</span><span class="cx">               (contentsScale 1.00)
</span><span class="cx">               (children 1
</span><span class="cx">                 (GraphicsLayer
</span><del>-                  (bounds 500.00 0.00)
</del><span class="cx">                   (preserves3D 1)
</span><span class="cx">                   (visible rect 0.00, 0.00 0.00 x 0.00)
</span><span class="cx">                   (contentsScale 1.00)
</span></span></pre></div>
<a id="trunkLayoutTestsplatformwincompositingtilingrotatedtiledpreserve3dclampedexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/win/compositing/tiling/rotated-tiled-preserve3d-clamped-expected.txt (177199 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/win/compositing/tiling/rotated-tiled-preserve3d-clamped-expected.txt        2014-12-12 01:48:45 UTC (rev 177199)
+++ trunk/LayoutTests/platform/win/compositing/tiling/rotated-tiled-preserve3d-clamped-expected.txt        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -19,7 +19,6 @@
</span><span class="cx">               (visible rect 0.00, 0.00 500.00 x 300.00)
</span><span class="cx">               (children 1
</span><span class="cx">                 (GraphicsLayer
</span><del>-                  (bounds 500.00 0.00)
</del><span class="cx">                   (preserves3D 1)
</span><span class="cx">                   (visible rect 0.00, 0.00 0.00 x 0.00)
</span><span class="cx">                   (children 1
</span></span></pre></div>
<a id="trunkLayoutTeststransforms2dperspectivenotfixedcontainerexpectedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/transforms/2d/perspective-not-fixed-container-expected.html (0 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/transforms/2d/perspective-not-fixed-container-expected.html                                (rev 0)
+++ trunk/LayoutTests/transforms/2d/perspective-not-fixed-container-expected.html        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -0,0 +1,49 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+
+&lt;html&gt;
+&lt;head&gt;
+  &lt;style&gt;
+    body {
+      margin: 0;
+      height: 1000px;
+    }
+
+    body &gt; div {
+      outline: 1px solid black;
+    }
+    
+    .box {
+      width: 100px;
+      height: 100px;
+    }
+
+    .fixed {
+      position: fixed;
+      top: 100px;
+      background-color: green;
+    }
+
+    .transformed {
+      -webkit-transform: translateZ(1px);
+    }
+  &lt;/style&gt;
+  &lt;script&gt;
+    // Scroll on load to test fixed positioning.
+    window.addEventListener('load', function() {
+      window.scrollTo(0, 100);
+    }, false)
+  &lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+
+  &lt;div class=&quot;box&quot; style=&quot;margin: 150px 50px;&quot;&gt;
+    &lt;div class=&quot;fixed box&quot;&gt;
+        &lt;div class=&quot;transformed box&quot;&gt;&lt;/div&gt; &lt;!-- Necessary to activate preserve3d compositing --&gt;
+    &lt;/div&gt;
+  &lt;/div&gt;
+
+  &lt;div class=&quot;fixed box&quot; style=&quot;left: 250px;&quot;&gt;
+    &lt;div class=&quot;transformed box&quot;&gt;&lt;/div&gt; &lt;!-- Necessary to activate preserve3d compositing --&gt;
+  &lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkLayoutTeststransforms2dperspectivenotfixedcontainerhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/transforms/2d/perspective-not-fixed-container.html (0 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/transforms/2d/perspective-not-fixed-container.html                                (rev 0)
+++ trunk/LayoutTests/transforms/2d/perspective-not-fixed-container.html        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -0,0 +1,53 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+
+&lt;html&gt;
+&lt;head&gt;
+  &lt;style&gt;
+    body {
+      margin: 0;
+      height: 1000px;
+    }
+    
+    body &gt; div {
+      outline: 1px solid black;
+    }
+    
+    .box {
+      width: 100px;
+      height: 100px;
+    }
+
+    .fixed {
+      position: fixed;
+      top: 100px;
+      background-color: green;
+    }
+
+    .perspective {
+      -webkit-perspective: 500px;
+    }
+
+    .transformed {
+      -webkit-transform: translateZ(1px);
+    }
+  &lt;/style&gt;
+  &lt;script&gt;
+    // Scroll on load to test fixed positioning.
+    window.addEventListener('load', function() {
+      window.scrollTo(0, 100);
+    }, false)
+  &lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+
+  &lt;div class=&quot;perspective box&quot; style=&quot;margin: 150px 50px;&quot;&gt;
+    &lt;div class=&quot;fixed box&quot;&gt;
+        &lt;div class=&quot;transformed box&quot;&gt;&lt;/div&gt; &lt;!-- Necessary to activate preserve3d compositing --&gt;
+    &lt;/div&gt;
+  &lt;/div&gt;
+
+  &lt;div class=&quot;perspective fixed box&quot; style=&quot;left: 250px;&quot;&gt;
+    &lt;div class=&quot;transformed box&quot;&gt;&lt;/div&gt; &lt;!-- Necessary to activate preserve3d compositing --&gt;
+  &lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkLayoutTeststransforms2dpreserve3dnotfixedcontainerexpectedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/transforms/2d/preserve3d-not-fixed-container-expected.html (0 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/transforms/2d/preserve3d-not-fixed-container-expected.html                                (rev 0)
+++ trunk/LayoutTests/transforms/2d/preserve3d-not-fixed-container-expected.html        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -0,0 +1,49 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+
+&lt;html&gt;
+&lt;head&gt;
+  &lt;style&gt;
+    body {
+      margin: 0;
+      height: 1000px;
+    }
+    
+    body &gt; div {
+      outline: 1px solid black;
+    }
+
+    .box {
+      width: 100px;
+      height: 100px;
+    }
+
+    .fixed {
+      position: fixed;
+      top: 100px;
+      background-color: green;
+    }
+
+    .transformed {
+      -webkit-transform: translateZ(1px);
+    }
+  &lt;/style&gt;
+  &lt;script&gt;
+    // Scroll on load to test fixed positioning.
+    window.addEventListener('load', function() {
+      window.scrollTo(0, 100);
+    }, false)
+  &lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+
+  &lt;div class=&quot;box&quot; style=&quot;margin: 150px 50px;&quot;&gt;
+    &lt;div class=&quot;fixed box&quot;&gt;
+        &lt;div class=&quot;transformed box&quot;&gt;&lt;/div&gt; &lt;!-- Necessary to activate preserve3d compositing --&gt;
+    &lt;/div&gt;
+  &lt;/div&gt;
+
+  &lt;div class=&quot;fixed box&quot; style=&quot;left: 250px;&quot;&gt;
+    &lt;div class=&quot;transformed box&quot;&gt;&lt;/div&gt; &lt;!-- Necessary to activate preserve3d compositing --&gt;
+  &lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkLayoutTeststransforms2dpreserve3dnotfixedcontainerhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/transforms/2d/preserve3d-not-fixed-container.html (0 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/transforms/2d/preserve3d-not-fixed-container.html                                (rev 0)
+++ trunk/LayoutTests/transforms/2d/preserve3d-not-fixed-container.html        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -0,0 +1,53 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+
+&lt;html&gt;
+&lt;head&gt;
+  &lt;style&gt;
+    body {
+      margin: 0;
+      height: 1000px;
+    }
+
+    body &gt; div {
+      outline: 1px solid black;
+    }
+    
+    .box {
+      width: 100px;
+      height: 100px;
+    }
+
+    .fixed {
+      position: fixed;
+      top: 100px;
+      background-color: green;
+    }
+
+    .preserve3d {
+      -webkit-transform-style: preserve-3d;
+    }
+
+    .transformed {
+      -webkit-transform: translateZ(1px);
+    }
+  &lt;/style&gt;
+  &lt;script&gt;
+    // Scroll on load to test fixed positioning.
+    window.addEventListener('load', function() {
+      window.scrollTo(0, 100);
+    }, false)
+  &lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+
+  &lt;div class=&quot;preserve3d box&quot; style=&quot;margin: 150px 50px;&quot;&gt;
+    &lt;div class=&quot;fixed box&quot;&gt;
+        &lt;div class=&quot;transformed box&quot;&gt;&lt;/div&gt; &lt;!-- Necessary to activate preserve3d compositing --&gt;
+    &lt;/div&gt;
+  &lt;/div&gt;
+
+  &lt;div class=&quot;preserve3d fixed box&quot; style=&quot;left: 250px;&quot;&gt;
+    &lt;div class=&quot;transformed box&quot;&gt;&lt;/div&gt; &lt;!-- Necessary to activate preserve3d compositing --&gt;
+  &lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkLayoutTeststransformsperspectiveiscontainingblockforabsoluteexpectedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/transforms/perspective-is-containing-block-for-absolute-expected.html (0 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/transforms/perspective-is-containing-block-for-absolute-expected.html                                (rev 0)
+++ trunk/LayoutTests/transforms/perspective-is-containing-block-for-absolute-expected.html        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -0,0 +1,28 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+
+&lt;html&gt;
+&lt;head&gt;
+    &lt;style&gt;
+        .container {
+            position: relative;
+            margin: 50px;
+            height: 100px;
+            width: 100px;
+            border: 1px solid black;
+        }
+        .box {
+            position: absolute;
+            top: 0;
+            left: 0;
+            height: 100%;
+            width: 100%;
+            background-color: gray;
+        }
+    &lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;div class=&quot;container&quot;&gt;
+    &lt;div class=&quot;box&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTeststransformsperspectiveiscontainingblockforabsolutehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/transforms/perspective-is-containing-block-for-absolute.html (0 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/transforms/perspective-is-containing-block-for-absolute.html                                (rev 0)
+++ trunk/LayoutTests/transforms/perspective-is-containing-block-for-absolute.html        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -0,0 +1,28 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+
+&lt;html&gt;
+&lt;head&gt;
+    &lt;style&gt;
+        .container {
+            margin: 50px;
+            height: 100px;
+            width: 100px;
+            border: 1px solid black;
+            -webkit-perspective: 100px;
+        }
+        .box {
+            position: absolute;
+            top: 0;
+            left: 0;
+            height: 100%;
+            width: 100%;
+            background-color: gray;
+        }
+    &lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;div class=&quot;container&quot;&gt;
+    &lt;div class=&quot;box&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTeststransformspreserve3discontainingblockforabsoluteexpectedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/transforms/preserve3d-is-containing-block-for-absolute-expected.html (0 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/transforms/preserve3d-is-containing-block-for-absolute-expected.html                                (rev 0)
+++ trunk/LayoutTests/transforms/preserve3d-is-containing-block-for-absolute-expected.html        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -0,0 +1,28 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+
+&lt;html&gt;
+&lt;head&gt;
+    &lt;style&gt;
+        .container {
+            position: relative;
+            margin: 50px;
+            height: 100px;
+            width: 100px;
+            border: 1px solid black;
+        }
+        .box {
+            position: absolute;
+            top: 0;
+            left: 0;
+            height: 100%;
+            width: 100%;
+            background-color: gray;
+        }
+    &lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;div class=&quot;container&quot;&gt;
+    &lt;div class=&quot;box&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTeststransformspreserve3discontainingblockforabsolutehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/transforms/preserve3d-is-containing-block-for-absolute.html (0 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/transforms/preserve3d-is-containing-block-for-absolute.html                                (rev 0)
+++ trunk/LayoutTests/transforms/preserve3d-is-containing-block-for-absolute.html        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -0,0 +1,30 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+
+&lt;html&gt;
+&lt;head&gt;
+    &lt;style&gt;
+        .container {
+            margin: 50px;
+            height: 100px;
+            width: 100px;
+            border: 1px solid black;
+            -webkit-transform-style: preserve-3d;
+            -moz-transform-style: preserve-3d;
+            transform-style: preserve-3d;
+        }
+        .box {
+            position: absolute;
+            top: 0;
+            left: 0;
+            height: 100%;
+            width: 100%;
+            background-color: gray;
+        }
+    &lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;div class=&quot;container&quot;&gt;
+    &lt;div class=&quot;box&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTeststransformstransformiscontainingblockforabsoluteexpectedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/transforms/transform-is-containing-block-for-absolute-expected.html (0 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/transforms/transform-is-containing-block-for-absolute-expected.html                                (rev 0)
+++ trunk/LayoutTests/transforms/transform-is-containing-block-for-absolute-expected.html        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -0,0 +1,28 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+
+&lt;html&gt;
+&lt;head&gt;
+    &lt;style&gt;
+        .container {
+            position: relative;
+            margin: 50px;
+            height: 100px;
+            width: 100px;
+            border: 1px solid black;
+        }
+        .box {
+            position: absolute;
+            top: 0;
+            left: 0;
+            height: 100%;
+            width: 100%;
+            background-color: gray;
+        }
+    &lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;div class=&quot;container&quot;&gt;
+    &lt;div class=&quot;box&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTeststransformstransformiscontainingblockforabsolutehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/transforms/transform-is-containing-block-for-absolute.html (0 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/transforms/transform-is-containing-block-for-absolute.html                                (rev 0)
+++ trunk/LayoutTests/transforms/transform-is-containing-block-for-absolute.html        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -0,0 +1,28 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+
+&lt;html&gt;
+&lt;head&gt;
+    &lt;style&gt;
+        .container {
+            margin: 50px;
+            height: 100px;
+            width: 100px;
+            border: 1px solid black;
+            -webkit-transform: translate(0, 0);
+        }
+        .box {
+            position: absolute;
+            top: 0;
+            left: 0;
+            height: 100%;
+            width: 100%;
+            background-color: gray;
+        }
+    &lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;div class=&quot;container&quot;&gt;
+    &lt;div class=&quot;box&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (177199 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-12-12 01:48:45 UTC (rev 177199)
+++ trunk/Source/WebCore/ChangeLog        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -1,3 +1,93 @@
</span><ins>+2014-12-11  Simon Fraser  &lt;simon.fraser@apple.com&gt;
+
+        Transform-style should not kill position:fixed
+        https://bugs.webkit.org/show_bug.cgi?id=138122
+
+        Reviewed by Dean Jackson.
+        
+        Various bits of rendering code checked RenderObject::hasTransform() for various
+        reasons. Confusingly, this meant &quot;has transform, or preserve-3d, or perspective&quot;.
+        
+        This patch teases those behaviors apart to produce the following behavior:
+        
+        1. &quot;transform&quot; acts as containing block for fixed position (no behavior change).
+        2. &quot;transform&quot; acts as containing block for absolute/relative position (no behavior change).
+        3. &quot;perspective&quot; does not act as containing block for fixed position (no behavior change).
+        4. &quot;perspective&quot; acts as containing block for absolute/relative position (no behavior change).
+        5. &quot;preserve-3d&quot; does not act as containing block for fixed position (behavior change).
+        6. &quot;preserve-3d&quot; acts as containing block for absolute/relative position. This is not a
+        behavior change, but seems like incorrect behavior (https://www.w3.org/Bugs/Public/show_bug.cgi?id=27566).
+        However, we may be forced to keep it for compatibility.
+        
+        The gist of the change is to rename RenderObject::hasTransform() to RenderObject::hasTransformRelatedProperty(),
+        and add hasTransform() with the more restrictive meaning. All call sites of hasTransform() were examined
+        and fixed to produce the desired behaviors.
+
+        Tests: transforms/2d/perspective-not-fixed-container.html
+               transforms/2d/preserve3d-not-fixed-container.html
+               transforms/perspective-is-containing-block-for-absolute.html
+               transforms/preserve3d-is-containing-block-for-absolute.html
+               transforms/transform-is-containing-block-for-absolute.html
+
+        * css/CSSComputedStyleDeclaration.cpp:
+        (WebCore::computedTransform): Now we can just test hasTransform().
+        * rendering/LogicalSelectionOffsetCaches.h:
+        (WebCore::isContainingBlockCandidateForAbsolutelyPositionedObject): For now, this
+        can just use hasTransformRelatedProperty(), but if we change [6] above this will have
+        to change (as documented in the comment). Also FIXME comments about sharing code.
+        * rendering/RenderBox.cpp:
+        (WebCore::RenderBox::updateFromStyle):
+        (WebCore::RenderBox::mapLocalToContainer): Can just use hasTransform() now.
+        (WebCore::RenderBox::pushMappingToContainer): Ditto.
+        (WebCore::RenderBox::mapAbsoluteToLocalPoint): Ditto.
+        (WebCore::RenderBox::layoutOverflowRectForPropagation): Ditto.
+        * rendering/RenderBox.h: All transform-related properties create RenderLayers.
+        * rendering/RenderBoxModelObject.h: Ditto.
+        * rendering/RenderElement.cpp:
+        (WebCore::RenderElement::styleWillChange):
+        * rendering/RenderGeometryMap.cpp:
+        (WebCore::canMapBetweenRenderersViaLayers): Rename to clarify. We need to not map via
+        layers if we have a perspective (since we need to generate a perspective matrix). It's
+        OK with preserve-3d though.
+        (WebCore::RenderGeometryMap::pushMappingsToAncestor):
+        (WebCore::canMapBetweenRenderers): Deleted.
+        * rendering/RenderInline.cpp:
+        (WebCore::RenderInline::updateFromStyle):
+        * rendering/RenderLayer.cpp:
+        (WebCore::RenderLayer::updateTransform): Can just check hasTransform().
+        (WebCore::RenderLayer::updateLayerPosition): Avoid calling parent() and enclosingPositionedAncestor() twice.
+        (WebCore::RenderLayer::perspectiveTransform): Do the fast bit check hasTransformRelatedProperty() first.
+        (WebCore::RenderLayer::perspectiveOrigin): Ditto.
+        (WebCore::isContainerForPositioned): This code has to now have different behavior for absolute and fixed
+        position. Changed it to call existing functions, rather than having a 3rd place that has to know about
+        containing block rules.
+        (WebCore::RenderLayer::enclosingAncestorForPosition): Call isContainerForPositioned() now.
+        (WebCore::accumulateOffsetTowardsAncestor): Call enclosingAncestorForPosition().
+        (WebCore::RenderLayer::createLocalTransformState):
+        (WebCore::RenderLayer::calculateClipRects):
+        (WebCore::isPositionedContainer): Deleted.
+        (WebCore::isFixedPositionedContainer): Deleted.
+        (WebCore::RenderLayer::enclosingPositionedAncestor): Deleted.
+        * rendering/RenderLayer.h:
+        * rendering/RenderLayerBacking.cpp:
+        (WebCore::RenderLayerBacking::updateGeometry):
+        * rendering/RenderLayerModelObject.cpp:
+        (WebCore::RenderLayerModelObject::styleDidChange):
+        * rendering/RenderObject.cpp:
+        (WebCore::RenderObject::shouldUseTransformFromContainer): Can just check hasTransform() now.
+        (WebCore::RenderObject::container):
+        * rendering/RenderObject.h:
+        (WebCore::RenderObject::hasTransformRelatedProperty):
+        (WebCore::RenderObject::hasTransform):
+        (WebCore::RenderObject::setHasTransformRelatedProperty):
+        (WebCore::RenderObject::RenderObjectBitfields::RenderObjectBitfields):
+        (WebCore::RenderObject::setHasTransform): Deleted.
+        * rendering/RenderTableRow.h:
+        * rendering/RenderView.cpp:
+        (WebCore::RenderView::mapLocalToContainer): nullptr goodness.
+        (WebCore::RenderView::pushMappingToContainer): Ditto.
+        (WebCore::RenderView::mapAbsoluteToLocalPoint): Ditto.
+
</ins><span class="cx"> 2014-12-11  Rich Tibbett &lt;rich.tibbett@gmail.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [iOS] Normalize iOS DeviceOrientation beta/gamma per spec.
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSComputedStyleDeclarationcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSComputedStyleDeclaration.cpp (177199 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSComputedStyleDeclaration.cpp        2014-12-12 01:48:45 UTC (rev 177199)
+++ trunk/Source/WebCore/css/CSSComputedStyleDeclaration.cpp        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -847,7 +847,7 @@
</span><span class="cx"> 
</span><span class="cx"> static PassRef&lt;CSSValue&gt; computedTransform(RenderObject* renderer, const RenderStyle* style)
</span><span class="cx"> {
</span><del>-    if (!renderer || !renderer-&gt;hasTransform() || !style-&gt;hasTransform())
</del><ins>+    if (!renderer || !renderer-&gt;hasTransform())
</ins><span class="cx">         return cssValuePool().createIdentifierValue(CSSValueNone);
</span><span class="cx"> 
</span><span class="cx">     FloatRect pixelSnappedRect;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingLogicalSelectionOffsetCachesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/LogicalSelectionOffsetCaches.h (177199 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/LogicalSelectionOffsetCaches.h        2014-12-12 01:48:45 UTC (rev 177199)
+++ trunk/Source/WebCore/rendering/LogicalSelectionOffsetCaches.h        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -25,10 +25,12 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><ins>+// FIXME: share code with RenderObject::container().
</ins><span class="cx"> static inline bool isContainingBlockCandidateForAbsolutelyPositionedObject(RenderElement&amp; object)
</span><span class="cx"> {
</span><ins>+    // FIXME: hasTransformRelatedProperty() includes preserves3D() check, but this may need to change: https://www.w3.org/Bugs/Public/show_bug.cgi?id=27566
</ins><span class="cx">     return object.style().position() != StaticPosition
</span><del>-        || (object.hasTransform() &amp;&amp; object.isRenderBlock())
</del><ins>+        || (object.isRenderBlock() &amp;&amp; object.hasTransformRelatedProperty())
</ins><span class="cx">         || object.isSVGForeignObject()
</span><span class="cx">         || object.isRenderView();
</span><span class="cx"> }
</span><span class="lines">@@ -38,6 +40,7 @@
</span><span class="cx">     return (object.isInline() &amp;&amp; !object.isReplaced()) || !object.isRenderBlock();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+// FIXME: share code with RenderObject::container().
</ins><span class="cx"> static inline RenderBlock* containingBlockForFixedPosition(RenderElement* parent)
</span><span class="cx"> {
</span><span class="cx">     RenderElement* object = parent;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderBoxcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderBox.cpp (177199 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderBox.cpp        2014-12-12 01:48:45 UTC (rev 177199)
+++ trunk/Source/WebCore/rendering/RenderBox.cpp        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -484,7 +484,7 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    setHasTransform(styleToUse.hasTransformRelatedProperty());
</del><ins>+    setHasTransformRelatedProperty(styleToUse.hasTransformRelatedProperty());
</ins><span class="cx">     setHasReflection(styleToUse.boxReflect());
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1918,10 +1918,9 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     bool isFixedPos = style().position() == FixedPosition;
</span><del>-    bool hasTransform = hasLayer() &amp;&amp; layer()-&gt;transform();
</del><span class="cx">     // If this box has a transform, it acts as a fixed position container for fixed descendants,
</span><span class="cx">     // and may itself also be fixed position. So propagate 'fixed' up only if this box is fixed position.
</span><del>-    if (hasTransform &amp;&amp; !isFixedPos)
</del><ins>+    if (hasTransform() &amp;&amp; !isFixedPos)
</ins><span class="cx">         mode &amp;= ~IsFixed;
</span><span class="cx">     else if (isFixedPos)
</span><span class="cx">         mode |= IsFixed;
</span><span class="lines">@@ -1967,8 +1966,6 @@
</span><span class="cx">         return nullptr;
</span><span class="cx"> 
</span><span class="cx">     bool isFixedPos = style().position() == FixedPosition;
</span><del>-    bool hasTransform = hasLayer() &amp;&amp; layer()-&gt;transform();
-
</del><span class="cx">     LayoutSize adjustmentForSkippedAncestor;
</span><span class="cx">     if (ancestorSkipped) {
</span><span class="cx">         // There can't be a transform between repaintContainer and o, because transforms create containers, so it should be safe
</span><span class="lines">@@ -1985,10 +1982,10 @@
</span><span class="cx">         getTransformFromContainer(container, containerOffset, t);
</span><span class="cx">         t.translateRight(adjustmentForSkippedAncestor.width(), adjustmentForSkippedAncestor.height());
</span><span class="cx">         
</span><del>-        geometryMap.push(this, t, preserve3D, offsetDependsOnPoint, isFixedPos, hasTransform);
</del><ins>+        geometryMap.push(this, t, preserve3D, offsetDependsOnPoint, isFixedPos, hasTransform());
</ins><span class="cx">     } else {
</span><span class="cx">         containerOffset += adjustmentForSkippedAncestor;
</span><del>-        geometryMap.push(this, containerOffset, preserve3D, offsetDependsOnPoint, isFixedPos, hasTransform);
</del><ins>+        geometryMap.push(this, containerOffset, preserve3D, offsetDependsOnPoint, isFixedPos, hasTransform());
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     return ancestorSkipped ? ancestorToStopAt : container;
</span><span class="lines">@@ -1997,8 +1994,7 @@
</span><span class="cx"> void RenderBox::mapAbsoluteToLocalPoint(MapCoordinatesFlags mode, TransformState&amp; transformState) const
</span><span class="cx"> {
</span><span class="cx">     bool isFixedPos = style().position() == FixedPosition;
</span><del>-    bool hasTransform = hasLayer() &amp;&amp; layer()-&gt;transform();
-    if (hasTransform &amp;&amp; !isFixedPos) {
</del><ins>+    if (hasTransform() &amp;&amp; !isFixedPos) {
</ins><span class="cx">         // If this box has a transform, it acts as a fixed position container for fixed descendants,
</span><span class="cx">         // and may itself also be fixed position. So propagate 'fixed' up only if this box is fixed position.
</span><span class="cx">         mode &amp;= ~IsFixed;
</span><span class="lines">@@ -4566,7 +4562,7 @@
</span><span class="cx">     if (!hasOverflowClip())
</span><span class="cx">         rect.unite(layoutOverflowRect());
</span><span class="cx"> 
</span><del>-    bool hasTransform = hasLayer() &amp;&amp; layer()-&gt;transform();
</del><ins>+    bool hasTransform = this-&gt;hasTransform();
</ins><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx">     if (isInFlowPositioned() || (hasTransform &amp;&amp; document().settings()-&gt;shouldTransformsAffectOverflow())) {
</span><span class="cx"> #else
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderBoxh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderBox.h (177199 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderBox.h        2014-12-12 01:48:45 UTC (rev 177199)
+++ trunk/Source/WebCore/rendering/RenderBox.h        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -53,7 +53,7 @@
</span><span class="cx">     virtual bool requiresLayer() const override
</span><span class="cx">     {
</span><span class="cx">         return isRoot() || isPositioned() || createsGroup() || hasClipPath() || hasOverflowClip()
</span><del>-            || hasTransform() || hasHiddenBackface() || hasReflection() || style().specifiesColumns()
</del><ins>+            || hasTransformRelatedProperty() || hasHiddenBackface() || hasReflection() || style().specifiesColumns()
</ins><span class="cx">             || !style().hasAutoZIndex();
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderBoxModelObjecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderBoxModelObject.h (177199 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderBoxModelObject.h        2014-12-12 01:48:45 UTC (rev 177199)
+++ trunk/Source/WebCore/rendering/RenderBoxModelObject.h        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -142,7 +142,7 @@
</span><span class="cx"> 
</span><span class="cx">     virtual void updateFromStyle() override;
</span><span class="cx"> 
</span><del>-    virtual bool requiresLayer() const override { return isRoot() || isPositioned() || createsGroup() || hasClipPath() || hasTransform() || hasHiddenBackface() || hasReflection(); }
</del><ins>+    virtual bool requiresLayer() const override { return isRoot() || isPositioned() || createsGroup() || hasClipPath() || hasTransformRelatedProperty() || hasHiddenBackface() || hasReflection(); }
</ins><span class="cx"> 
</span><span class="cx">     // This will work on inlines to return the bounding box of all of the lines' border boxes.
</span><span class="cx">     virtual IntRect borderBoundingBox() const = 0;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderElement.cpp (177199 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderElement.cpp        2014-12-12 01:48:45 UTC (rev 177199)
+++ trunk/Source/WebCore/rendering/RenderElement.cpp        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -858,7 +858,7 @@
</span><span class="cx">         setHorizontalWritingMode(true);
</span><span class="cx">         setHasBoxDecorations(false);
</span><span class="cx">         setHasOverflowClip(false);
</span><del>-        setHasTransform(false);
</del><ins>+        setHasTransformRelatedProperty(false);
</ins><span class="cx">         setHasReflection(false);
</span><span class="cx">     } else {
</span><span class="cx">         s_affectsParentBlock = false;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderGeometryMapcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderGeometryMap.cpp (177199 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderGeometryMap.cpp        2014-12-12 01:48:45 UTC (rev 177199)
+++ trunk/Source/WebCore/rendering/RenderGeometryMap.cpp        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -155,15 +155,18 @@
</span><span class="cx">     ASSERT(m_mapping.isEmpty() || m_mapping[0].m_renderer-&gt;isRenderView());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static bool canMapBetweenRenderers(const RenderLayerModelObject&amp; renderer, const RenderLayerModelObject&amp; ancestor)
</del><ins>+static bool canMapBetweenRenderersViaLayers(const RenderLayerModelObject&amp; renderer, const RenderLayerModelObject&amp; ancestor)
</ins><span class="cx"> {
</span><span class="cx">     for (const RenderElement* current = &amp;renderer; ; current = current-&gt;parent()) {
</span><span class="cx">         const RenderStyle&amp; style = current-&gt;style();
</span><span class="cx">         if (style.position() == FixedPosition || style.isFlippedBlocksWritingMode())
</span><span class="cx">             return false;
</span><span class="cx"> 
</span><del>-        if (current-&gt;hasTransform() || current-&gt;isRenderFlowThread())
</del><ins>+        if (current-&gt;hasTransformRelatedProperty() &amp;&amp; (current-&gt;style().hasTransform() || current-&gt;style().hasPerspective()))
</ins><span class="cx">             return false;
</span><ins>+        
+        if (current-&gt;isRenderFlowThread())
+            return false;
</ins><span class="cx"> 
</span><span class="cx">         if (current-&gt;isSVGRoot())
</span><span class="cx">             return false;
</span><span class="lines">@@ -181,7 +184,7 @@
</span><span class="cx"> 
</span><span class="cx">     // We have to visit all the renderers to detect flipped blocks. This might defeat the gains
</span><span class="cx">     // from mapping via layers.
</span><del>-    bool canConvertInLayerTree = ancestorLayer ? canMapBetweenRenderers(layer-&gt;renderer(), ancestorLayer-&gt;renderer()) : false;
</del><ins>+    bool canConvertInLayerTree = ancestorLayer ? canMapBetweenRenderersViaLayers(layer-&gt;renderer(), ancestorLayer-&gt;renderer()) : false;
</ins><span class="cx"> 
</span><span class="cx">     if (canConvertInLayerTree) {
</span><span class="cx">         LayoutSize layerOffset = layer-&gt;offsetFromAncestor(ancestorLayer);
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderInlinecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderInline.cpp (177199 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderInline.cpp        2014-12-12 01:48:45 UTC (rev 177199)
+++ trunk/Source/WebCore/rendering/RenderInline.cpp        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -124,7 +124,7 @@
</span><span class="cx">     RenderBoxModelObject::updateFromStyle();
</span><span class="cx"> 
</span><span class="cx">     // FIXME: Support transforms and reflections on inline flows someday.
</span><del>-    setHasTransform(false);
</del><ins>+    setHasTransformRelatedProperty(false);
</ins><span class="cx">     setHasReflection(false);    
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (177199 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayer.cpp        2014-12-12 01:48:45 UTC (rev 177199)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -77,6 +77,7 @@
</span><span class="cx"> #include &quot;HitTestRequest.h&quot;
</span><span class="cx"> #include &quot;HitTestResult.h&quot;
</span><span class="cx"> #include &quot;InspectorInstrumentation.h&quot;
</span><ins>+#include &quot;LogicalSelectionOffsetCaches.h&quot;
</ins><span class="cx"> #include &quot;OverflowEvent.h&quot;
</span><span class="cx"> #include &quot;OverlapTestRequestClient.h&quot;
</span><span class="cx"> #include &quot;Page.h&quot;
</span><span class="lines">@@ -830,9 +831,7 @@
</span><span class="cx"> 
</span><span class="cx"> void RenderLayer::updateTransform()
</span><span class="cx"> {
</span><del>-    // hasTransform() on the renderer is also true when there is transform-style: preserve-3d or perspective set,
-    // so check style too.
-    bool hasTransform = renderer().hasTransform() &amp;&amp; renderer().style().hasTransform();
</del><ins>+    bool hasTransform = renderer().hasTransform();
</ins><span class="cx">     bool had3DTransform = has3DTransform();
</span><span class="cx"> 
</span><span class="cx">     bool hadTransform = !!m_transform;
</span><span class="lines">@@ -1210,10 +1209,10 @@
</span><span class="cx">         localPoint += box-&gt;topLeftLocationOffset();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!renderer().isOutOfFlowPositioned() &amp;&amp; renderer().parent()) {
</del><ins>+    RenderElement* ancestor;
+    if (!renderer().isOutOfFlowPositioned() &amp;&amp; (ancestor = renderer().parent())) {
</ins><span class="cx">         // We must adjust our position by walking up the render tree looking for the
</span><span class="cx">         // nearest enclosing object with a layer.
</span><del>-        RenderElement* ancestor = renderer().parent();
</del><span class="cx">         while (ancestor &amp;&amp; !ancestor-&gt;hasLayer()) {
</span><span class="cx">             if (is&lt;RenderBox&gt;(*ancestor) &amp;&amp; !is&lt;RenderTableRow&gt;(*ancestor)) {
</span><span class="cx">                 // Rows and cells share the same coordinate space (that of the section).
</span><span class="lines">@@ -1229,9 +1228,8 @@
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     // Subtract our parent's scroll offset.
</span><del>-    if (renderer().isOutOfFlowPositioned() &amp;&amp; enclosingPositionedAncestor()) {
-        RenderLayer* positionedParent = enclosingPositionedAncestor();
-
</del><ins>+    RenderLayer* positionedParent;
+    if (renderer().isOutOfFlowPositioned() &amp;&amp; (positionedParent = enclosingAncestorForPosition(renderer().style().position()))) {
</ins><span class="cx">         // For positioned layers, we subtract out the enclosing positioned layer's scroll offset.
</span><span class="cx">         if (positionedParent-&gt;renderer().hasOverflowClip()) {
</span><span class="cx">             LayoutSize offset = positionedParent-&gt;scrolledContentOffset();
</span><span class="lines">@@ -1269,7 +1267,7 @@
</span><span class="cx"> 
</span><span class="cx"> TransformationMatrix RenderLayer::perspectiveTransform() const
</span><span class="cx"> {
</span><del>-    if (!renderer().hasTransform())
</del><ins>+    if (!renderer().hasTransformRelatedProperty())
</ins><span class="cx">         return TransformationMatrix();
</span><span class="cx"> 
</span><span class="cx">     const RenderStyle&amp; style = renderer().style();
</span><span class="lines">@@ -1299,7 +1297,7 @@
</span><span class="cx"> 
</span><span class="cx"> FloatPoint RenderLayer::perspectiveOrigin() const
</span><span class="cx"> {
</span><del>-    if (!renderer().hasTransform())
</del><ins>+    if (!renderer().hasTransformRelatedProperty())
</ins><span class="cx">         return FloatPoint();
</span><span class="cx"> 
</span><span class="cx">     const LayoutRect borderBox = downcast&lt;RenderBox&gt;(renderer()).borderBoxRect();
</span><span class="lines">@@ -1319,20 +1317,25 @@
</span><span class="cx">     return layer;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static inline bool isPositionedContainer(RenderLayer* layer)
</del><ins>+static inline bool isContainerForPositioned(RenderLayer&amp; layer, EPosition position)
</ins><span class="cx"> {
</span><del>-    return layer-&gt;isRootLayer() || layer-&gt;renderer().isPositioned() || layer-&gt;hasTransform();
-}
</del><ins>+    switch (position) {
+    case FixedPosition:
+        return layer.renderer().canContainFixedPositionObjects();
</ins><span class="cx"> 
</span><del>-static inline bool isFixedPositionedContainer(RenderLayer* layer)
-{
-    return layer-&gt;isRootLayer() || layer-&gt;hasTransform();
</del><ins>+    case AbsolutePosition:
+        return isContainingBlockCandidateForAbsolutelyPositionedObject(layer.renderer());
+    
+    default:
+        ASSERT_NOT_REACHED();
+        return false;
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-RenderLayer* RenderLayer::enclosingPositionedAncestor() const
</del><ins>+RenderLayer* RenderLayer::enclosingAncestorForPosition(EPosition position) const
</ins><span class="cx"> {
</span><span class="cx">     RenderLayer* curr = parent();
</span><del>-    while (curr &amp;&amp; !isPositionedContainer(curr))
</del><ins>+    while (curr &amp;&amp; !isContainerForPositioned(*curr, position))
</ins><span class="cx">         curr = curr-&gt;parent();
</span><span class="cx"> 
</span><span class="cx">     return curr;
</span><span class="lines">@@ -1911,7 +1914,7 @@
</span><span class="cx">             if (currLayer == ancestorLayer)
</span><span class="cx">                 foundAncestor = true;
</span><span class="cx"> 
</span><del>-            if (isFixedPositionedContainer(currLayer)) {
</del><ins>+            if (isContainerForPositioned(*currLayer, FixedPosition)) {
</ins><span class="cx">                 fixedPositionContainerLayer = currLayer;
</span><span class="cx">                 ASSERT_UNUSED(foundAncestor, foundAncestor);
</span><span class="cx">                 break;
</span><span class="lines">@@ -1948,14 +1951,14 @@
</span><span class="cx"> 
</span><span class="cx">     RenderLayer* parentLayer;
</span><span class="cx">     if (position == AbsolutePosition || position == FixedPosition) {
</span><del>-        // Do what enclosingPositionedAncestor() does, but check for ancestorLayer along the way.
</del><ins>+        // Do what enclosingAncestorForPosition() does, but check for ancestorLayer along the way.
</ins><span class="cx">         parentLayer = layer-&gt;parent();
</span><span class="cx">         bool foundAncestorFirst = false;
</span><span class="cx">         while (parentLayer) {
</span><span class="cx">             // RenderFlowThread is a positioned container, child of RenderView, positioned at (0,0).
</span><span class="cx">             // This implies that, for out-of-flow positioned elements inside a RenderFlowThread,
</span><span class="cx">             // we are bailing out before reaching root layer.
</span><del>-            if (isPositionedContainer(parentLayer))
</del><ins>+            if (isContainerForPositioned(*parentLayer, position))
</ins><span class="cx">                 break;
</span><span class="cx"> 
</span><span class="cx">             if (parentLayer == ancestorLayer) {
</span><span class="lines">@@ -1973,8 +1976,8 @@
</span><span class="cx"> 
</span><span class="cx">         if (foundAncestorFirst) {
</span><span class="cx">             // Found ancestorLayer before the abs. positioned container, so compute offset of both relative
</span><del>-            // to enclosingPositionedAncestor and subtract.
-            RenderLayer* positionedAncestor = parentLayer-&gt;enclosingPositionedAncestor();
</del><ins>+            // to enclosingAncestorForPosition and subtract.
+            RenderLayer* positionedAncestor = parentLayer-&gt;enclosingAncestorForPosition(position);
</ins><span class="cx">             LayoutSize thisCoords = layer-&gt;offsetFromAncestor(positionedAncestor);
</span><span class="cx">             LayoutSize ancestorCoords = ancestorLayer-&gt;offsetFromAncestor(positionedAncestor);
</span><span class="cx">             location += (thisCoords - ancestorCoords);
</span><span class="lines">@@ -4718,7 +4721,7 @@
</span><span class="cx">     }
</span><span class="cx">     offset += translationOffset;
</span><span class="cx"> 
</span><del>-    RenderObject* containerRenderer = containerLayer ? &amp;containerLayer-&gt;renderer() : 0;
</del><ins>+    RenderObject* containerRenderer = containerLayer ? &amp;containerLayer-&gt;renderer() : nullptr;
</ins><span class="cx">     if (renderer().shouldUseTransformFromContainer(containerRenderer)) {
</span><span class="cx">         TransformationMatrix containerTransform;
</span><span class="cx">         renderer().getTransformFromContainer(containerRenderer, offset, containerTransform);
</span><span class="lines">@@ -6215,7 +6218,7 @@
</span><span class="cx">         || (renderer().style().specifiesColumns() &amp;&amp; !isRootLayer())
</span><span class="cx">         || renderer().isInFlowRenderFlowThread())
</span><span class="cx">         &amp;&amp; !renderer().isPositioned()
</span><del>-        &amp;&amp; !renderer().hasTransform()
</del><ins>+        &amp;&amp; !renderer().hasTransformRelatedProperty()
</ins><span class="cx">         &amp;&amp; !renderer().hasClipPath()
</span><span class="cx">         &amp;&amp; !renderer().hasFilter()
</span><span class="cx">         &amp;&amp; !renderer().hasBackdropFilter()
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayer.h (177199 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayer.h        2014-12-12 01:48:45 UTC (rev 177199)
+++ trunk/Source/WebCore/rendering/RenderLayer.h        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -619,7 +619,7 @@
</span><span class="cx"> 
</span><span class="cx">     // Gets the nearest enclosing positioned ancestor layer (also includes
</span><span class="cx">     // the &lt;html&gt; layer and the root layer).
</span><del>-    RenderLayer* enclosingPositionedAncestor() const;
</del><ins>+    RenderLayer* enclosingAncestorForPosition(EPosition) const;
</ins><span class="cx"> 
</span><span class="cx">     // Returns the nearest enclosing layer that is scrollable.
</span><span class="cx">     RenderLayer* enclosingScrollableLayer() const;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerBackingcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayerBacking.cpp (177199 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayerBacking.cpp        2014-12-12 01:48:45 UTC (rev 177199)
+++ trunk/Source/WebCore/rendering/RenderLayerBacking.cpp        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -822,7 +822,7 @@
</span><span class="cx">         m_maskLayer-&gt;setOffsetFromRenderer(m_graphicsLayer-&gt;offsetFromRenderer());
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    if (m_owningLayer.hasTransform()) {
</del><ins>+    if (m_owningLayer.renderer().hasTransformRelatedProperty()) {
</ins><span class="cx">         // Update properties that depend on layer dimensions.
</span><span class="cx">         FloatPoint3D transformOrigin = computeTransformOriginForPainting(downcast&lt;RenderBox&gt;(renderer()).borderBoxRect());
</span><span class="cx">         // Get layout bounds in the coords of compAncestor to match relativeCompositingBounds.
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerCompositorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (177199 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp        2014-12-12 01:48:45 UTC (rev 177199)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -2261,7 +2261,7 @@
</span><span class="cx">         reasons |= CompositingReasonNegativeZIndexChildren;
</span><span class="cx">         break;
</span><span class="cx">     case RenderLayer::IndirectCompositingReason::GraphicalEffect:
</span><del>-        if (renderer-&gt;layer()-&gt;transform())
</del><ins>+        if (renderer-&gt;hasTransform())
</ins><span class="cx">             reasons |= CompositingReasonTransformWithCompositedDescendants;
</span><span class="cx"> 
</span><span class="cx">         if (renderer-&gt;isTransparent())
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerModelObjectcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayerModelObject.cpp (177199 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayerModelObject.cpp        2014-12-12 01:48:45 UTC (rev 177199)
+++ trunk/Source/WebCore/rendering/RenderLayerModelObject.cpp        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -147,7 +147,7 @@
</span><span class="cx">         if (oldStyle-&gt;hasBlendMode())
</span><span class="cx">             layer()-&gt;parent()-&gt;dirtyAncestorChainHasBlendingDescendants();
</span><span class="cx"> #endif
</span><del>-        setHasTransform(false); // Either a transform wasn't specified or the object doesn't support transforms, so just null out the bit.
</del><ins>+        setHasTransformRelatedProperty(false); // All transform-related propeties force layers, so we know we don't have one or the object doesn't support them.
</ins><span class="cx">         setHasReflection(false);
</span><span class="cx">         layer()-&gt;removeOnlyThisLayer(); // calls destroyLayer() which clears m_layer
</span><span class="cx">         if (s_wasFloating &amp;&amp; isFloating())
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderObjectcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderObject.cpp (177199 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderObject.cpp        2014-12-12 01:48:45 UTC (rev 177199)
+++ trunk/Source/WebCore/rendering/RenderObject.cpp        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -1648,9 +1648,7 @@
</span><span class="cx"> bool RenderObject::shouldUseTransformFromContainer(const RenderObject* containerObject) const
</span><span class="cx"> {
</span><span class="cx"> #if ENABLE(3D_RENDERING)
</span><del>-    // hasTransform() indicates whether the object has transform, transform-style or perspective. We just care about transform,
-    // so check the layer's transform directly.
-    return (hasLayer() &amp;&amp; downcast&lt;RenderLayerModelObject&gt;(*this).layer()-&gt;transform()) || (containerObject &amp;&amp; containerObject-&gt;style().hasPerspective());
</del><ins>+    return hasTransform() || (containerObject &amp;&amp; containerObject-&gt;style().hasPerspective());
</ins><span class="cx"> #else
</span><span class="cx">     UNUSED_PARAM(containerObject);
</span><span class="cx">     return hasTransform();
</span><span class="lines">@@ -1811,6 +1809,7 @@
</span><span class="cx">         // we'll just return 0).
</span><span class="cx">         // FIXME: The definition of view() has changed to not crawl up the render tree.  It might
</span><span class="cx">         // be safe now to use it.
</span><ins>+        // FIXME: share code with containingBlockForFixedPosition().
</ins><span class="cx">         while (o &amp;&amp; o-&gt;parent() &amp;&amp; !(o-&gt;hasTransform() &amp;&amp; o-&gt;isRenderBlock())) {
</span><span class="cx">             // foreignObject is the containing block for its contents.
</span><span class="cx">             if (o-&gt;isSVGForeignObject())
</span><span class="lines">@@ -1830,7 +1829,9 @@
</span><span class="cx">         // Same goes here.  We technically just want our containing block, but
</span><span class="cx">         // we may not have one if we're part of an uninstalled subtree.  We'll
</span><span class="cx">         // climb as high as we can though.
</span><del>-        while (o &amp;&amp; o-&gt;style().position() == StaticPosition &amp;&amp; !o-&gt;isRenderView() &amp;&amp; !(o-&gt;hasTransform() &amp;&amp; o-&gt;isRenderBlock())) {
</del><ins>+        // FIXME: share code with isContainingBlockCandidateForAbsolutelyPositionedObject().
+        // FIXME: hasTransformRelatedProperty() includes preserves3D() check, but this may need to change: https://www.w3.org/Bugs/Public/show_bug.cgi?id=27566
+        while (o &amp;&amp; o-&gt;style().position() == StaticPosition &amp;&amp; !o-&gt;isRenderView() &amp;&amp; !(o-&gt;hasTransformRelatedProperty() &amp;&amp; o-&gt;isRenderBlock())) {
</ins><span class="cx">             if (o-&gt;isSVGForeignObject()) // foreignObject is the containing block for contents inside it
</span><span class="cx">                 break;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderObjecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderObject.h (177199 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderObject.h        2014-12-12 01:48:45 UTC (rev 177199)
+++ trunk/Source/WebCore/rendering/RenderObject.h        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -550,7 +550,8 @@
</span><span class="cx"> 
</span><span class="cx">     bool hasOverflowClip() const { return m_bitfields.hasOverflowClip(); }
</span><span class="cx"> 
</span><del>-    bool hasTransform() const { return m_bitfields.hasTransform(); }
</del><ins>+    bool hasTransformRelatedProperty() const { return m_bitfields.hasTransformRelatedProperty(); } // Transform, perspective or transform-style: preserve-3d.
+    bool hasTransform() const { return hasTransformRelatedProperty() &amp;&amp; style().hasTransform(); }
</ins><span class="cx"> 
</span><span class="cx">     inline bool preservesNewline() const;
</span><span class="cx"> 
</span><span class="lines">@@ -616,7 +617,7 @@
</span><span class="cx">     void setHorizontalWritingMode(bool b = true) { m_bitfields.setHorizontalWritingMode(b); }
</span><span class="cx">     void setHasOverflowClip(bool b = true) { m_bitfields.setHasOverflowClip(b); }
</span><span class="cx">     void setHasLayer(bool b = true) { m_bitfields.setHasLayer(b); }
</span><del>-    void setHasTransform(bool b = true) { m_bitfields.setHasTransform(b); }
</del><ins>+    void setHasTransformRelatedProperty(bool b = true) { m_bitfields.setHasTransformRelatedProperty(b); }
</ins><span class="cx">     void setHasReflection(bool b = true) { m_bitfields.setHasReflection(b); }
</span><span class="cx"> 
</span><span class="cx">     // Hook so that RenderTextControl can return the line height of its inner renderer.
</span><span class="lines">@@ -927,7 +928,7 @@
</span><span class="cx">             , m_isDragging(false)
</span><span class="cx">             , m_hasLayer(false)
</span><span class="cx">             , m_hasOverflowClip(false)
</span><del>-            , m_hasTransform(false)
</del><ins>+            , m_hasTransformRelatedProperty(false)
</ins><span class="cx">             , m_hasReflection(false)
</span><span class="cx">             , m_everHadLayout(false)
</span><span class="cx">             , m_childrenInline(false)
</span><span class="lines">@@ -958,7 +959,7 @@
</span><span class="cx"> 
</span><span class="cx">         ADD_BOOLEAN_BITFIELD(hasLayer, HasLayer);
</span><span class="cx">         ADD_BOOLEAN_BITFIELD(hasOverflowClip, HasOverflowClip); // Set in the case of overflow:auto/scroll/hidden
</span><del>-        ADD_BOOLEAN_BITFIELD(hasTransform, HasTransform);
</del><ins>+        ADD_BOOLEAN_BITFIELD(hasTransformRelatedProperty, HasTransformRelatedProperty);
</ins><span class="cx">         ADD_BOOLEAN_BITFIELD(hasReflection, HasReflection);
</span><span class="cx"> 
</span><span class="cx">         ADD_BOOLEAN_BITFIELD(everHadLayout, EverHadLayout);
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderRegioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderRegion.cpp (177199 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderRegion.cpp        2014-12-12 01:48:45 UTC (rev 177199)
+++ trunk/Source/WebCore/rendering/RenderRegion.cpp        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -544,7 +544,7 @@
</span><span class="cx">     if (!box-&gt;hasOverflowClip())
</span><span class="cx">         rect.unite(layoutOverflowRectForBox(box));
</span><span class="cx"> 
</span><del>-    bool hasTransform = box-&gt;hasLayer() &amp;&amp; box-&gt;layer()-&gt;transform();
</del><ins>+    bool hasTransform = box-&gt;hasTransform();
</ins><span class="cx">     if (box-&gt;isInFlowPositioned() || hasTransform) {
</span><span class="cx">         if (hasTransform)
</span><span class="cx">             rect = box-&gt;layer()-&gt;currentTransform().mapRect(rect);
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderTableRowh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderTableRow.h (177199 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderTableRow.h        2014-12-12 01:48:45 UTC (rev 177199)
+++ trunk/Source/WebCore/rendering/RenderTableRow.h        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -103,7 +103,7 @@
</span><span class="cx">     virtual void layout() override;
</span><span class="cx">     virtual LayoutRect clippedOverflowRectForRepaint(const RenderLayerModelObject* repaintContainer) const override;
</span><span class="cx"> 
</span><del>-    virtual bool requiresLayer() const override { return hasOverflowClip() || hasTransform() || hasHiddenBackface() || hasClipPath() || createsGroup() || isStickyPositioned(); }
</del><ins>+    virtual bool requiresLayer() const override { return hasOverflowClip() || hasTransformRelatedProperty() || hasHiddenBackface() || hasClipPath() || createsGroup() || isStickyPositioned(); }
</ins><span class="cx"> 
</span><span class="cx">     virtual void paint(PaintInfo&amp;, const LayoutPoint&amp;) override;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderViewcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderView.cpp (177199 => 177200)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderView.cpp        2014-12-12 01:48:45 UTC (rev 177199)
+++ trunk/Source/WebCore/rendering/RenderView.cpp        2014-12-12 01:59:37 UTC (rev 177200)
</span><span class="lines">@@ -420,9 +420,9 @@
</span><span class="cx">     ASSERT_ARG(repaintContainer, !repaintContainer || repaintContainer == this);
</span><span class="cx">     ASSERT_UNUSED(wasFixed, !wasFixed || *wasFixed == (mode &amp; IsFixed));
</span><span class="cx"> 
</span><del>-    if (!repaintContainer &amp;&amp; mode &amp; UseTransforms &amp;&amp; shouldUseTransformFromContainer(0)) {
</del><ins>+    if (!repaintContainer &amp;&amp; mode &amp; UseTransforms &amp;&amp; shouldUseTransformFromContainer(nullptr)) {
</ins><span class="cx">         TransformationMatrix t;
</span><del>-        getTransformFromContainer(0, LayoutSize(), t);
</del><ins>+        getTransformFromContainer(nullptr, LayoutSize(), t);
</ins><span class="cx">         transformState.applyTransform(t);
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="lines">@@ -446,9 +446,9 @@
</span><span class="cx">     LayoutSize scrollOffset = frameView().scrollOffsetForFixedPosition();
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    if (!ancestorToStopAt &amp;&amp; shouldUseTransformFromContainer(0)) {
</del><ins>+    if (!ancestorToStopAt &amp;&amp; shouldUseTransformFromContainer(nullptr)) {
</ins><span class="cx">         TransformationMatrix t;
</span><del>-        getTransformFromContainer(0, LayoutSize(), t);
</del><ins>+        getTransformFromContainer(nullptr, LayoutSize(), t);
</ins><span class="cx">         geometryMap.pushView(this, scrollOffset, &amp;t);
</span><span class="cx">     } else
</span><span class="cx">         geometryMap.pushView(this, scrollOffset);
</span><span class="lines">@@ -465,9 +465,9 @@
</span><span class="cx">         transformState.move(frameView().scrollOffsetForFixedPosition());
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    if (mode &amp; UseTransforms &amp;&amp; shouldUseTransformFromContainer(0)) {
</del><ins>+    if (mode &amp; UseTransforms &amp;&amp; shouldUseTransformFromContainer(nullptr)) {
</ins><span class="cx">         TransformationMatrix t;
</span><del>-        getTransformFromContainer(0, LayoutSize(), t);
</del><ins>+        getTransformFromContainer(nullptr, LayoutSize(), t);
</ins><span class="cx">         transformState.applyTransform(t);
</span><span class="cx">     }
</span><span class="cx"> }
</span></span></pre>
</div>
</div>

</body>
</html>