Index: cc/trees/layer_tree_host_common.cc |
diff --git a/cc/trees/layer_tree_host_common.cc b/cc/trees/layer_tree_host_common.cc |
index e12e272653ab7fa2ed335c41ed084711a0da16c0..b05f8ec0e4a335bbad076c29f097c5de73740d27 100644 |
--- a/cc/trees/layer_tree_host_common.cc |
+++ b/cc/trees/layer_tree_host_common.cc |
@@ -46,13 +46,21 @@ static void SortLayers(LayerImplList::iterator first, |
template <typename LayerType> |
static gfx::Vector2dF GetEffectiveScrollDelta(LayerType* layer) { |
- gfx::Vector2dF scroll_delta = layer->ScrollDelta(); |
+ // Layer's scroll offset can have an integer part and fractional part. |
+ // Due to Blink's limitation, it only counter-scrolls the position-fixed |
+ // layer using the integer part of Layer's scroll offset. |
+ // CC scrolls the layer using the full scroll offset, so we have to |
+ // add the fractional part of the scroll offset to the effective scroll |
+ // delta which is used to counter-scroll the position-fixed layer. |
+ gfx::Vector2dF scroll_delta = |
+ layer->ScrollDelta() + layer->MainScrollOffsetFractionalPart(); |
// The scroll parent's scroll delta is the amount we've scrolled on the |
// compositor thread since the commit for this layer tree's source frame. |
// we last reported to the main thread. I.e., it's the discrepancy between |
// a scroll parent's scroll delta and offset, so we must add it here. |
if (layer->scroll_parent()) |
- scroll_delta += layer->scroll_parent()->ScrollDelta(); |
+ scroll_delta += layer->scroll_parent()->ScrollDelta() + |
+ layer->scroll_parent()->MainScrollOffsetFractionalPart(); |
return scroll_delta; |
} |