<!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 "has transform, or preserve-3d, or perspective".
This patch teases those behaviors apart to produce the following behavior:
1. "transform" acts as containing block for fixed position (no behavior change).
2. "transform" acts as containing block for absolute/relative position (no behavior change).
3. "perspective" does not act as containing block for fixed position (no behavior change).
4. "perspective" acts as containing block for absolute/relative position (no behavior change).
5. "preserve-3d" does not act as containing block for fixed position (behavior change).
6. "preserve-3d" 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 <simon.fraser@apple.com>
+
+ 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 <roger_fong@apple.com>
</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>+<!DOCTYPE html>
+
+<html>
+<head>
+ <style>
+ body {
+ margin: 0;
+ height: 1000px;
+ }
+
+ body > div {
+ outline: 1px solid black;
+ }
+
+ .box {
+ width: 100px;
+ height: 100px;
+ }
+
+ .fixed {
+ position: fixed;
+ top: 100px;
+ background-color: green;
+ }
+
+ .transformed {
+ -webkit-transform: translateZ(1px);
+ }
+ </style>
+ <script>
+ // Scroll on load to test fixed positioning.
+ window.addEventListener('load', function() {
+ window.scrollTo(0, 100);
+ }, false)
+ </script>
+</head>
+<body>
+
+ <div class="box" style="margin: 150px 50px;">
+ <div class="fixed box">
+ <div class="transformed box"></div> <!-- Necessary to activate preserve3d compositing -->
+ </div>
+ </div>
+
+ <div class="fixed box" style="left: 250px;">
+ <div class="transformed box"></div> <!-- Necessary to activate preserve3d compositing -->
+ </div>
+</body>
+</html>
</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>+<!DOCTYPE html>
+
+<html>
+<head>
+ <style>
+ body {
+ margin: 0;
+ height: 1000px;
+ }
+
+ body > 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);
+ }
+ </style>
+ <script>
+ // Scroll on load to test fixed positioning.
+ window.addEventListener('load', function() {
+ window.scrollTo(0, 100);
+ }, false)
+ </script>
+</head>
+<body>
+
+ <div class="perspective box" style="margin: 150px 50px;">
+ <div class="fixed box">
+ <div class="transformed box"></div> <!-- Necessary to activate preserve3d compositing -->
+ </div>
+ </div>
+
+ <div class="perspective fixed box" style="left: 250px;">
+ <div class="transformed box"></div> <!-- Necessary to activate preserve3d compositing -->
+ </div>
+</body>
+</html>
</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>+<!DOCTYPE html>
+
+<html>
+<head>
+ <style>
+ body {
+ margin: 0;
+ height: 1000px;
+ }
+
+ body > div {
+ outline: 1px solid black;
+ }
+
+ .box {
+ width: 100px;
+ height: 100px;
+ }
+
+ .fixed {
+ position: fixed;
+ top: 100px;
+ background-color: green;
+ }
+
+ .transformed {
+ -webkit-transform: translateZ(1px);
+ }
+ </style>
+ <script>
+ // Scroll on load to test fixed positioning.
+ window.addEventListener('load', function() {
+ window.scrollTo(0, 100);
+ }, false)
+ </script>
+</head>
+<body>
+
+ <div class="box" style="margin: 150px 50px;">
+ <div class="fixed box">
+ <div class="transformed box"></div> <!-- Necessary to activate preserve3d compositing -->
+ </div>
+ </div>
+
+ <div class="fixed box" style="left: 250px;">
+ <div class="transformed box"></div> <!-- Necessary to activate preserve3d compositing -->
+ </div>
+</body>
+</html>
</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>+<!DOCTYPE html>
+
+<html>
+<head>
+ <style>
+ body {
+ margin: 0;
+ height: 1000px;
+ }
+
+ body > 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);
+ }
+ </style>
+ <script>
+ // Scroll on load to test fixed positioning.
+ window.addEventListener('load', function() {
+ window.scrollTo(0, 100);
+ }, false)
+ </script>
+</head>
+<body>
+
+ <div class="preserve3d box" style="margin: 150px 50px;">
+ <div class="fixed box">
+ <div class="transformed box"></div> <!-- Necessary to activate preserve3d compositing -->
+ </div>
+ </div>
+
+ <div class="preserve3d fixed box" style="left: 250px;">
+ <div class="transformed box"></div> <!-- Necessary to activate preserve3d compositing -->
+ </div>
+</body>
+</html>
</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>+<!DOCTYPE html>
+
+<html>
+<head>
+ <style>
+ .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;
+ }
+ </style>
+</head>
+<body>
+<div class="container">
+ <div class="box"></div>
+</div>
+</body>
+</html>
</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>+<!DOCTYPE html>
+
+<html>
+<head>
+ <style>
+ .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;
+ }
+ </style>
+</head>
+<body>
+<div class="container">
+ <div class="box"></div>
+</div>
+</body>
+</html>
</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>+<!DOCTYPE html>
+
+<html>
+<head>
+ <style>
+ .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;
+ }
+ </style>
+</head>
+<body>
+<div class="container">
+ <div class="box"></div>
+</div>
+</body>
+</html>
</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>+<!DOCTYPE html>
+
+<html>
+<head>
+ <style>
+ .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;
+ }
+ </style>
+</head>
+<body>
+<div class="container">
+ <div class="box"></div>
+</div>
+</body>
+</html>
</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>+<!DOCTYPE html>
+
+<html>
+<head>
+ <style>
+ .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;
+ }
+ </style>
+</head>
+<body>
+<div class="container">
+ <div class="box"></div>
+</div>
+</body>
+</html>
</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>+<!DOCTYPE html>
+
+<html>
+<head>
+ <style>
+ .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;
+ }
+ </style>
+</head>
+<body>
+<div class="container">
+ <div class="box"></div>
+</div>
+</body>
+</html>
</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 <simon.fraser@apple.com>
+
+ 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 "has transform, or preserve-3d, or perspective".
+
+ This patch teases those behaviors apart to produce the following behavior:
+
+ 1. "transform" acts as containing block for fixed position (no behavior change).
+ 2. "transform" acts as containing block for absolute/relative position (no behavior change).
+ 3. "perspective" does not act as containing block for fixed position (no behavior change).
+ 4. "perspective" acts as containing block for absolute/relative position (no behavior change).
+ 5. "preserve-3d" does not act as containing block for fixed position (behavior change).
+ 6. "preserve-3d" 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 <rich.tibbett@gmail.com>
</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<CSSValue> computedTransform(RenderObject* renderer, const RenderStyle* style)
</span><span class="cx"> {
</span><del>- if (!renderer || !renderer->hasTransform() || !style->hasTransform())
</del><ins>+ if (!renderer || !renderer->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& 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() && object.isRenderBlock())
</del><ins>+ || (object.isRenderBlock() && 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() && !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() && layer()->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 && !isFixedPos)
</del><ins>+ if (hasTransform() && !isFixedPos)
</ins><span class="cx"> mode &= ~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() && layer()->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& transformState) const
</span><span class="cx"> {
</span><span class="cx"> bool isFixedPos = style().position() == FixedPosition;
</span><del>- bool hasTransform = hasLayer() && layer()->transform();
- if (hasTransform && !isFixedPos) {
</del><ins>+ if (hasTransform() && !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 &= ~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() && layer()->transform();
</del><ins>+ bool hasTransform = this->hasTransform();
</ins><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx"> if (isInFlowPositioned() || (hasTransform && document().settings()->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->isRenderView());
</span><span class="cx"> }
</span><span class="cx">
</span><del>-static bool canMapBetweenRenderers(const RenderLayerModelObject& renderer, const RenderLayerModelObject& ancestor)
</del><ins>+static bool canMapBetweenRenderersViaLayers(const RenderLayerModelObject& renderer, const RenderLayerModelObject& ancestor)
</ins><span class="cx"> {
</span><span class="cx"> for (const RenderElement* current = &renderer; ; current = current->parent()) {
</span><span class="cx"> const RenderStyle& style = current->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->hasTransform() || current->isRenderFlowThread())
</del><ins>+ if (current->hasTransformRelatedProperty() && (current->style().hasTransform() || current->style().hasPerspective()))
</ins><span class="cx"> return false;
</span><ins>+
+ if (current->isRenderFlowThread())
+ return false;
</ins><span class="cx">
</span><span class="cx"> if (current->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->renderer(), ancestorLayer->renderer()) : false;
</del><ins>+ bool canConvertInLayerTree = ancestorLayer ? canMapBetweenRenderersViaLayers(layer->renderer(), ancestorLayer->renderer()) : false;
</ins><span class="cx">
</span><span class="cx"> if (canConvertInLayerTree) {
</span><span class="cx"> LayoutSize layerOffset = layer->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 "HitTestRequest.h"
</span><span class="cx"> #include "HitTestResult.h"
</span><span class="cx"> #include "InspectorInstrumentation.h"
</span><ins>+#include "LogicalSelectionOffsetCaches.h"
</ins><span class="cx"> #include "OverflowEvent.h"
</span><span class="cx"> #include "OverlapTestRequestClient.h"
</span><span class="cx"> #include "Page.h"
</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() && 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->topLeftLocationOffset();
</span><span class="cx"> }
</span><span class="cx">
</span><del>- if (!renderer().isOutOfFlowPositioned() && renderer().parent()) {
</del><ins>+ RenderElement* ancestor;
+ if (!renderer().isOutOfFlowPositioned() && (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 && !ancestor->hasLayer()) {
</span><span class="cx"> if (is<RenderBox>(*ancestor) && !is<RenderTableRow>(*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() && enclosingPositionedAncestor()) {
- RenderLayer* positionedParent = enclosingPositionedAncestor();
-
</del><ins>+ RenderLayer* positionedParent;
+ if (renderer().isOutOfFlowPositioned() && (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->renderer().hasOverflowClip()) {
</span><span class="cx"> LayoutSize offset = positionedParent->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& 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<RenderBox>(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& layer, EPosition position)
</ins><span class="cx"> {
</span><del>- return layer->isRootLayer() || layer->renderer().isPositioned() || layer->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->isRootLayer() || layer->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 && !isPositionedContainer(curr))
</del><ins>+ while (curr && !isContainerForPositioned(*curr, position))
</ins><span class="cx"> curr = curr->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->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->enclosingPositionedAncestor();
</del><ins>+ // to enclosingAncestorForPosition and subtract.
+ RenderLayer* positionedAncestor = parentLayer->enclosingAncestorForPosition(position);
</ins><span class="cx"> LayoutSize thisCoords = layer->offsetFromAncestor(positionedAncestor);
</span><span class="cx"> LayoutSize ancestorCoords = ancestorLayer->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 ? &containerLayer->renderer() : 0;
</del><ins>+ RenderObject* containerRenderer = containerLayer ? &containerLayer->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() && !isRootLayer())
</span><span class="cx"> || renderer().isInFlowRenderFlowThread())
</span><span class="cx"> && !renderer().isPositioned()
</span><del>- && !renderer().hasTransform()
</del><ins>+ && !renderer().hasTransformRelatedProperty()
</ins><span class="cx"> && !renderer().hasClipPath()
</span><span class="cx"> && !renderer().hasFilter()
</span><span class="cx"> && !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 <html> 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->setOffsetFromRenderer(m_graphicsLayer->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<RenderBox>(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->layer()->transform())
</del><ins>+ if (renderer->hasTransform())
</ins><span class="cx"> reasons |= CompositingReasonTransformWithCompositedDescendants;
</span><span class="cx">
</span><span class="cx"> if (renderer->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->hasBlendMode())
</span><span class="cx"> layer()->parent()->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()->removeOnlyThisLayer(); // calls destroyLayer() which clears m_layer
</span><span class="cx"> if (s_wasFloating && 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() && downcast<RenderLayerModelObject>(*this).layer()->transform()) || (containerObject && containerObject->style().hasPerspective());
</del><ins>+ return hasTransform() || (containerObject && containerObject->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 && o->parent() && !(o->hasTransform() && o->isRenderBlock())) {
</span><span class="cx"> // foreignObject is the containing block for its contents.
</span><span class="cx"> if (o->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 && o->style().position() == StaticPosition && !o->isRenderView() && !(o->hasTransform() && o->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 && o->style().position() == StaticPosition && !o->isRenderView() && !(o->hasTransformRelatedProperty() && o->isRenderBlock())) {
</ins><span class="cx"> if (o->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() && 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->hasOverflowClip())
</span><span class="cx"> rect.unite(layoutOverflowRectForBox(box));
</span><span class="cx">
</span><del>- bool hasTransform = box->hasLayer() && box->layer()->transform();
</del><ins>+ bool hasTransform = box->hasTransform();
</ins><span class="cx"> if (box->isInFlowPositioned() || hasTransform) {
</span><span class="cx"> if (hasTransform)
</span><span class="cx"> rect = box->layer()->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&, const LayoutPoint&) 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 & IsFixed));
</span><span class="cx">
</span><del>- if (!repaintContainer && mode & UseTransforms && shouldUseTransformFromContainer(0)) {
</del><ins>+ if (!repaintContainer && mode & UseTransforms && 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 && shouldUseTransformFromContainer(0)) {
</del><ins>+ if (!ancestorToStopAt && 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, &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 & UseTransforms && shouldUseTransformFromContainer(0)) {
</del><ins>+ if (mode & UseTransforms && 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>