Commit dd97f207 authored by vollick@chromium.org's avatar vollick@chromium.org

Update scroll parent correctly for squashing layers.

Currently, we only set a scroll parent for 
"localRootForOwningLayer".I.e., the highest
GraphicsLayer in the CLM-managed hierarchy, excluding
the squashing containment layer. But for "scroll
buddies", we need the scroll child to be the very top
of the hierarchy.

We also need to ensure that scroll buddies are not
prevented from squashing together because of the
additional "I've got a scroll parent" compositing
reason.

This cl also disables chicken-egg asserts that trip
w/ universal accelerated overflow scroll and changes
how we compute composited bounds for squashed layers
(we currently pull the bounds from the clipper, but
it picks the wrong "clipping root" in this case).

With this CL, universal accelerated overflow scrolling
and squashing work nearly perfectly modulo known hit
testing bugs (which can prevent touch scrolling) and
repaint issues (separate issue reported here
https://code.google.com/p/chromium/issues/detail?id=351790).

BUG=328156

Review URL: https://codereview.chromium.org/131543013

git-svn-id: svn://svn.chromium.org/blink/trunk@169776 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 907920c4
<!DOCTYPE HTML>
<html>
<head>
<style>
#container {
width: 100px;
height: 100px;
border: 3px solid black;
overflow: scroll;
}
canvas {
background-color: gray;
border: 1px solid black;
-webkit-transform: translateZ(0);
}
</style>
<script>
if (window.testRunner)
testRunner.dumpAsTextWithPixelResults();
if (window.internals) {
window.internals.settings.setAccelerated2dCanvasEnabled(true);
}
function doTest() {
var canvas = document.getElementById("canvas");
var context = canvas.getContext('2d');
context.fillStyle = 'green';
context.fillRect(0, 0, 150, 100);
canvas.height = "200px";
}
window.onload = doTest;
</script>
</head>
<body>
<div id="container">
<canvas id="canvas" width="50" height="50"></canvas>
</div>
</body>
</html>
<!DOCTYPE HTML>
<html>
<head>
<style>
#container {
width: 100px;
height: 100px;
border: 3px solid black;
overflow: scroll;
}
canvas {
background-color: gray;
border: 1px solid black;
-webkit-transform: translateZ(0);
}
</style>
<script>
if (window.testRunner)
testRunner.dumpAsTextWithPixelResults();
if (window.internals) {
window.internals.settings.setAcceleratedCompositingForOverflowScrollEnabled(true);
window.internals.settings.setCompositorDrivenAcceleratedScrollingEnabled(true);
window.internals.settings.setAccelerated2dCanvasEnabled(true);
}
function doTest() {
var canvas = document.getElementById("canvas");
var context = canvas.getContext('2d');
context.fillStyle = 'green';
context.fillRect(0, 0, 150, 100);
canvas.height = "200px";
}
window.onload = doTest;
</script>
</head>
<body>
<div id="container">
<canvas id="canvas" width="50" height="50"></canvas>
</div>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<style>
#container {
width: 300px;
height: 300px;
border: 3px solid black;
overflow: scroll;
}
.card {
width: 100px;
height: 100px;
margin: 5px;
}
.fixed {
position: fixed;
background: blue;
z-index: 1;
left: 80px;
top: 80px;
}
.scrolled {
position: relative;
background: green;
}
</style>
<script>
if (window.internals) {
window.internals.settings.setAcceleratedCompositingForFixedPositionEnabled(true);
window.internals.settings.setAcceleratedCompositingForOverflowScrollEnabled(true);
window.internals.settings.setCompositorDrivenAcceleratedScrollingEnabled(true);
}
function doTest() {
var container = document.getElementById("container");
container.scrollTop = container.scrollHeight;
}
window.onload = doTest;
</script>
</head>
<body>
<div id="container">
<div class="fixed card"></div>
<div class="scrolled card"></div>
<div class="scrolled card"></div>
<div class="scrolled card"></div>
<div class="scrolled card"></div>
<div class="scrolled card"></div>
<div class="scrolled card"></div>
<div class="scrolled card"></div>
<div class="scrolled card"></div>
<div class="scrolled card"></div>
<div class="scrolled card"></div>
<div class="scrolled card"></div>
<div class="scrolled card"></div>
</div>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<style>
#container {
width: 300px;
height: 300px;
border: 3px solid black;
overflow: scroll;
}
.card {
width: 100px;
height: 100px;
margin: 5px;
}
.fixed {
position: fixed;
background: blue;
z-index: 1;
left: 80px;
top: 80px;
}
.scrolled {
position: relative;
background: green;
}
</style>
<script>
if (window.testRunner)
testRunner.dumpAsTextWithPixelResults();
if (window.internals) {
window.internals.settings.setAcceleratedCompositingForFixedPositionEnabled(true);
window.internals.settings.setAcceleratedCompositingForOverflowScrollEnabled(true);
window.internals.settings.setCompositorDrivenAcceleratedScrollingEnabled(true);
window.internals.settings.setLayerSquashingEnabled(true);
}
function doTest() {
var container = document.getElementById("container");
container.scrollTop = container.scrollHeight;
// FIXME: this is a hack to work around repainting issues with squashing.
// See http://crbug.com/351790
var scrolledCards = document.getElementsByClassName('scrolled');
for (var i = 0; i < scrolledCards.length; i++) {
scrolledCards[i].style.backgroundColor = '#ccc';
}
window.internals.forceCompositingUpdate(document);
for (var i = 0; i < scrolledCards.length; i++) {
scrolledCards[i].style.backgroundColor = 'green';
}
}
window.onload = doTest;
</script>
</head>
<body>
<div id="container">
<div class="fixed card"></div>
<div class="scrolled card"></div>
<div class="scrolled card"></div>
<div class="scrolled card"></div>
<div class="scrolled card"></div>
<div class="scrolled card"></div>
<div class="scrolled card"></div>
<div class="scrolled card"></div>
<div class="scrolled card"></div>
<div class="scrolled card"></div>
<div class="scrolled card"></div>
<div class="scrolled card"></div>
<div class="scrolled card"></div>
</div>
</body>
</html>
......@@ -195,6 +195,10 @@ RenderLayerCompositor* RenderLayer::compositor() const
void RenderLayer::contentChanged(ContentChangeType changeType)
{
// updateLayerCompositingState will query compositingReasons for accelerated overflow scrolling.
// This is tripped by LayoutTests/compositing/content-changed-chicken-egg.html
DisableCompositingQueryAsserts disabler;
// This can get called when video becomes accelerated, so the layers may change.
if (changeType == CanvasChanged || changeType == VideoChanged || changeType == FullScreenChanged)
compositor()->updateLayerCompositingState(this);
......
......@@ -361,7 +361,7 @@ void RenderLayerClipper::parentClipRects(const ClipRectsContext& clipRectsContex
RenderLayer* RenderLayerClipper::clippingRootForPainting() const
{
if (m_renderer->hasCompositedLayerMapping())
if (m_renderer->hasCompositedLayerMapping() || m_renderer->groupedMapping())
return const_cast<RenderLayer*>(m_renderer->layer());
const RenderLayer* current = m_renderer->layer();
......@@ -371,9 +371,7 @@ RenderLayer* RenderLayerClipper::clippingRootForPainting() const
current = current->compositingContainer();
ASSERT(current);
if (current->transform()
|| (current->compositingState() == PaintsIntoOwnBacking)
)
if (current->transform() || (current->compositingState() == PaintsIntoOwnBacking) || current->groupedMapping())
return const_cast<RenderLayer*>(current);
}
......
......@@ -891,6 +891,7 @@ GraphicsLayerUpdater::UpdateType CompositedLayerMapping::updateGraphicsLayerGeom
updateRenderingContext();
updateShouldFlattenTransform();
updateChildrenTransform();
updateScrollParent(m_owningLayer.scrollParent());
registerScrollingLayers();
updateCompositingReasons();
......@@ -1417,9 +1418,12 @@ static void updateScrollParentForGraphicsLayer(GraphicsLayer* layer, GraphicsLay
void CompositedLayerMapping::updateScrollParent(RenderLayer* scrollParent)
{
if (!scrollParent && m_squashedLayers.size())
scrollParent = m_squashedLayers[0].renderLayer->scrollParent();
if (ScrollingCoordinator* scrollingCoordinator = scrollingCoordinatorFromLayer(m_owningLayer)) {
GraphicsLayer* topmostLayer = localRootForOwningLayer();
GraphicsLayer* topmostLayer = childForSuperlayers();
updateScrollParentForGraphicsLayer(m_squashingContainmentLayer.get(), topmostLayer, scrollParent, scrollingCoordinator);
updateScrollParentForGraphicsLayer(m_ancestorClippingLayer.get(), topmostLayer, scrollParent, scrollingCoordinator);
updateScrollParentForGraphicsLayer(m_graphicsLayer.get(), topmostLayer, scrollParent, scrollingCoordinator);
}
......
......@@ -112,7 +112,8 @@ const uint64_t CompositingReasonComboReasonsThatRequireOwnBacking =
const uint64_t CompositingReasonComboSquashableReasons =
CompositingReasonOverlap
| CompositingReasonAssumedOverlap;
| CompositingReasonAssumedOverlap
| CompositingReasonOverflowScrollingParent;
typedef uint64_t CompositingReasons;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment