Title: [158934] trunk
- Revision
- 158934
- Author
- [email protected]
- Date
- 2013-11-08 11:38:58 -0800 (Fri, 08 Nov 2013)
Log Message
Left sidebar on cubic-bezier.com flickers
https://bugs.webkit.org/show_bug.cgi?id=123128
Source/WebCore:
Reviewed by Dean Jackson.
The logic that determined whether position:fixed elements outside the viewport
should be composited was incorrect if the fixed element also had a transform.
layer.calculateLayerBounds() only takes into account painted transforms (since they
affect layer bounds). So we need to compute the bounds relative to the layer
itself, then use localToContainerQuad() to map them to document coordinates,
but only to the RenderView so that we don't hit the page scale transform.
Tests: compositing/layer-creation/fixed-position-transformed-into-view.html
compositing/layer-creation/fixed-position-transformed-outside-view.html
* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::requiresCompositingForPosition):
LayoutTests:
Reviewed by Dean Jackson.
Tests with transformed, fixed elements which dump the layer tree to see
which layers get composited.
* compositing/layer-creation/fixed-position-transformed-into-view-expected.txt: Added.
* compositing/layer-creation/fixed-position-transformed-into-view.html: Added.
* compositing/layer-creation/fixed-position-transformed-outside-view-expected.txt: Added.
* compositing/layer-creation/fixed-position-transformed-outside-view.html: Added.
Modified Paths
Added Paths
Diff
Modified: trunk/LayoutTests/ChangeLog (158933 => 158934)
--- trunk/LayoutTests/ChangeLog 2013-11-08 19:37:57 UTC (rev 158933)
+++ trunk/LayoutTests/ChangeLog 2013-11-08 19:38:58 UTC (rev 158934)
@@ -1,3 +1,18 @@
+2013-11-08 Simon Fraser <[email protected]>
+
+ Left sidebar on cubic-bezier.com flickers
+ https://bugs.webkit.org/show_bug.cgi?id=123128
+
+ Reviewed by Dean Jackson.
+
+ Tests with transformed, fixed elements which dump the layer tree to see
+ which layers get composited.
+
+ * compositing/layer-creation/fixed-position-transformed-into-view-expected.txt: Added.
+ * compositing/layer-creation/fixed-position-transformed-into-view.html: Added.
+ * compositing/layer-creation/fixed-position-transformed-outside-view-expected.txt: Added.
+ * compositing/layer-creation/fixed-position-transformed-outside-view.html: Added.
+
2013-11-08 Oliver Hunt <[email protected]>
Fix layout test that was actually testing incorrect behaviour.
Added: trunk/LayoutTests/compositing/layer-creation/fixed-position-transformed-into-view-expected.txt (0 => 158934)
--- trunk/LayoutTests/compositing/layer-creation/fixed-position-transformed-into-view-expected.txt (rev 0)
+++ trunk/LayoutTests/compositing/layer-creation/fixed-position-transformed-into-view-expected.txt 2013-11-08 19:38:58 UTC (rev 158934)
@@ -0,0 +1,29 @@
+This should be visibleThis should be visible
+(GraphicsLayer
+ (bounds 785.00 1021.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 785.00 1021.00)
+ (contentsOpaque 1)
+ (children 2
+ (GraphicsLayer
+ (position -200.00 0.00)
+ (anchor 1.00 0.00)
+ (bounds 200.00 50.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ (transform [0.00 -1.00 0.00 0.00] [1.00 0.00 0.00 0.00] [0.00 0.00 1.00 0.00] [0.00 0.00 0.00 1.00])
+ )
+ (GraphicsLayer
+ (position -250.00 210.00)
+ (anchor 1.00 0.00)
+ (bounds 200.00 200.00)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ (transform [0.71 -0.71 0.00 0.00] [0.71 0.71 0.00 0.00] [0.00 0.00 1.00 0.00] [0.00 0.00 0.00 1.00])
+ )
+ )
+ )
+ )
+)
+
Added: trunk/LayoutTests/compositing/layer-creation/fixed-position-transformed-into-view.html (0 => 158934)
--- trunk/LayoutTests/compositing/layer-creation/fixed-position-transformed-into-view.html (rev 0)
+++ trunk/LayoutTests/compositing/layer-creation/fixed-position-transformed-into-view.html 2013-11-08 19:38:58 UTC (rev 158934)
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<html>
+<head>
+<style>
+ .fixed {
+ position: fixed;
+ background-color: silver;
+ }
+
+ .sideways {
+ top: 0;
+ right: 100%;
+ width: 200px;
+ height: 50px;
+ -webkit-transform-origin: top right;
+ -webkit-transform: rotate(-90deg);
+ }
+
+ .angled {
+ top: 210px;
+ left: -250px;
+ width: 200px;
+ height: 200px;
+ -webkit-transform-origin: top right;
+ -webkit-transform: rotate(-45deg);
+ }
+</style>
+<script>
+if (window.testRunner) {
+ testRunner.dumpAsText();
+}
+if (window.internals) {
+ window.internals.settings.setAcceleratedCompositingForFixedPositionEnabled(true);
+ window.internals.settings.setFixedPositionCreatesStackingContext(true);
+
+ window.addEventListener("load", function() {
+ document.getElementById("layerTree").innerText = internals.layerTreeAsText(document);
+ }, false);
+}
+</script>
+</head>
+<body>
+ <div class="fixed sideways">This should be visible</div>
+ <div class="fixed angled">This should be visible</div>
+
+<div style="height: 1000px">
+ <pre id="layerTree"></pre>
+</div>
+</body>
+</html>
Added: trunk/LayoutTests/compositing/layer-creation/fixed-position-transformed-outside-view-expected.txt (0 => 158934)
--- trunk/LayoutTests/compositing/layer-creation/fixed-position-transformed-outside-view-expected.txt (rev 0)
+++ trunk/LayoutTests/compositing/layer-creation/fixed-position-transformed-outside-view-expected.txt 2013-11-08 19:38:58 UTC (rev 158934)
@@ -0,0 +1,2 @@
+This should not be visibleThis should not be visible
+
Added: trunk/LayoutTests/compositing/layer-creation/fixed-position-transformed-outside-view.html (0 => 158934)
--- trunk/LayoutTests/compositing/layer-creation/fixed-position-transformed-outside-view.html (rev 0)
+++ trunk/LayoutTests/compositing/layer-creation/fixed-position-transformed-outside-view.html 2013-11-08 19:38:58 UTC (rev 158934)
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<html>
+<head>
+<style>
+ .fixed {
+ position: fixed;
+ background-color: red;
+ }
+
+ .sideways {
+ top: 0;
+ right: 100%;
+ width: 200px;
+ height: 50px;
+ -webkit-transform-origin: bottom right;
+ -webkit-transform: rotate(-90deg);
+ }
+
+ .angled {
+ top: 210px;
+ left: -350px;
+ width: 200px;
+ height: 200px;
+ -webkit-transform-origin: top right;
+ -webkit-transform: rotate(-45deg);
+ }
+</style>
+<script>
+ if (window.testRunner) {
+ testRunner.dumpAsText();
+ }
+ if (window.internals) {
+ window.internals.settings.setAcceleratedCompositingForFixedPositionEnabled(true);
+ window.internals.settings.setFixedPositionCreatesStackingContext(true);
+
+ window.addEventListener("load", function() {
+ document.getElementById("layerTree").innerText = internals.layerTreeAsText(document);
+ }, false);
+ }
+</script>
+</head>
+<body>
+ <div class="fixed sideways">This should not be visible</div>
+ <div class="fixed angled">This should not be visible</div>
+
+<div style="height: 1000px">
+ <pre id="layerTree"></pre>
+</div>
+</body>
+</html>
Modified: trunk/Source/WebCore/ChangeLog (158933 => 158934)
--- trunk/Source/WebCore/ChangeLog 2013-11-08 19:37:57 UTC (rev 158933)
+++ trunk/Source/WebCore/ChangeLog 2013-11-08 19:38:58 UTC (rev 158934)
@@ -1,3 +1,24 @@
+2013-11-08 Simon Fraser <[email protected]>
+
+ Left sidebar on cubic-bezier.com flickers
+ https://bugs.webkit.org/show_bug.cgi?id=123128
+
+ Reviewed by Dean Jackson.
+
+ The logic that determined whether position:fixed elements outside the viewport
+ should be composited was incorrect if the fixed element also had a transform.
+
+ layer.calculateLayerBounds() only takes into account painted transforms (since they
+ affect layer bounds). So we need to compute the bounds relative to the layer
+ itself, then use localToContainerQuad() to map them to document coordinates,
+ but only to the RenderView so that we don't hit the page scale transform.
+
+ Tests: compositing/layer-creation/fixed-position-transformed-into-view.html
+ compositing/layer-creation/fixed-position-transformed-outside-view.html
+
+ * rendering/RenderLayerCompositor.cpp:
+ (WebCore::RenderLayerCompositor::requiresCompositingForPosition):
+
2013-11-08 Martin Robinson <[email protected]>
[MathML] Center of stretched curly bracket not always vertically centered
Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (158933 => 158934)
--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp 2013-11-08 19:37:57 UTC (rev 158933)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp 2013-11-08 19:38:58 UTC (rev 158934)
@@ -2337,9 +2337,11 @@
// Fixed position elements that are invisible in the current view don't get their own layer.
LayoutRect viewBounds = m_renderView.frameView().viewportConstrainedVisibleContentRect();
- LayoutRect layerBounds = layer.calculateLayerBounds(&rootRenderLayer(), 0, RenderLayer::DefaultCalculateLayerBoundsFlags
+ LayoutRect layerBounds = layer.calculateLayerBounds(&layer, 0, RenderLayer::UseLocalClipRectIfPossible | RenderLayer::IncludeLayerFilterOutsets | RenderLayer::UseFragmentBoxes
| RenderLayer::ExcludeHiddenDescendants | RenderLayer::DontConstrainForMask | RenderLayer::IncludeCompositedDescendants);
- if (!viewBounds.intersects(enclosingIntRect(layerBounds))) {
+ // Map to m_renderView to ignore page scale.
+ FloatRect absoluteBounds = layer.renderer().localToContainerQuad(FloatRect(layerBounds), &m_renderView).boundingBox();
+ if (!viewBounds.intersects(enclosingIntRect(absoluteBounds))) {
if (viewportConstrainedNotCompositedReason)
*viewportConstrainedNotCompositedReason = RenderLayer::NotCompositedForBoundsOutOfView;
return false;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes