Bug 1255068 - Do not allow empty transaction transform changes if the scroll position has changed since the last paint. r=kats, r=mattwoodrow, a=ritu

MozReview-Commit-ID: 7exuhuf3HTJ

***

Bug 1255068 - Add a check for null scrollid. r=kats

MozReview-Commit-ID: 15lbTMb76np
This commit is contained in:
Markus Stange 2016-03-24 16:19:14 -04:00
parent d7175ca42c
commit 3dadaea877

View File

@ -5276,6 +5276,40 @@ nsIFrame::InvalidateFrameWithRect(const nsRect& aRect, uint32_t aDisplayItemKey)
/*static*/ uint8_t nsIFrame::sLayerIsPrerenderedDataKey; /*static*/ uint8_t nsIFrame::sLayerIsPrerenderedDataKey;
static bool
DoesLayerHaveOutOfDateFrameMetrics(Layer* aLayer)
{
for (uint32_t i = 0; i < aLayer->GetFrameMetricsCount(); i++) {
const FrameMetrics& metrics = aLayer->GetFrameMetrics(i);
if (!metrics.IsScrollable()) {
continue;
}
nsIScrollableFrame* scrollableFrame =
nsLayoutUtils::FindScrollableFrameFor(metrics.GetScrollId());
if (!scrollableFrame) {
// This shouldn't happen, so let's do the safe thing and trigger a full
// paint if it does.
return true;
}
nsPoint scrollPosition = scrollableFrame->GetScrollPosition();
if (metrics.GetScrollOffset() != CSSPoint::FromAppUnits(scrollPosition)) {
return true;
}
}
return false;
}
static bool
DoesLayerOrAncestorsHaveOutOfDateFrameMetrics(Layer* aLayer)
{
for (Layer* layer = aLayer; layer; layer = layer->GetParent()) {
if (DoesLayerHaveOutOfDateFrameMetrics(layer)) {
return true;
}
}
return false;
}
bool bool
nsIFrame::TryUpdateTransformOnly(Layer** aLayerResult) nsIFrame::TryUpdateTransformOnly(Layer** aLayerResult)
{ {
@ -5288,6 +5322,14 @@ nsIFrame::TryUpdateTransformOnly(Layer** aLayerResult)
return false; return false;
} }
if (DoesLayerOrAncestorsHaveOutOfDateFrameMetrics(layer)) {
// At least one scroll frame that can affect the position of this layer
// has changed its scroll offset since the last paint. Schedule a full
// paint to make sure that this layer's transform and all the frame
// metrics that affect it are in sync.
return false;
}
gfx::Matrix4x4 transform3d; gfx::Matrix4x4 transform3d;
if (!nsLayoutUtils::GetLayerTransformForFrame(this, &transform3d)) { if (!nsLayoutUtils::GetLayerTransformForFrame(this, &transform3d)) {
// We're not able to compute a layer transform that we know would // We're not able to compute a layer transform that we know would