mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-23 21:01:08 +00:00
Bug 1255068 - Do not allow empty transaction transform changes if the scroll position has changed since the last paint. r=kats, r=mattwoodrow
MozReview-Commit-ID: 7exuhuf3HTJ --HG-- extra : rebase_source : b131cdc68e07ab8dfdc6ae56caa24cc0ced5102e
This commit is contained in:
parent
c03e235186
commit
e41f4e8c1a
@ -5272,6 +5272,37 @@ nsIFrame::InvalidateFrameWithRect(const nsRect& aRect, uint32_t aDisplayItemKey)
|
||||
|
||||
/*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);
|
||||
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
|
||||
nsIFrame::TryUpdateTransformOnly(Layer** aLayerResult)
|
||||
{
|
||||
@ -5284,6 +5315,14 @@ nsIFrame::TryUpdateTransformOnly(Layer** aLayerResult)
|
||||
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;
|
||||
if (!nsLayoutUtils::GetLayerTransformForFrame(this, &transform3d)) {
|
||||
// We're not able to compute a layer transform that we know would
|
||||
|
Loading…
Reference in New Issue
Block a user