Bug 724502. Ensure that UpdateTransformLayer and UpdateOpacityLayer change hints generate a new change list entry for every frame whose style asks for them. r=matspal

This commit is contained in:
Robert O'Callahan 2012-02-08 11:52:59 +13:00
parent e1d954ff3b
commit 4146c611c0
2 changed files with 29 additions and 6 deletions

View File

@ -44,12 +44,18 @@
// Defines for various style related constants
// For hints that don't guarantee that the change will be applied to all descendant
// frames, style structs returning those hints from CalcDifference must have
// their ForceCompare() return true.
enum nsChangeHint {
// change was visual only (e.g., COLOR=)
// Invalidates all descendant frames (including following
// placeholders to out-of-flow frames).
nsChangeHint_RepaintFrame = 0x01,
// For reflow, we want flags to give us arbitrary FrameNeedsReflow behavior.
// just do a FrameNeedsReflow
// just do a FrameNeedsReflow.
nsChangeHint_NeedReflow = 0x02,
// Invalidate intrinsic widths on the frame's ancestors. Must not be set
@ -65,7 +71,8 @@ enum nsChangeHint {
// Clear*Intrinsics flags.
nsChangeHint_NeedDirtyReflow = 0x10,
// change requires view to be updated, if there is one (e.g., clip:)
// change requires view to be updated, if there is one (e.g., clip:).
// Updates all descendants (including following placeholders to out-of-flows).
nsChangeHint_SyncFrameView = 0x20,
// The currently shown mouse cursor needs to be updated
@ -85,16 +92,27 @@ enum nsChangeHint {
/**
* Visual change only, but the change can be handled entirely by
* updating the layer(s) for the frame.
* Updates all descendants (including following placeholders to out-of-flows).
*/
nsChangeHint_UpdateOpacityLayer = 0x100,
/**
* Updates all descendants. Any placeholder descendants' out-of-flows
* are also descendants of the transformed frame, so they're updated.
*/
nsChangeHint_UpdateTransformLayer = 0x200,
// change requires frame change (e.g., display:).
// This subsumes all the above.
/**
* Change requires frame change (e.g., display:).
* This subsumes all the above. Reconstructs all frame descendants,
* including following placeholders to out-of-flows.
*/
nsChangeHint_ReconstructFrame = 0x400,
// The frame's effect on its ancestors' overflow areas has changed,
// either through a change in its transform or a change in its position.
/**
* The frame's effect on its ancestors' overflow areas has changed,
* either through a change in its transform or a change in its position.
* Does not update any descendant frames.
*/
nsChangeHint_UpdateOverflow = 0x800
};

View File

@ -1061,6 +1061,11 @@ nsFrameManager::ReResolveStyleContext(nsPresContext *aPresContext,
NS_SubtractHint(aMinChange, nsChangeHint_ClearAncestorIntrinsics);
}
// We need to generate a new change list entry for every frame whose style
// comparision returns one of these hints. These hints don't automatically
// update all their descendant frames.
aMinChange = NS_SubtractHint(aMinChange, nsChangeHint_UpdateTransformLayer);
aMinChange = NS_SubtractHint(aMinChange, nsChangeHint_UpdateOpacityLayer);
aMinChange = NS_SubtractHint(aMinChange, nsChangeHint_UpdateOverflow);
// It would be nice if we could make stronger assertions here; they