mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-25 11:58:55 +00:00
Change the FrameNeedsReflow API to pass the dirty flags to be added directly tothe method, instead of setting them before calling the method. That way we canavoid reflowing the ancestor of a reflow root which is not itself dirty but hasdirty children. This also makes it harder to set dirty bits inconsistentlywith the FrameNeedsReflow call. Bug 378784, r+sr=dbaron, pending rbs' reviewon the mathml parts.
This commit is contained in:
parent
ecc5ecc833
commit
1b5f6b30b6
@ -9800,8 +9800,8 @@ nsCSSFrameConstructor::StyleChangeReflow(nsIFrame* aFrame,
|
||||
if (IsFrameSpecial(aFrame))
|
||||
aFrame = GetIBContainingBlockFor(aFrame);
|
||||
|
||||
aFrame->AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
mPresShell->FrameNeedsReflow(aFrame, nsIPresShell::eStyleChange);
|
||||
mPresShell->FrameNeedsReflow(aFrame, nsIPresShell::eStyleChange,
|
||||
NS_FRAME_IS_DIRTY);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
@ -99,6 +99,7 @@ class nsIScrollableFrame;
|
||||
class gfxASurface;
|
||||
|
||||
typedef short SelectionType;
|
||||
typedef PRUint32 nsFrameState;
|
||||
|
||||
// DC543B71-6F1A-4B9F-B4CF-693AEC4BA24A
|
||||
#define NS_IPRESSHELL_IID \
|
||||
@ -341,10 +342,11 @@ public:
|
||||
nsIFrame** aPlaceholderFrame) const = 0;
|
||||
|
||||
/**
|
||||
* Tell the pres shell that a frame is dirty (as indicated by bits)
|
||||
* and needs Reflow. It's OK if this is an ancestor of the frame needing
|
||||
* reflow as long as the ancestor chain between them doesn't cross a reflow
|
||||
* root.
|
||||
* Tell the pres shell that a frame needs to be marked dirty and needs
|
||||
* Reflow. It's OK if this is an ancestor of the frame needing reflow as
|
||||
* long as the ancestor chain between them doesn't cross a reflow root. The
|
||||
* bits to add should be some combination of NS_FRAME_IS_DIRTY and
|
||||
* NS_FRAME_HAS_DIRTY_CHILDREN.
|
||||
*/
|
||||
enum IntrinsicDirty {
|
||||
// XXXldb eResize should be renamed
|
||||
@ -353,7 +355,8 @@ public:
|
||||
eStyleChange // Do eTreeChange, plus all of aFrame's descendants
|
||||
};
|
||||
NS_IMETHOD FrameNeedsReflow(nsIFrame *aFrame,
|
||||
IntrinsicDirty aIntrinsicDirty) = 0;
|
||||
IntrinsicDirty aIntrinsicDirty,
|
||||
nsFrameState aBitsToAdd) = 0;
|
||||
|
||||
NS_IMETHOD CancelAllPendingReflows() = 0;
|
||||
|
||||
|
@ -812,7 +812,8 @@ public:
|
||||
nsISupports** aResult) const;
|
||||
NS_IMETHOD GetPlaceholderFrameFor(nsIFrame* aFrame,
|
||||
nsIFrame** aPlaceholderFrame) const;
|
||||
NS_IMETHOD FrameNeedsReflow(nsIFrame *aFrame, IntrinsicDirty aIntrinsicDirty);
|
||||
NS_IMETHOD FrameNeedsReflow(nsIFrame *aFrame, IntrinsicDirty aIntrinsicDirty,
|
||||
nsFrameState aBitsToAdd);
|
||||
NS_IMETHOD CancelAllPendingReflows();
|
||||
NS_IMETHOD IsSafeToFlush(PRBool& aIsSafeToFlush);
|
||||
NS_IMETHOD FlushPendingNotifications(mozFlushType aType);
|
||||
@ -2462,9 +2463,18 @@ PresShell::InitialReflow(nscoord aWidth, nscoord aHeight)
|
||||
}
|
||||
|
||||
if (rootFrame) {
|
||||
rootFrame->AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
FrameNeedsReflow(rootFrame, eResize);
|
||||
mDirtyRoots.AppendElement(rootFrame);
|
||||
// Note: Because the frame just got created, it has the NS_FRAME_IS_DIRTY
|
||||
// bit set. Unset it so that FrameNeedsReflow() will work right.
|
||||
NS_ASSERTION(mDirtyRoots.IndexOf(rootFrame) == -1,
|
||||
"Why is the root in mDirtyRoots already?");
|
||||
|
||||
rootFrame->RemoveStateBits(NS_FRAME_IS_DIRTY |
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
FrameNeedsReflow(rootFrame, eResize, NS_FRAME_IS_DIRTY);
|
||||
|
||||
NS_ASSERTION(mDirtyRoots.IndexOf(rootFrame) != -1,
|
||||
"Should be in mDirtyRoots now");
|
||||
NS_ASSERTION(mReflowEvent.IsPending(), "Why no reflow event pending?");
|
||||
}
|
||||
|
||||
// Restore our root scroll position now if we're getting here after EndLoad
|
||||
@ -2932,13 +2942,7 @@ PresShell::StyleChangeReflow()
|
||||
if (!rootFrame)
|
||||
return NS_OK;
|
||||
|
||||
if (!(rootFrame->GetStateBits() &
|
||||
(NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN))) {
|
||||
rootFrame->AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
mDirtyRoots.AppendElement(rootFrame);
|
||||
}
|
||||
|
||||
return FrameNeedsReflow(rootFrame, eStyleChange);
|
||||
return FrameNeedsReflow(rootFrame, eStyleChange, NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
|
||||
nsIFrame*
|
||||
@ -3109,11 +3113,12 @@ PresShell::VerifyHasDirtyRootAncestor(nsIFrame* aFrame)
|
||||
#endif
|
||||
|
||||
NS_IMETHODIMP
|
||||
PresShell::FrameNeedsReflow(nsIFrame *aFrame, IntrinsicDirty aIntrinsicDirty)
|
||||
PresShell::FrameNeedsReflow(nsIFrame *aFrame, IntrinsicDirty aIntrinsicDirty,
|
||||
nsFrameState aBitsToAdd)
|
||||
{
|
||||
NS_PRECONDITION(aFrame->GetStateBits() &
|
||||
(NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN),
|
||||
"frame not dirty");
|
||||
NS_PRECONDITION(aBitsToAdd == NS_FRAME_IS_DIRTY ||
|
||||
aBitsToAdd == NS_FRAME_HAS_DIRTY_CHILDREN,
|
||||
"Unexpected bits being added");
|
||||
|
||||
// XXX Add this assertion at some point!? nsSliderFrame triggers it a lot.
|
||||
//NS_ASSERTION(!mIsReflowing, "can't mark frame dirty during reflow");
|
||||
@ -3144,14 +3149,25 @@ PresShell::FrameNeedsReflow(nsIFrame *aFrame, IntrinsicDirty aIntrinsicDirty)
|
||||
}
|
||||
#endif
|
||||
|
||||
// Grab |wasDirty| now so we can go ahead and update the bits on
|
||||
// aFrame and then get |targetFrameDirty|.
|
||||
PRBool wasDirty = NS_SUBTREE_DIRTY(aFrame);
|
||||
aFrame->AddStateBits(aBitsToAdd);
|
||||
PRBool targetFrameDirty = ((aFrame->GetStateBits() & NS_FRAME_IS_DIRTY) != 0);
|
||||
#define FRAME_IS_REFLOW_ROOT(_f) \
|
||||
((_f->GetStateBits() & NS_FRAME_REFLOW_ROOT) && \
|
||||
(_f != aFrame || !targetFrameDirty))
|
||||
|
||||
|
||||
// Mark the intrinsic widths as dirty on the frame, all of its ancestors,
|
||||
// and all of its descendants, if needed:
|
||||
|
||||
if (aIntrinsicDirty != eResize) {
|
||||
// Mark argument and all ancestors dirty (unless we hit a reflow root
|
||||
// other than aFrame)
|
||||
// Mark argument and all ancestors dirty. (Unless we hit a reflow root that
|
||||
// should contain the reflow. That root could be aFrame itself if it's not
|
||||
// dirty, or it could be some ancestor of aFrame.)
|
||||
for (nsIFrame *a = aFrame;
|
||||
a && (!(a->GetStateBits() & NS_FRAME_REFLOW_ROOT) || a == aFrame);
|
||||
a && !FRAME_IS_REFLOW_ROOT(a);
|
||||
a = a->GetParent())
|
||||
a->MarkIntrinsicWidthsDirty();
|
||||
}
|
||||
@ -3183,10 +3199,8 @@ PresShell::FrameNeedsReflow(nsIFrame *aFrame, IntrinsicDirty aIntrinsicDirty)
|
||||
// Set NS_FRAME_HAS_DIRTY_CHILDREN bits (via nsIFrame::ChildIsDirty) up the
|
||||
// tree until we reach either a frame that's already dirty or a reflow root.
|
||||
nsIFrame *f = aFrame;
|
||||
PRBool wasDirty = PR_TRUE;
|
||||
for (;;) {
|
||||
if (((f->GetStateBits() & NS_FRAME_REFLOW_ROOT) && f != aFrame) ||
|
||||
!f->GetParent()) {
|
||||
if (FRAME_IS_REFLOW_ROOT(f) || !f->GetParent()) {
|
||||
// we've hit a reflow root or the root frame
|
||||
if (!wasDirty) {
|
||||
// Remove existing entries so we don't get duplicates,
|
||||
@ -3207,8 +3221,7 @@ PresShell::FrameNeedsReflow(nsIFrame *aFrame, IntrinsicDirty aIntrinsicDirty)
|
||||
|
||||
nsIFrame *child = f;
|
||||
f = f->GetParent();
|
||||
wasDirty = ((f->GetStateBits() &
|
||||
(NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN)) != 0);
|
||||
wasDirty = NS_SUBTREE_DIRTY(f);
|
||||
f->ChildIsDirty(child);
|
||||
NS_ASSERTION(f->GetStateBits() & NS_FRAME_HAS_DIRTY_CHILDREN,
|
||||
"ChildIsDirty didn't do its job");
|
||||
@ -6139,8 +6152,7 @@ PresShell::ProcessReflowCommands(PRBool aInterruptible)
|
||||
nsIFrame *target = NS_STATIC_CAST(nsIFrame*, mDirtyRoots[idx]);
|
||||
mDirtyRoots.RemoveElementAt(idx);
|
||||
|
||||
if (!(target->GetStateBits() &
|
||||
(NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN))) {
|
||||
if (!NS_SUBTREE_DIRTY(target)) {
|
||||
// It's not dirty anymore, which probably means the notification
|
||||
// was posted in the middle of a reflow (perhaps with a reflow
|
||||
// root in the middle). Don't do anything.
|
||||
|
@ -447,8 +447,7 @@ nsComboboxControlFrame::ReflowDropdown(nsPresContext* aPresContext,
|
||||
// don't even need to cache mDropdownFrame's ascent or anything. If we don't
|
||||
// need to reflow it, just bail out here.
|
||||
if (!aReflowState.ShouldReflowAllKids() &&
|
||||
!(mDropdownFrame->GetStateBits() & (NS_FRAME_IS_DIRTY |
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN))) {
|
||||
!NS_SUBTREE_DIRTY(mDropdownFrame)) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
@ -828,10 +827,10 @@ nsComboboxControlFrame::HandleRedisplayTextEvent()
|
||||
mRedisplayTextEvent.Forget();
|
||||
|
||||
ActuallyDisplayText(PR_TRUE);
|
||||
mDisplayFrame->AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
// XXXbz This should perhaps be eResize. Check.
|
||||
PresContext()->PresShell()->FrameNeedsReflow(mDisplayFrame,
|
||||
nsIPresShell::eStyleChange);
|
||||
nsIPresShell::eStyleChange,
|
||||
NS_FRAME_IS_DIRTY);
|
||||
|
||||
mInRedisplayText = PR_FALSE;
|
||||
}
|
||||
|
@ -459,13 +459,9 @@ nsFieldSetFrame::Reflow(nsPresContext* aPresContext,
|
||||
reflowContent = mContentFrame != nsnull;
|
||||
reflowLegend = mLegendFrame != nsnull;
|
||||
} else {
|
||||
reflowContent = mContentFrame &&
|
||||
(mContentFrame->GetStateBits() &
|
||||
(NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN)) != 0;
|
||||
reflowContent = mContentFrame && NS_SUBTREE_DIRTY(mContentFrame);
|
||||
|
||||
reflowLegend = mLegendFrame &&
|
||||
(mLegendFrame->GetStateBits() &
|
||||
(NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN)) != 0;
|
||||
reflowLegend = mLegendFrame && NS_SUBTREE_DIRTY(mLegendFrame);
|
||||
}
|
||||
|
||||
nsSize availSize(aReflowState.ComputedWidth(), aReflowState.availableHeight);
|
||||
@ -699,9 +695,8 @@ nsFieldSetFrame::RemoveFrame(nsIAtom* aListName,
|
||||
|
||||
mFrames.DestroyFrame(mLegendFrame);
|
||||
mLegendFrame = nsnull;
|
||||
AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange, NS_FRAME_IS_DIRTY);
|
||||
return NS_OK;
|
||||
}
|
||||
return mContentFrame->RemoveFrame(aListName, aOldFrame);
|
||||
@ -729,9 +724,9 @@ nsFieldSetFrame::MaybeSetLegend(nsIFrame* aFrameList, nsIAtom* aListName)
|
||||
aFrameList = mLegendFrame->GetNextSibling();
|
||||
mLegendFrame->SetNextSibling(mContentFrame);
|
||||
mFrames.SetFrames(mLegendFrame);
|
||||
AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
}
|
||||
return aFrameList;
|
||||
}
|
||||
|
@ -293,8 +293,7 @@ nsHTMLButtonControlFrame::Reflow(nsPresContext* aPresContext,
|
||||
|
||||
// XXXbz Eventually we may want to check-and-bail if
|
||||
// !aReflowState.ShouldReflowAllKids() &&
|
||||
// !(firstKid->GetStateBits() &
|
||||
// (NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN)).
|
||||
// !NS_SUBTREE_DIRTY(firstKid).
|
||||
// We'd need to cache our ascent for that, of course.
|
||||
|
||||
nsMargin focusPadding = mRenderer.GetAddedButtonBorderAndPadding();
|
||||
|
@ -567,8 +567,7 @@ nsListControlFrame::Reflow(nsPresContext* aPresContext,
|
||||
|
||||
PRBool autoHeight = (aReflowState.mComputedHeight == NS_UNCONSTRAINEDSIZE);
|
||||
|
||||
mMightNeedSecondPass = autoHeight &&
|
||||
(GetStateBits() & (NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN));
|
||||
mMightNeedSecondPass = autoHeight && NS_SUBTREE_DIRTY(this);
|
||||
|
||||
nsHTMLReflowState state(aReflowState);
|
||||
PRInt32 length = GetNumberOfOptions();
|
||||
@ -636,8 +635,7 @@ nsListControlFrame::ReflowAsDropdown(nsPresContext* aPresContext,
|
||||
NS_PRECONDITION(aReflowState.mComputedHeight == NS_UNCONSTRAINEDSIZE,
|
||||
"We should not have a computed height here!");
|
||||
|
||||
mMightNeedSecondPass =
|
||||
(GetStateBits() & (NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN)) != 0;
|
||||
mMightNeedSecondPass = NS_SUBTREE_DIRTY(this);
|
||||
|
||||
nscoord oldHeightOfARow = HeightOfARow();
|
||||
|
||||
|
@ -88,11 +88,11 @@ nsAbsoluteContainingBlock::AppendFrames(nsIFrame* aDelegatingFrame,
|
||||
#endif
|
||||
mAbsoluteFrames.AppendFrames(nsnull, aFrameList);
|
||||
|
||||
aDelegatingFrame->AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
// no damage to intrinsic widths, since absolutely positioned frames can't
|
||||
// change them
|
||||
return aDelegatingFrame->PresContext()->PresShell()->
|
||||
FrameNeedsReflow(aDelegatingFrame, nsIPresShell::eResize);
|
||||
FrameNeedsReflow(aDelegatingFrame, nsIPresShell::eResize,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
}
|
||||
|
||||
nsresult
|
||||
@ -110,11 +110,11 @@ nsAbsoluteContainingBlock::InsertFrames(nsIFrame* aDelegatingFrame,
|
||||
#endif
|
||||
mAbsoluteFrames.InsertFrames(nsnull, aPrevFrame, aFrameList);
|
||||
|
||||
aDelegatingFrame->AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
// no damage to intrinsic widths, since absolutely positioned frames can't
|
||||
// change them
|
||||
return aDelegatingFrame->PresContext()->PresShell()->
|
||||
FrameNeedsReflow(aDelegatingFrame, nsIPresShell::eResize);
|
||||
FrameNeedsReflow(aDelegatingFrame, nsIPresShell::eResize,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
}
|
||||
|
||||
nsresult
|
||||
@ -170,8 +170,7 @@ nsAbsoluteContainingBlock::Reflow(nsIFrame* aDelegatingFrame,
|
||||
nsIFrame* kidFrame;
|
||||
for (kidFrame = mAbsoluteFrames.FirstChild(); kidFrame; kidFrame = kidFrame->GetNextSibling()) {
|
||||
if (reflowAll ||
|
||||
(kidFrame->GetStateBits() &
|
||||
(NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN)) ||
|
||||
NS_SUBTREE_DIRTY(kidFrame) ||
|
||||
FrameDependsOnContainer(kidFrame, aCBWidthChanged, aCBHeightChanged)) {
|
||||
// Reflow the frame
|
||||
nsReflowStatus kidStatus;
|
||||
|
@ -517,9 +517,7 @@ nsBlockFrame::InvalidateInternal(const nsRect& aDamageRect,
|
||||
nscoord
|
||||
nsBlockFrame::GetBaseline() const
|
||||
{
|
||||
NS_ASSERTION(!(GetStateBits() & (NS_FRAME_IS_DIRTY |
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN)),
|
||||
"frame must not be dirty");
|
||||
NS_ASSERTION(!NS_SUBTREE_DIRTY(this), "frame must not be dirty");
|
||||
nscoord result;
|
||||
if (nsLayoutUtils::GetLastLineBaseline(this, &result))
|
||||
return result;
|
||||
@ -890,7 +888,9 @@ nsBlockFrame::Reflow(nsPresContext* aPresContext,
|
||||
}
|
||||
#endif // IBMBIDI
|
||||
|
||||
RenumberLists(aPresContext);
|
||||
if (RenumberLists(aPresContext)) {
|
||||
AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
}
|
||||
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
@ -2428,10 +2428,11 @@ nsBlockFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsPresContext* presContext = PresContext();
|
||||
|
||||
// XXX Not sure if this is necessary anymore
|
||||
RenumberLists(presContext);
|
||||
|
||||
presContext->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eStyleChange);
|
||||
if (RenumberLists(presContext)) {
|
||||
presContext->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eStyleChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
}
|
||||
}
|
||||
else if (nsGkAtoms::value == aAttribute) {
|
||||
const nsStyleDisplay* styleDisplay = GetStyleDisplay();
|
||||
@ -2447,10 +2448,11 @@ nsBlockFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
if (nsnull != blockParent) {
|
||||
nsPresContext* presContext = PresContext();
|
||||
// XXX Not sure if this is necessary anymore
|
||||
blockParent->RenumberLists(presContext);
|
||||
|
||||
presContext->PresShell()->
|
||||
FrameNeedsReflow(blockParent, nsIPresShell::eStyleChange);
|
||||
if (blockParent->RenumberLists(presContext)) {
|
||||
presContext->PresShell()->
|
||||
FrameNeedsReflow(blockParent, nsIPresShell::eStyleChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -4578,9 +4580,9 @@ nsBlockFrame::AppendFrames(nsIAtom* aListName,
|
||||
#endif
|
||||
nsresult rv = AddFrames(aFrameList, lastKid);
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN); // XXX sufficient?
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN); // XXX sufficient?
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
@ -4626,9 +4628,9 @@ nsBlockFrame::InsertFrames(nsIAtom* aListName,
|
||||
if (aListName != nsGkAtoms::nextBidi)
|
||||
#endif // IBMBIDI
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN); // XXX sufficient?
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN); // XXX sufficient?
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
@ -4901,9 +4903,9 @@ nsBlockFrame::RemoveFrame(nsIAtom* aListName,
|
||||
}
|
||||
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN); // XXX sufficient?
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN); // XXX sufficient?
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
@ -6038,13 +6040,13 @@ nsBlockFrame::FrameStartsCounterScope(nsIFrame* aFrame)
|
||||
localName == nsGkAtoms::menu;
|
||||
}
|
||||
|
||||
void
|
||||
PRBool
|
||||
nsBlockFrame::RenumberLists(nsPresContext* aPresContext)
|
||||
{
|
||||
if (!FrameStartsCounterScope(this)) {
|
||||
// If this frame doesn't start a counter scope then we don't need
|
||||
// to renumber child list items.
|
||||
return;
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
// Setup initial list ordinal value
|
||||
@ -6062,8 +6064,7 @@ nsBlockFrame::RenumberLists(nsPresContext* aPresContext)
|
||||
|
||||
// Get to first-in-flow
|
||||
nsBlockFrame* block = (nsBlockFrame*) GetFirstInFlow();
|
||||
if (RenumberListsInBlock(aPresContext, block, &ordinal, 0))
|
||||
AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
return RenumberListsInBlock(aPresContext, block, &ordinal, 0);
|
||||
}
|
||||
|
||||
PRBool
|
||||
|
@ -522,7 +522,11 @@ protected:
|
||||
//----------------------------------------
|
||||
// List handling kludge
|
||||
|
||||
void RenumberLists(nsPresContext* aPresContext);
|
||||
// If this returns PR_TRUE, the block it's called on should get the
|
||||
// NS_FRAME_HAS_DIRTY_CHILDREN bit set on it by the caller; either directly
|
||||
// if it's already in reflow, or via calling FrameNeedsReflow() to schedule a
|
||||
// reflow.
|
||||
PRBool RenumberLists(nsPresContext* aPresContext);
|
||||
|
||||
PRBool RenumberListsInBlock(nsPresContext* aPresContext,
|
||||
nsBlockFrame* aContainerFrame,
|
||||
|
@ -1615,11 +1615,8 @@ NS_IMETHODIMP nsBulletFrame::OnStartContainer(imgIRequest *aRequest,
|
||||
// a reflow of the bullet frame.
|
||||
nsIPresShell *shell = presContext->GetPresShell();
|
||||
if (shell) {
|
||||
NS_ASSERTION(mParent, "No parent to pass the reflow request up to.");
|
||||
if (mParent) {
|
||||
mState |= NS_FRAME_IS_DIRTY;
|
||||
shell->FrameNeedsReflow(this, nsIPresShell::eStyleChange);
|
||||
}
|
||||
shell->FrameNeedsReflow(this, nsIPresShell::eStyleChange,
|
||||
NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -335,7 +335,7 @@ nsColumnSetFrame::ReflowChildren(nsHTMLReflowMetrics& aDesiredSize,
|
||||
nsCollapsingMargin* aBottomMarginCarriedOut) {
|
||||
PRBool allFit = PR_TRUE;
|
||||
PRBool RTL = GetStyleVisibility()->mDirection == NS_STYLE_DIRECTION_RTL;
|
||||
PRBool shrinkingHeightOnly = !(GetStateBits() & (NS_FRAME_IS_DIRTY|NS_FRAME_HAS_DIRTY_CHILDREN)) &&
|
||||
PRBool shrinkingHeightOnly = !NS_SUBTREE_DIRTY(this) &&
|
||||
mLastBalanceHeight > aConfig.mColMaxHeight;
|
||||
|
||||
#ifdef DEBUG_roc
|
||||
|
@ -138,9 +138,8 @@ nsContainerFrame::AppendFrames(nsIAtom* aListName,
|
||||
if (nsnull == aListName)
|
||||
#endif
|
||||
{
|
||||
AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange, NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
}
|
||||
return NS_OK;
|
||||
@ -171,10 +170,8 @@ nsContainerFrame::InsertFrames(nsIAtom* aListName,
|
||||
if (nsnull == aListName)
|
||||
#endif
|
||||
{
|
||||
// Ask the parent frame to reflow me.
|
||||
AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange, NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
}
|
||||
return NS_OK;
|
||||
@ -229,10 +226,8 @@ nsContainerFrame::RemoveFrame(nsIAtom* aListName,
|
||||
}
|
||||
|
||||
if (generateReflowCommand) {
|
||||
// Ask the parent frame to reflow me.
|
||||
AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange, NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -688,8 +688,7 @@ NS_IMETHODIMP nsFrame::DidSetStyleContext()
|
||||
/* virtual */ nsMargin
|
||||
nsIFrame::GetUsedMargin() const
|
||||
{
|
||||
NS_ASSERTION(!(GetStateBits() &
|
||||
(NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN)) ||
|
||||
NS_ASSERTION(!NS_SUBTREE_DIRTY(this) ||
|
||||
(GetStateBits() & NS_FRAME_IN_REFLOW),
|
||||
"cannot call on a dirty frame not currently being reflowed");
|
||||
|
||||
@ -708,8 +707,7 @@ nsIFrame::GetUsedMargin() const
|
||||
/* virtual */ nsMargin
|
||||
nsIFrame::GetUsedBorder() const
|
||||
{
|
||||
NS_ASSERTION(!(GetStateBits() &
|
||||
(NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN)) ||
|
||||
NS_ASSERTION(!NS_SUBTREE_DIRTY(this) ||
|
||||
(GetStateBits() & NS_FRAME_IN_REFLOW),
|
||||
"cannot call on a dirty frame not currently being reflowed");
|
||||
|
||||
@ -736,8 +734,7 @@ nsIFrame::GetUsedBorder() const
|
||||
/* virtual */ nsMargin
|
||||
nsIFrame::GetUsedPadding() const
|
||||
{
|
||||
NS_ASSERTION(!(GetStateBits() &
|
||||
(NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN)) ||
|
||||
NS_ASSERTION(!NS_SUBTREE_DIRTY(this) ||
|
||||
(GetStateBits() & NS_FRAME_IN_REFLOW),
|
||||
"cannot call on a dirty frame not currently being reflowed");
|
||||
|
||||
@ -832,8 +829,7 @@ nsFrame::SetAdditionalStyleContext(PRInt32 aIndex,
|
||||
nscoord
|
||||
nsFrame::GetBaseline() const
|
||||
{
|
||||
NS_ASSERTION(!(GetStateBits() & (NS_FRAME_IS_DIRTY |
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN)),
|
||||
NS_ASSERTION(!NS_SUBTREE_DIRTY(this),
|
||||
"frame must not be dirty");
|
||||
// Default to the bottom margin edge, per CSS2.1's definition of the
|
||||
// 'baseline' value of 'vertical-align'.
|
||||
@ -6113,8 +6109,7 @@ nsFrame::BoxReflow(nsBoxLayoutState& aState,
|
||||
PRBool redrawAfterReflow = PR_FALSE;
|
||||
PRBool redrawNow = PR_FALSE;
|
||||
|
||||
PRBool needsReflow =
|
||||
(GetStateBits() & (NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN)) != 0;
|
||||
PRBool needsReflow = NS_SUBTREE_DIRTY(this);
|
||||
|
||||
if (redrawNow)
|
||||
Redraw(aState);
|
||||
|
@ -734,9 +734,7 @@ nsHTMLScrollFrame::Reflow(nsPresContext* aPresContext,
|
||||
PRBool reflowScrollCorner = PR_TRUE;
|
||||
if (!aReflowState.ShouldReflowAllKids()) {
|
||||
#define NEEDS_REFLOW(frame_) \
|
||||
((frame_) && \
|
||||
((frame_)->GetStateBits() & \
|
||||
(NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN)) != 0)
|
||||
((frame_) && NS_SUBTREE_DIRTY(frame_))
|
||||
|
||||
reflowContents = NEEDS_REFLOW(mInner.mScrolledFrame);
|
||||
reflowHScrollbar = NEEDS_REFLOW(mInner.mHScrollbarBox);
|
||||
@ -2488,10 +2486,10 @@ nsGfxScrollFrameInner::LayoutScrollbars(nsBoxLayoutState& aState,
|
||||
parentFrame->GetFirstChild(nsGkAtoms::fixedList);
|
||||
fixedChild; fixedChild = fixedChild->GetNextSibling()) {
|
||||
// force a reflow of the fixed child
|
||||
fixedChild->AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
// XXX Will this work given where we currently are in reflow?
|
||||
aState.PresContext()->PresShell()->
|
||||
FrameNeedsReflow(fixedChild, nsIPresShell::eResize);
|
||||
FrameNeedsReflow(fixedChild, nsIPresShell::eResize,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -282,7 +282,8 @@ CanvasFrame::AppendFrames(nsIAtom* aListName,
|
||||
mFrames.AppendFrame(nsnull, aFrameList);
|
||||
|
||||
rv = PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
}
|
||||
|
||||
return rv;
|
||||
@ -328,9 +329,9 @@ CanvasFrame::RemoveFrame(nsIAtom* aListName,
|
||||
// Remove the frame and destroy it
|
||||
mFrames.DestroyFrame(aOldFrame);
|
||||
|
||||
AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
rv = PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
} else {
|
||||
rv = NS_ERROR_FAILURE;
|
||||
}
|
||||
|
@ -142,8 +142,7 @@ nsHTMLReflowState::nsHTMLReflowState(nsPresContext* aPresContext,
|
||||
NS_PRECONDITION(aInit == PR_TRUE || aInit == PR_FALSE,
|
||||
"aInit out of range for PRBool");
|
||||
NS_PRECONDITION(!mFlags.mSpecialHeightReflow ||
|
||||
!(aFrame->GetStateBits() & (NS_FRAME_IS_DIRTY |
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN)),
|
||||
!NS_SUBTREE_DIRTY(aFrame),
|
||||
"frame should be clean when getting special height reflow");
|
||||
|
||||
parentReflowState = &aParentReflowState;
|
||||
@ -339,9 +338,7 @@ nsHTMLReflowState::InitResizeFlags(nsPresContext* aPresContext)
|
||||
// XXX This condition doesn't quite match CalcQuirkContainingBlockHeight.
|
||||
mFlags.mVResize = mCBReflowState->mFlags.mVResize;
|
||||
} else {
|
||||
mFlags.mVResize = mFlags.mHResize ||
|
||||
(frame->GetStateBits() &
|
||||
(NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN));
|
||||
mFlags.mVResize = mFlags.mHResize || NS_SUBTREE_DIRTY(frame);
|
||||
}
|
||||
} else {
|
||||
// not 'auto' height
|
||||
|
@ -187,6 +187,8 @@ typedef PRUint32 nsFrameState;
|
||||
// This bit is set when the frame is first created.
|
||||
// This bit is cleared by DidReflow after the required call to Reflow has
|
||||
// finished.
|
||||
// Do not set this bit yourself if you plan to pass the frame to
|
||||
// nsIPresShell::FrameNeedsReflow. Pass the right arguments instead.
|
||||
#define NS_FRAME_IS_DIRTY 0x00000400
|
||||
|
||||
// If this bit is set then the frame is unflowable.
|
||||
@ -200,6 +202,8 @@ typedef PRUint32 nsFrameState;
|
||||
// do as much work as it would if NS_FRAME_IS_DIRTY were set.
|
||||
// This bit is cleared by DidReflow after the required call to Reflow has
|
||||
// finished.
|
||||
// Do not set this bit yourself if you plan to pass the frame to
|
||||
// nsIPresShell::FrameNeedsReflow. Pass the right arguments instead.
|
||||
#define NS_FRAME_HAS_DIRTY_CHILDREN 0x00001000
|
||||
|
||||
// If this bit is set, the frame has an associated view
|
||||
@ -244,6 +248,11 @@ typedef PRUint32 nsFrameState;
|
||||
#define NS_STATE_IS_HORIZONTAL 0x00400000
|
||||
#define NS_STATE_IS_DIRECTION_NORMAL 0x80000000
|
||||
|
||||
// Helper macros
|
||||
#define NS_SUBTREE_DIRTY(_frame) \
|
||||
(((_frame)->GetStateBits() & \
|
||||
(NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN)) != 0)
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
enum nsSelectionAmount {
|
||||
|
@ -532,12 +532,10 @@ nsImageFrame::OnStartContainer(imgIRequest *aRequest, imgIContainer *aImage)
|
||||
// already gotten the initial reflow
|
||||
if (!(mState & IMAGE_SIZECONSTRAINED) && (mState & IMAGE_GOTINITIALREFLOW)) {
|
||||
nsIPresShell *presShell = presContext->GetPresShell();
|
||||
NS_ASSERTION(mParent, "No parent to pass the reflow request up to.");
|
||||
NS_ASSERTION(presShell, "No PresShell.");
|
||||
if (mParent && presShell) {
|
||||
AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
presShell->FrameNeedsReflow(NS_STATIC_CAST(nsIFrame*, this),
|
||||
nsIPresShell::eStyleChange);
|
||||
if (presShell) {
|
||||
presShell->FrameNeedsReflow(this, nsIPresShell::eStyleChange,
|
||||
NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
}
|
||||
|
||||
@ -640,11 +638,9 @@ nsImageFrame::OnStopDecode(imgIRequest *aRequest,
|
||||
|
||||
if (mState & IMAGE_GOTINITIALREFLOW) { // do nothing if we haven't gotten the initial reflow yet
|
||||
if (!(mState & IMAGE_SIZECONSTRAINED) && intrinsicSizeChanged) {
|
||||
NS_ASSERTION(mParent, "No parent to pass the reflow request up to.");
|
||||
if (mParent && presShell) {
|
||||
AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
presShell->FrameNeedsReflow(NS_STATIC_CAST(nsIFrame*, this),
|
||||
nsIPresShell::eStyleChange);
|
||||
if (presShell) {
|
||||
presShell->FrameNeedsReflow(this, nsIPresShell::eStyleChange,
|
||||
NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
} else {
|
||||
nsSize s = GetSize();
|
||||
@ -1577,10 +1573,9 @@ nsImageFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
}
|
||||
if (nsGkAtoms::alt == aAttribute)
|
||||
{
|
||||
AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
PresContext()->PresShell()->FrameNeedsReflow(
|
||||
NS_STATIC_CAST(nsIFrame*, this),
|
||||
nsIPresShell::eStyleChange);
|
||||
PresContext()->PresShell()->FrameNeedsReflow(this,
|
||||
nsIPresShell::eStyleChange,
|
||||
NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
|
@ -914,8 +914,7 @@ nsLineLayout::ReflowFrame(nsIFrame* aFrame,
|
||||
if (outOfFlowFrame) {
|
||||
nsPlaceholderFrame* placeholder = NS_STATIC_CAST(nsPlaceholderFrame*, aFrame);
|
||||
// XXXldb What is this test supposed to be?
|
||||
if (!(aFrame->GetStateBits() &
|
||||
(NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN))) {
|
||||
if (!NS_SUBTREE_DIRTY(aFrame)) {
|
||||
// incremental reflow of child
|
||||
placedFloat = InitFloat(placeholder, aReflowStatus);
|
||||
}
|
||||
|
@ -755,9 +755,8 @@ nsObjectFrame::InstantiatePlugin(nsIPluginHost* aPluginHost,
|
||||
|
||||
// XXX having to do this sucks. it'd be better to move the code from DidReflow
|
||||
// to FixupWindow or something.
|
||||
AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
PresContext()->GetPresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eStyleChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eStyleChange, NS_FRAME_IS_DIRTY);
|
||||
return rv;
|
||||
}
|
||||
|
||||
@ -1321,7 +1320,7 @@ nsObjectFrame::Instantiate(nsIChannel* aChannel, nsIStreamListener** aStreamList
|
||||
// XXX having to do this sucks. it'd be better to move the code from DidReflow
|
||||
// to FixupWindow.
|
||||
PresContext()->GetPresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eStyleChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eStyleChange, NS_FRAME_IS_DIRTY);
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
@ -1946,32 +1946,34 @@ nsTextFrame::CharacterDataChanged(nsPresContext* aPresContext,
|
||||
{
|
||||
nsIFrame* targetTextFrame = this;
|
||||
|
||||
PRBool markAllDirty = PR_TRUE;
|
||||
if (aAppend) {
|
||||
markAllDirty = PR_FALSE;
|
||||
nsTextFrame* frame = NS_STATIC_CAST(nsTextFrame*, GetLastInFlow());
|
||||
nsTextFrame* frame = NS_STATIC_CAST(nsTextFrame*, GetLastContinuation());
|
||||
frame->mState &= ~TEXT_WHITESPACE_FLAGS;
|
||||
frame->mState |= NS_FRAME_IS_DIRTY;
|
||||
targetTextFrame = frame;
|
||||
}
|
||||
|
||||
if (markAllDirty) {
|
||||
} else {
|
||||
// Mark this frame and all the next-in-flow frames as dirty and reset all
|
||||
// the content offsets and lengths to 0, since they no longer know what
|
||||
// content is ok to access.
|
||||
|
||||
// Don't set NS_FRAME_IS_DIRTY on |this|, since we call FrameNeedsReflow
|
||||
// below.
|
||||
nsTextFrame* textFrame = this;
|
||||
while (textFrame) {
|
||||
do {
|
||||
textFrame->mState &= ~TEXT_WHITESPACE_FLAGS;
|
||||
textFrame->mState |= NS_FRAME_IS_DIRTY;
|
||||
textFrame->mContentOffset = 0;
|
||||
textFrame->mContentLength = 0;
|
||||
textFrame = NS_STATIC_CAST(nsTextFrame*, textFrame->GetNextContinuation());
|
||||
}
|
||||
if (!textFrame) {
|
||||
break;
|
||||
}
|
||||
textFrame->mState |= NS_FRAME_IS_DIRTY;
|
||||
} while (1);
|
||||
}
|
||||
|
||||
// Ask the parent frame to reflow me.
|
||||
aPresContext->GetPresShell()->FrameNeedsReflow(targetTextFrame,
|
||||
nsIPresShell::eStyleChange);
|
||||
nsIPresShell::eStyleChange,
|
||||
NS_FRAME_IS_DIRTY);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
@ -3093,22 +3093,26 @@ nsTextFrame::CharacterDataChanged(nsPresContext* aPresContext,
|
||||
if (aAppend) {
|
||||
lastTextFrame = NS_STATIC_CAST(nsTextFrame*, GetLastContinuation());
|
||||
lastTextFrame->mState &= ~TEXT_WHITESPACE_FLAGS;
|
||||
lastTextFrame->mState |= NS_FRAME_IS_DIRTY;
|
||||
targetTextFrame = lastTextFrame;
|
||||
} else {
|
||||
// Mark this frame and all the continuation frames as dirty, and fix up
|
||||
// mContentLengths to be valid
|
||||
// Mark all the continuation frames as dirty, and fix up mContentLengths to
|
||||
// be valid.
|
||||
// Don't set NS_FRAME_IS_DIRTY on |this|, since we call FrameNeedsReflow
|
||||
// below.
|
||||
nsTextFrame* textFrame = this;
|
||||
PRInt32 newLength = nodeLength;
|
||||
do {
|
||||
textFrame->mState &= ~TEXT_WHITESPACE_FLAGS;
|
||||
textFrame->mState |= NS_FRAME_IS_DIRTY;
|
||||
// If the text node has shrunk, clip the frame contentlength as necessary
|
||||
textFrame->mContentLength = PR_MIN(mContentLength, newLength);
|
||||
newLength -= textFrame->mContentLength;
|
||||
lastTextFrame = textFrame;
|
||||
textFrame = NS_STATIC_CAST(nsTextFrame*, textFrame->GetNextContinuation());
|
||||
} while (textFrame);
|
||||
if (!textFrame) {
|
||||
break;
|
||||
}
|
||||
textFrame->mState |= NS_FRAME_IS_DIRTY;
|
||||
} while (1);
|
||||
targetTextFrame = this;
|
||||
}
|
||||
// Set the length of the last text frame in the chain (necessary if the node grew)
|
||||
@ -3116,7 +3120,8 @@ nsTextFrame::CharacterDataChanged(nsPresContext* aPresContext,
|
||||
|
||||
// Ask the parent frame to reflow me.
|
||||
aPresContext->GetPresShell()->FrameNeedsReflow(targetTextFrame,
|
||||
nsIPresShell::eStyleChange);
|
||||
nsIPresShell::eStyleChange,
|
||||
NS_FRAME_IS_DIRTY);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
@ -270,8 +270,7 @@ ViewportFrame::Reflow(nsPresContext* aPresContext,
|
||||
// targeted at our one-and-only principal child frame.
|
||||
if (aReflowState.ShouldReflowAllKids() ||
|
||||
aReflowState.mFlags.mVResize ||
|
||||
(mFrames.FirstChild()->GetStateBits() &
|
||||
(NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN))) {
|
||||
NS_SUBTREE_DIRTY(mFrames.FirstChild())) {
|
||||
// Reflow our one-and-only principal child frame
|
||||
nsIFrame* kidFrame = mFrames.FirstChild();
|
||||
nsHTMLReflowMetrics kidDesiredSize;
|
||||
|
@ -811,7 +811,8 @@ nsMathMLContainerFrame::RebuildAutomaticDataForChildren(nsIFrame* aParentFrame)
|
||||
}
|
||||
|
||||
/* static */ nsresult
|
||||
nsMathMLContainerFrame::ReLayoutChildren(nsIFrame* aParentFrame)
|
||||
nsMathMLContainerFrame::ReLayoutChildren(nsIFrame* aParentFrame,
|
||||
nsFrameState aBits)
|
||||
{
|
||||
if (!aParentFrame)
|
||||
return NS_OK;
|
||||
@ -843,7 +844,8 @@ nsMathMLContainerFrame::ReLayoutChildren(nsIFrame* aParentFrame)
|
||||
if (content->Tag() == nsGkAtoms::math)
|
||||
break;
|
||||
|
||||
// mark the frame dirty, and continue to climb up
|
||||
// mark the frame dirty, and continue to climb up. It's important that
|
||||
// we're NOT doing this to the frame we plan to pass to FrameNeedsReflow()
|
||||
frame->AddStateBits(NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
|
||||
frame = parent;
|
||||
@ -875,7 +877,7 @@ nsMathMLContainerFrame::ReLayoutChildren(nsIFrame* aParentFrame)
|
||||
return NS_OK;
|
||||
|
||||
return frame->PresContext()->PresShell()->
|
||||
FrameNeedsReflow(frame, nsIPresShell::eStyleChange);
|
||||
FrameNeedsReflow(frame, nsIPresShell::eStyleChange, aBits);
|
||||
}
|
||||
|
||||
// There are precise rules governing children of a MathML frame,
|
||||
@ -893,13 +895,16 @@ nsMathMLContainerFrame::ChildListChanged(PRInt32 aModType)
|
||||
nsIFrame* parent = mParent;
|
||||
nsEmbellishData embellishData;
|
||||
for ( ; parent; frame = parent, parent = parent->GetParent()) {
|
||||
frame->AddStateBits(NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
GetEmbellishDataFrom(parent, embellishData);
|
||||
if (embellishData.coreFrame != mEmbellishData.coreFrame)
|
||||
break;
|
||||
|
||||
// Important: do not do this to the frame we plan to pass to
|
||||
// ReLayoutChildren
|
||||
frame->AddStateBits(NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
}
|
||||
}
|
||||
return ReLayoutChildren(frame);
|
||||
return ReLayoutChildren(frame, NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
@ -957,7 +962,8 @@ nsMathMLContainerFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
// we can't check all of them here, play safe by requesting a reflow.
|
||||
// XXXldb This should only do work for attributes that cause changes!
|
||||
return PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eStyleChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eStyleChange,
|
||||
NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
|
||||
nsresult
|
||||
|
@ -178,10 +178,10 @@ public:
|
||||
// 2. If the MathML frame class has cached automatic data that depends on
|
||||
// the attribute:
|
||||
// 2a. If the automatic data to update resides only within the descendants,
|
||||
// we just re-layout them using ReLayoutChildren(aPresContext, this);
|
||||
// we just re-layout them using ReLayoutChildren(this);
|
||||
// (e.g., this happens with <ms>).
|
||||
// 2b. If the automatic data to update affects us in some way, we ask our parent
|
||||
// to re-layout its children using ReLayoutChildren(aPresContext, mParent);
|
||||
// to re-layout its children using ReLayoutChildren(mParent);
|
||||
// Therefore, there is an overhead here in that our siblings are re-laid
|
||||
// too (e.g., this happens with <mstyle>, <munder>, <mover>, <munderover>).
|
||||
NS_IMETHOD
|
||||
@ -301,8 +301,10 @@ public:
|
||||
// method re-builds the automatic data in the children -- not in the parent
|
||||
// frame itself (except for those particular operations that the parent frame
|
||||
// may do do its TransmitAutomaticData()). @see RebuildAutomaticDataForChildren
|
||||
//
|
||||
// aBits are the bits to pass to FrameNeedsReflow() when we call it.
|
||||
static nsresult
|
||||
ReLayoutChildren(nsIFrame* aParentFrame);
|
||||
ReLayoutChildren(nsIFrame* aParentFrame, nsFrameState aBits);
|
||||
|
||||
protected:
|
||||
virtual PRIntn GetSkipSides() const { return 0; }
|
||||
@ -361,7 +363,8 @@ public:
|
||||
{
|
||||
NS_ASSERTION(!aListName, "internal error");
|
||||
nsresult rv = nsBlockFrame::AppendFrames(aListName, aFrameList);
|
||||
nsMathMLContainerFrame::ReLayoutChildren(this);
|
||||
nsMathMLContainerFrame::ReLayoutChildren(this,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
return rv;
|
||||
}
|
||||
|
||||
@ -372,7 +375,8 @@ public:
|
||||
{
|
||||
NS_ASSERTION(!aListName, "internal error");
|
||||
nsresult rv = nsBlockFrame::InsertFrames(aListName, aPrevFrame, aFrameList);
|
||||
nsMathMLContainerFrame::ReLayoutChildren(this);
|
||||
nsMathMLContainerFrame::ReLayoutChildren(this,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
return rv;
|
||||
}
|
||||
|
||||
@ -382,7 +386,8 @@ public:
|
||||
{
|
||||
NS_ASSERTION(!aListName, "internal error");
|
||||
nsresult rv = nsBlockFrame::RemoveFrame(aListName, aOldFrame);
|
||||
nsMathMLContainerFrame::ReLayoutChildren(this);
|
||||
nsMathMLContainerFrame::ReLayoutChildren(this,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
return rv;
|
||||
}
|
||||
|
||||
@ -444,7 +449,8 @@ public:
|
||||
{
|
||||
NS_ASSERTION(!aListName, "internal error");
|
||||
nsresult rv = nsInlineFrame::AppendFrames(aListName, aFrameList);
|
||||
nsMathMLContainerFrame::ReLayoutChildren(this);
|
||||
nsMathMLContainerFrame::ReLayoutChildren(this,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
return rv;
|
||||
}
|
||||
|
||||
@ -455,7 +461,8 @@ public:
|
||||
{
|
||||
NS_ASSERTION(!aListName, "internal error");
|
||||
nsresult rv = nsInlineFrame::InsertFrames(aListName, aPrevFrame, aFrameList);
|
||||
nsMathMLContainerFrame::ReLayoutChildren(this);
|
||||
nsMathMLContainerFrame::ReLayoutChildren(this,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
return rv;
|
||||
}
|
||||
|
||||
@ -465,7 +472,8 @@ public:
|
||||
{
|
||||
NS_ASSERTION(!aListName, "internal error");
|
||||
nsresult rv = nsInlineFrame::RemoveFrame(aListName, aOldFrame);
|
||||
nsMathMLContainerFrame::ReLayoutChildren(this);
|
||||
nsMathMLContainerFrame::ReLayoutChildren(this,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
@ -389,9 +390,9 @@ nsMathMLmactionFrame::MouseClick(nsIDOMEvent* aMouseEvent)
|
||||
mContent->SetAttr(kNameSpaceID_None, nsGkAtoms::selection_, value, notify);
|
||||
|
||||
// Now trigger a content-changed reflow...
|
||||
mSelectedFrame->AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(mSelectedFrame, nsIPresShell::eTreeChange);
|
||||
FrameNeedsReflow(mSelectedFrame, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
}
|
||||
else if (NS_MATHML_ACTION_TYPE_RESTYLE == mActionType) {
|
||||
@ -405,9 +406,9 @@ nsMathMLmactionFrame::MouseClick(nsIDOMEvent* aMouseEvent)
|
||||
node->SetAttribute(NS_LITERAL_STRING("actiontype"), mRestyle);
|
||||
|
||||
// Trigger a style change reflow
|
||||
mSelectedFrame->AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(mSelectedFrame, nsIPresShell::eStyleChange);
|
||||
FrameNeedsReflow(mSelectedFrame, nsIPresShell::eStyleChange,
|
||||
NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1000,7 +1000,7 @@ nsMathMLmoFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
} while (embellishData.coreFrame == this);
|
||||
|
||||
// we have automatic data to update in the children of the target frame
|
||||
return ReLayoutChildren(target);
|
||||
return ReLayoutChildren(target, NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
|
||||
return nsMathMLTokenFrame::
|
||||
|
@ -74,7 +74,7 @@ nsMathMLmoverFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
if (nsGkAtoms::accent_ == aAttribute) {
|
||||
// When we have automatic data to update within ourselves, we ask our
|
||||
// parent to re-layout its children
|
||||
return ReLayoutChildren(mParent);
|
||||
return ReLayoutChildren(mParent, NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
|
||||
return nsMathMLContainerFrame::
|
||||
|
@ -168,5 +168,5 @@ nsMathMLmstyleFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
// them in our subtree. However, our siblings will be re-laid too. We used
|
||||
// to have a more speedier but more verbose alternative that didn't re-layout
|
||||
// our siblings. See bug 114909 - attachment 67668.
|
||||
return ReLayoutChildren(mParent);
|
||||
return ReLayoutChildren(mParent, NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
|
@ -448,7 +448,7 @@ nsMathMLmtableOuterFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
// align - just need to issue a dirty (resize) reflow command
|
||||
if (aAttribute == nsGkAtoms::align) {
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eResize);
|
||||
FrameNeedsReflow(this, nsIPresShell::eResize, NS_FRAME_IS_DIRTY);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
@ -458,8 +458,10 @@ nsMathMLmtableOuterFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
if (aAttribute == nsGkAtoms::displaystyle_) {
|
||||
nsMathMLContainerFrame::RebuildAutomaticDataForChildren(mParent);
|
||||
nsMathMLContainerFrame::PropagateScriptStyleFor(tableFrame, mPresentationData.scriptLevel);
|
||||
// XXXbz I have no idea why this is reflowing the _parent_ instead of
|
||||
// us...
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(mParent, nsIPresShell::eStyleChange);
|
||||
FrameNeedsReflow(mParent, nsIPresShell::eStyleChange, NS_FRAME_IS_DIRTY);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
@ -74,7 +74,7 @@ nsMathMLmunderFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
if (nsGkAtoms::accentunder_ == aAttribute) {
|
||||
// When we have automatic data to update within ourselves, we ask our
|
||||
// parent to re-layout its children
|
||||
return ReLayoutChildren(mParent);
|
||||
return ReLayoutChildren(mParent, NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
|
||||
return nsMathMLContainerFrame::
|
||||
|
@ -75,7 +75,7 @@ nsMathMLmunderoverFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsGkAtoms::accentunder_ == aAttribute) {
|
||||
// When we have automatic data to update within ourselves, we ask our
|
||||
// parent to re-layout its children
|
||||
return ReLayoutChildren(mParent);
|
||||
return ReLayoutChildren(mParent, NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
|
||||
return nsMathMLContainerFrame::
|
||||
|
@ -494,8 +494,7 @@ void nsSVGForeignObjectFrame::RequestReflow(nsIPresShell::IntrinsicDirty aType)
|
||||
if (!kid)
|
||||
return;
|
||||
|
||||
kid->AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
PresContext()->PresShell()->FrameNeedsReflow(kid, aType);
|
||||
PresContext()->PresShell()->FrameNeedsReflow(kid, aType, NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
|
||||
void nsSVGForeignObjectFrame::UpdateGraphic()
|
||||
|
@ -380,9 +380,8 @@ nsSVGOuterSVGFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
if (aNameSpaceID == kNameSpaceID_None &&
|
||||
!(GetStateBits() & NS_FRAME_FIRST_REFLOW) &&
|
||||
(aAttribute == nsGkAtoms::width || aAttribute == nsGkAtoms::height)) {
|
||||
AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eStyleChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eStyleChange, NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
@ -637,7 +636,8 @@ void nsSVGOuterSVGFrame::InitiateReflow()
|
||||
mNeedsReflow = PR_FALSE;
|
||||
|
||||
nsIPresShell* presShell = PresContext()->PresShell();
|
||||
presShell->FrameNeedsReflow(this, nsIPresShell::eStyleChange);
|
||||
presShell->FrameNeedsReflow(this, nsIPresShell::eStyleChange,
|
||||
NS_FRAME_IS_DIRTY);
|
||||
// XXXbz why is this synchronously flushing reflows, exactly? If it
|
||||
// needs to, why is it not using the presshell's reflow batching
|
||||
// instead of hacking its own?
|
||||
|
@ -269,9 +269,9 @@ nsTableColGroupFrame::InsertColsReflow(PRInt32 aColIndex,
|
||||
if (!tableFrame)
|
||||
return;
|
||||
|
||||
tableFrame->AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
PresContext()->PresShell()->FrameNeedsReflow(tableFrame,
|
||||
nsIPresShell::eTreeChange);
|
||||
nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
}
|
||||
|
||||
void
|
||||
@ -301,9 +301,9 @@ nsTableColGroupFrame::RemoveChild(nsTableColFrame& aChild,
|
||||
if (!tableFrame)
|
||||
return;
|
||||
|
||||
tableFrame->AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
PresContext()->PresShell()->FrameNeedsReflow(tableFrame,
|
||||
nsIPresShell::eTreeChange);
|
||||
nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
@ -325,9 +325,9 @@ nsTableColGroupFrame::RemoveFrame(nsIAtom* aListName,
|
||||
|
||||
tableFrame->RemoveCol(this, colIndex, PR_TRUE, PR_TRUE);
|
||||
|
||||
tableFrame->AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
PresContext()->PresShell()->FrameNeedsReflow(tableFrame,
|
||||
nsIPresShell::eTreeChange);
|
||||
nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
}
|
||||
else {
|
||||
mFrames.DestroyFrame(aOldFrame);
|
||||
|
@ -412,11 +412,10 @@ void nsTableFrame::AttributeChangedFor(nsIFrame* aFrame,
|
||||
cells.AppendElement(cellFrame);
|
||||
InsertCells(cells, rowIndex, colIndex - 1);
|
||||
|
||||
AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
// XXX Should this use eStyleChange? It currently doesn't need
|
||||
// to, but it might given more optimization.
|
||||
PresContext()->PresShell()->FrameNeedsReflow(this,
|
||||
nsIPresShell::eTreeChange);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange, NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1871,7 +1870,7 @@ NS_METHOD nsTableFrame::Reflow(nsPresContext* aPresContext,
|
||||
// reflows with a constrained width.
|
||||
PRBool needToInitiateSpecialReflow =
|
||||
!!(GetStateBits() & NS_FRAME_CONTAINS_RELATIVE_HEIGHT);
|
||||
if ((GetStateBits() & (NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN)) ||
|
||||
if (NS_SUBTREE_DIRTY(this) ||
|
||||
aReflowState.ShouldReflowAllKids() ||
|
||||
IsGeometryDirty() ||
|
||||
needToInitiateSpecialReflow) {
|
||||
@ -2258,9 +2257,8 @@ nsTableFrame::AppendFrames(nsIAtom* aListName,
|
||||
printf("=== TableFrame::AppendFrames\n");
|
||||
Dump(PR_TRUE, PR_TRUE, PR_TRUE);
|
||||
#endif
|
||||
AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
PresContext()->PresShell()->FrameNeedsReflow(this,
|
||||
nsIPresShell::eTreeChange);
|
||||
PresContext()->PresShell()->FrameNeedsReflow(this, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
SetGeometryDirty();
|
||||
|
||||
return NS_OK;
|
||||
@ -2366,9 +2364,8 @@ nsTableFrame::InsertFrames(nsIAtom* aListName,
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
PresContext()->PresShell()->FrameNeedsReflow(this,
|
||||
nsIPresShell::eTreeChange);
|
||||
PresContext()->PresShell()->FrameNeedsReflow(this, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
SetGeometryDirty();
|
||||
#ifdef DEBUG_TABLE_CELLMAP
|
||||
printf("=== TableFrame::InsertFrames\n");
|
||||
@ -2446,9 +2443,8 @@ nsTableFrame::RemoveFrame(nsIAtom* aListName,
|
||||
nsRect damageArea(0, 0, PR_MAX(1, GetColCount()), PR_MAX(1, GetRowCount()));
|
||||
SetBCDamageArea(damageArea);
|
||||
}
|
||||
AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
PresContext()->PresShell()->FrameNeedsReflow(this,
|
||||
nsIPresShell::eTreeChange);
|
||||
PresContext()->PresShell()->FrameNeedsReflow(this, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
SetGeometryDirty();
|
||||
#ifdef DEBUG_TABLE_CELLMAP
|
||||
printf("=== TableFrame::RemoveFrame\n");
|
||||
@ -2737,8 +2733,7 @@ nsTableFrame::ReflowChildren(nsTableReflowState& aReflowState,
|
||||
// Get the frame state bits
|
||||
// See if we should only reflow the dirty child frames
|
||||
if (reflowAllKids ||
|
||||
(kidFrame->GetStateBits() & (NS_FRAME_IS_DIRTY |
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN)) ||
|
||||
NS_SUBTREE_DIRTY(kidFrame) ||
|
||||
(aReflowState.reflowState.mFlags.mSpecialHeightReflow &&
|
||||
(isPaginated || (kidFrame->GetStateBits() &
|
||||
NS_FRAME_CONTAINS_RELATIVE_HEIGHT)))) {
|
||||
|
@ -284,10 +284,9 @@ nsTableOuterFrame::AppendFrames(nsIAtom* aListName,
|
||||
|
||||
// Reflow the new caption frame. It's already marked dirty, so
|
||||
// just tell the pres shell.
|
||||
AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange);
|
||||
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
}
|
||||
else {
|
||||
NS_PRECONDITION(PR_FALSE, "unexpected child list");
|
||||
@ -338,9 +337,9 @@ nsTableOuterFrame::RemoveFrame(nsIAtom* aListName,
|
||||
mCaptionFrames.DestroyFrame(aOldFrame);
|
||||
mCaptionFrame = mCaptionFrames.FirstChild();
|
||||
|
||||
AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN); // also means child removed
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN); // also means child removed
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
@ -1187,10 +1186,9 @@ NS_METHOD nsTableOuterFrame::Reflow(nsPresContext* aPresContext,
|
||||
MoveOverflowToChildList(aPresContext);
|
||||
}
|
||||
|
||||
PRBool reflowCaption = mCaptionFrame && (reflowAllKids || (mCaptionFrame->
|
||||
GetStateBits() & (NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN)));
|
||||
PRBool reflowInner = reflowAllKids || (mInnerTableFrame->
|
||||
GetStateBits() & (NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN));
|
||||
PRBool reflowCaption =
|
||||
mCaptionFrame && (reflowAllKids || NS_SUBTREE_DIRTY(mCaptionFrame));
|
||||
PRBool reflowInner = reflowAllKids || NS_SUBTREE_DIRTY(mInnerTableFrame);
|
||||
|
||||
// First reflow the caption. nsHTMLReflowState takes care of making
|
||||
// side captions small.
|
||||
|
@ -196,9 +196,8 @@ nsTableRowFrame::AppendFrames(nsIAtom* aListName,
|
||||
}
|
||||
}
|
||||
|
||||
AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
PresContext()->PresShell()->FrameNeedsReflow(this,
|
||||
nsIPresShell::eTreeChange);
|
||||
PresContext()->PresShell()->FrameNeedsReflow(this, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
tableFrame->SetGeometryDirty();
|
||||
|
||||
return NS_OK;
|
||||
@ -237,9 +236,8 @@ nsTableRowFrame::InsertFrames(nsIAtom* aListName,
|
||||
// Insert the frames in the frame list
|
||||
mFrames.InsertFrames(nsnull, aPrevFrame, aFrameList);
|
||||
|
||||
AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
PresContext()->PresShell()->FrameNeedsReflow(this,
|
||||
nsIPresShell::eTreeChange);
|
||||
PresContext()->PresShell()->FrameNeedsReflow(this, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
tableFrame->SetGeometryDirty();
|
||||
|
||||
return NS_OK;
|
||||
@ -263,9 +261,9 @@ nsTableRowFrame::RemoveFrame(nsIAtom* aListName,
|
||||
// Remove the frame and destroy it
|
||||
mFrames.DestroyFrame(aOldFrame);
|
||||
|
||||
AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
PresContext()->PresShell()->FrameNeedsReflow(this,
|
||||
nsIPresShell::eTreeChange);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
tableFrame->SetGeometryDirty();
|
||||
}
|
||||
else {
|
||||
@ -823,8 +821,7 @@ nsTableRowFrame::ReflowChildren(nsPresContext* aPresContext,
|
||||
PRBool doReflowChild = PR_TRUE;
|
||||
if (!aReflowState.ShouldReflowAllKids() &&
|
||||
!aTableFrame.IsGeometryDirty() &&
|
||||
!(kidFrame->GetStateBits() &
|
||||
(NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN))) {
|
||||
!NS_SUBTREE_DIRTY(kidFrame)) {
|
||||
if (!aReflowState.mFlags.mSpecialHeightReflow)
|
||||
doReflowChild = PR_FALSE;
|
||||
}
|
||||
@ -875,8 +872,7 @@ nsTableRowFrame::ReflowChildren(nsPresContext* aPresContext,
|
||||
(cellDesiredSize.width > cellFrame->GetPriorAvailWidth()) ||
|
||||
(GetStateBits() & NS_FRAME_IS_DIRTY) ||
|
||||
isPaginated ||
|
||||
(cellFrame->GetStateBits() &
|
||||
(NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN)) ||
|
||||
NS_SUBTREE_DIRTY(cellFrame) ||
|
||||
// See if it needs a special reflow, or if it had one that we need to undo.
|
||||
(cellFrame->GetStateBits() & NS_FRAME_CONTAINS_RELATIVE_HEIGHT) ||
|
||||
HasPctHeight()) {
|
||||
|
@ -384,8 +384,7 @@ nsTableRowGroupFrame::ReflowChildren(nsPresContext* aPresContext,
|
||||
|
||||
// Reflow the row frame
|
||||
if (reflowAllKids ||
|
||||
(kidFrame->GetStateBits() &
|
||||
(NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN)) ||
|
||||
NS_SUBTREE_DIRTY(kidFrame) ||
|
||||
(aReflowState.reflowState.mFlags.mSpecialHeightReflow &&
|
||||
(isPaginated || (kidFrame->GetStateBits() &
|
||||
NS_FRAME_CONTAINS_RELATIVE_HEIGHT)))) {
|
||||
@ -1342,9 +1341,9 @@ nsTableRowGroupFrame::AppendFrames(nsIAtom* aListName,
|
||||
nsTableFrame* tableFrame = nsTableFrame::GetTableFrame(this);
|
||||
if (tableFrame) {
|
||||
tableFrame->AppendRows(*this, rowIndex, rows);
|
||||
AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
PresContext()->PresShell()->FrameNeedsReflow(this,
|
||||
nsIPresShell::eTreeChange);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
tableFrame->SetGeometryDirty();
|
||||
}
|
||||
}
|
||||
@ -1392,9 +1391,9 @@ nsTableRowGroupFrame::InsertFrames(nsIAtom* aListName,
|
||||
PRInt32 rowIndex = (prevRow) ? prevRow->GetRowIndex() + 1 : startRowIndex;
|
||||
tableFrame->InsertRows(*this, rows, rowIndex, PR_TRUE);
|
||||
|
||||
AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
PresContext()->PresShell()->FrameNeedsReflow(this,
|
||||
nsIPresShell::eTreeChange);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
tableFrame->SetGeometryDirty();
|
||||
}
|
||||
return NS_OK;
|
||||
@ -1414,9 +1413,9 @@ nsTableRowGroupFrame::RemoveFrame(nsIAtom* aListName,
|
||||
// remove the rows from the table (and flag a rebalance)
|
||||
tableFrame->RemoveRows((nsTableRowFrame &)*aOldFrame, 1, PR_TRUE);
|
||||
|
||||
AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
PresContext()->PresShell()->FrameNeedsReflow(this,
|
||||
nsIPresShell::eTreeChange);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
tableFrame->SetGeometryDirty();
|
||||
}
|
||||
}
|
||||
|
@ -92,8 +92,8 @@ nsGridRow::MarkDirty(nsBoxLayoutState& aState)
|
||||
mBottom = -1;
|
||||
|
||||
if (mBox) {
|
||||
mBox->AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
aState.PresShell()->FrameNeedsReflow(mBox, nsIPresShell::eTreeChange);
|
||||
aState.PresShell()->FrameNeedsReflow(mBox, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -187,10 +187,10 @@ nsGridRowGroupLayout::DirtyRows(nsIBox* aBox, nsBoxLayoutState& aState)
|
||||
{
|
||||
if (aBox) {
|
||||
// mark us dirty
|
||||
aBox->AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
// XXXldb We probably don't want to walk up the ancestor chain
|
||||
// calling MarkIntrinsicWidthsDirty for every row group.
|
||||
aState.PresShell()->FrameNeedsReflow(aBox, nsIPresShell::eTreeChange);
|
||||
aState.PresShell()->FrameNeedsReflow(aBox, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_IS_DIRTY);
|
||||
nsIBox* child = aBox->GetChildBox();
|
||||
|
||||
while(child) {
|
||||
|
@ -315,10 +315,10 @@ nsGridRowLeafLayout::DirtyRows(nsIBox* aBox, nsBoxLayoutState& aState)
|
||||
{
|
||||
if (aBox) {
|
||||
// mark us dirty
|
||||
aBox->AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
// XXXldb We probably don't want to walk up the ancestor chain
|
||||
// calling MarkIntrinsicWidthsDirty for every row.
|
||||
aState.PresShell()->FrameNeedsReflow(aBox, nsIPresShell::eTreeChange);
|
||||
aState.PresShell()->FrameNeedsReflow(aBox, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1037,9 +1037,9 @@ nsBoxFrame::RemoveFrame(nsIAtom* aListName,
|
||||
aOldFrame->Destroy();
|
||||
|
||||
// mark us dirty and generate a reflow command
|
||||
mState |= NS_FRAME_HAS_DIRTY_CHILDREN;
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
@ -1066,9 +1066,9 @@ nsBoxFrame::InsertFrames(nsIAtom* aListName,
|
||||
SetDebugOnChildList(state, mFrames.FirstChild(), PR_TRUE);
|
||||
#endif
|
||||
|
||||
mState |= NS_FRAME_HAS_DIRTY_CHILDREN;
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
@ -1093,10 +1093,11 @@ nsBoxFrame::AppendFrames(nsIAtom* aListName,
|
||||
SetDebugOnChildList(state, mFrames.FirstChild(), PR_TRUE);
|
||||
#endif
|
||||
|
||||
// XXXbz why is this NS_FRAME_FIRST_REFLOW check here?
|
||||
if (!(GetStateBits() & NS_FRAME_FIRST_REFLOW)) {
|
||||
mState |= NS_FRAME_HAS_DIRTY_CHILDREN;
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
@ -1209,9 +1210,8 @@ nsBoxFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
UpdateMouseThrough();
|
||||
}
|
||||
|
||||
mState |= NS_FRAME_IS_DIRTY;
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eStyleChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eStyleChange, NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
else if (aAttribute == nsGkAtoms::ordinal) {
|
||||
nsBoxLayoutState state(PresContext());
|
||||
@ -1228,10 +1228,10 @@ nsBoxFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
// case our ordinal doesn't matter anyway, so that's ok.
|
||||
if (parent) {
|
||||
parent->RelayoutChildAtOrdinal(state, frameToMove);
|
||||
mState |= NS_FRAME_IS_DIRTY;
|
||||
// XXXldb Should this instead be a tree change on the child or parent?
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(frameToMove, nsIPresShell::eStyleChange);
|
||||
FrameNeedsReflow(parent, nsIPresShell::eStyleChange,
|
||||
NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
}
|
||||
// If the accesskey changed, register for the new value
|
||||
@ -1408,7 +1408,7 @@ nsBoxFrame::PaintXULDebugBackground(nsIRenderingContext& aRenderingContext,
|
||||
|
||||
// if we have dirty children or we are dirty
|
||||
// place a green border around us.
|
||||
if (GetStateBits & (NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN)) {
|
||||
if (NS_SUBTREE_DIRTY(this)) {
|
||||
nsRect dirtyr(inner);
|
||||
aRenderingContext.SetColor(NS_RGB(0,255,0));
|
||||
aRenderingContext.DrawRect(dirtyr);
|
||||
@ -2053,7 +2053,7 @@ nsBoxFrame::LayoutChildAt(nsBoxLayoutState& aState, nsIBox* aBox, const nsRect&
|
||||
nsRect oldRect(aBox->GetRect());
|
||||
aBox->SetBounds(aState, aRect);
|
||||
|
||||
PRBool layout = (aBox->GetStateBits() & (NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN)) != 0;
|
||||
PRBool layout = NS_SUBTREE_DIRTY(aBox);
|
||||
|
||||
if (layout || (oldRect.width != aRect.width || oldRect.height != aRect.height)) {
|
||||
return aBox->Layout(aState);
|
||||
|
@ -172,9 +172,8 @@ nsImageBoxFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
|
||||
if (aAttribute == nsGkAtoms::src) {
|
||||
UpdateImage();
|
||||
AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eStyleChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eStyleChange, NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
else if (aAttribute == nsGkAtoms::validate)
|
||||
UpdateLoadFlags();
|
||||
@ -508,9 +507,8 @@ NS_IMETHODIMP nsImageBoxFrame::OnStartContainer(imgIRequest *request,
|
||||
nsPresContext::CSSPixelsToAppUnits(h));
|
||||
|
||||
if (!(GetStateBits() & NS_FRAME_FIRST_REFLOW)) {
|
||||
AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eStyleChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eStyleChange, NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
@ -535,9 +533,8 @@ NS_IMETHODIMP nsImageBoxFrame::OnStopDecode(imgIRequest *request,
|
||||
else {
|
||||
// Fire an onerror DOM event.
|
||||
mIntrinsicSize.SizeTo(0, 0);
|
||||
AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eStyleChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eStyleChange, NS_FRAME_IS_DIRTY);
|
||||
FireImageDOMEvent(mContent, NS_LOAD_ERROR);
|
||||
}
|
||||
|
||||
|
@ -316,9 +316,8 @@ nsListBoxBodyFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
value.AppendInt(rowHeight*count);
|
||||
mContent->SetAttr(kNameSpaceID_None, nsGkAtoms::minheight, value, PR_FALSE);
|
||||
|
||||
AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eStyleChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eStyleChange, NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -501,9 +500,8 @@ nsListBoxBodyFrame::ReflowFinished()
|
||||
// if the row height changed then mark everything as a style change.
|
||||
// That will dirty the entire listbox
|
||||
if (mRowHeightWasSet) {
|
||||
AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eStyleChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eStyleChange, NS_FRAME_IS_DIRTY);
|
||||
PRInt32 pos = mCurrentIndex * mRowHeight;
|
||||
if (mYPosition != pos)
|
||||
mAdjustScroll = PR_TRUE;
|
||||
@ -930,9 +928,8 @@ nsListBoxBodyFrame::InternalPositionChanged(PRBool aUp, PRInt32 aDelta)
|
||||
|
||||
mYPosition = mCurrentIndex*mRowHeight;
|
||||
mScrolling = PR_TRUE;
|
||||
AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eResize);
|
||||
FrameNeedsReflow(this, nsIPresShell::eResize, NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
// Flush calls CreateRows
|
||||
// XXXbz there has to be a better way to do this than flushing!
|
||||
presContext->PresShell()->FlushPendingNotifications(Flush_OnlyReflow);
|
||||
@ -1060,9 +1057,9 @@ nsListBoxBodyFrame::DestroyRows(PRInt32& aRowsToLose)
|
||||
mTopFrame = childFrame = nextFrame;
|
||||
}
|
||||
|
||||
AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
}
|
||||
|
||||
void
|
||||
@ -1083,9 +1080,9 @@ nsListBoxBodyFrame::ReverseDestroyRows(PRInt32& aRowsToLose)
|
||||
mBottomFrame = childFrame = prevFrame;
|
||||
}
|
||||
|
||||
AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
}
|
||||
|
||||
//
|
||||
@ -1242,9 +1239,9 @@ nsListBoxBodyFrame::ContinueReflow(nscoord height)
|
||||
currFrame = nextFrame;
|
||||
}
|
||||
|
||||
AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
}
|
||||
return PR_FALSE;
|
||||
}
|
||||
@ -1260,9 +1257,9 @@ nsListBoxBodyFrame::ListBoxAppendFrames(nsIFrame* aFrameList)
|
||||
mFrames.AppendFrames(nsnull, aFrameList);
|
||||
if (mLayoutManager)
|
||||
mLayoutManager->ChildrenAppended(this, state, aFrameList);
|
||||
AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
@ -1275,9 +1272,9 @@ nsListBoxBodyFrame::ListBoxInsertFrames(nsIFrame* aPrevFrame, nsIFrame* aFrameLi
|
||||
mFrames.InsertFrames(nsnull, aPrevFrame, aFrameList);
|
||||
if (mLayoutManager)
|
||||
mLayoutManager->ChildrenInserted(this, state, aPrevFrame, aFrameList);
|
||||
AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
@ -1317,9 +1314,9 @@ nsListBoxBodyFrame::OnContentInserted(nsPresContext* aPresContext, nsIContent* a
|
||||
}
|
||||
|
||||
CreateRows();
|
||||
AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
}
|
||||
|
||||
//
|
||||
@ -1390,9 +1387,9 @@ nsListBoxBodyFrame::OnContentRemoved(nsPresContext* aPresContext, nsIFrame* aChi
|
||||
RemoveChildFrame(state, aChildFrame);
|
||||
}
|
||||
|
||||
AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -205,7 +205,7 @@ nsListBoxLayout::LayoutInternal(nsIBox* aBox, nsBoxLayoutState& aState)
|
||||
// relayout if we must or we are dirty or some of our children are dirty
|
||||
// or the client area is wider than us
|
||||
// XXXldb There should probably be a resize check here too!
|
||||
if ((box->GetStateBits() & (NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN)) || childRect.width < clientRect.width) {
|
||||
if (NS_SUBTREE_DIRTY(box) || childRect.width < clientRect.width) {
|
||||
childRect.x = 0;
|
||||
childRect.y = yOffset;
|
||||
childRect.width = clientRect.width;
|
||||
|
@ -882,9 +882,9 @@ nsMenuFrame::OpenMenuInternal(PRBool aActivateFlag)
|
||||
// active dimensions.
|
||||
if (!wasOpen)
|
||||
{
|
||||
menuPopup->AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
presContext->PresShell()->
|
||||
FrameNeedsReflow(menuPopup, nsIPresShell::eStyleChange);
|
||||
FrameNeedsReflow(menuPopup, nsIPresShell::eStyleChange,
|
||||
NS_FRAME_IS_DIRTY);
|
||||
presContext->PresShell()->FlushPendingNotifications(Flush_OnlyReflow);
|
||||
}
|
||||
|
||||
@ -903,9 +903,9 @@ nsMenuFrame::OpenMenuInternal(PRBool aActivateFlag)
|
||||
// if the height is different then reflow. It might need scrollbars force a reflow
|
||||
if (curRect.height != newHeight || mLastPref.height != newHeight)
|
||||
{
|
||||
menuPopup->AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
presContext->PresShell()->
|
||||
FrameNeedsReflow(menuPopup, nsIPresShell::eStyleChange);
|
||||
FrameNeedsReflow(menuPopup, nsIPresShell::eStyleChange,
|
||||
NS_FRAME_IS_DIRTY);
|
||||
presContext->PresShell()->FlushPendingNotifications(Flush_OnlyReflow);
|
||||
}
|
||||
|
||||
@ -1875,9 +1875,9 @@ nsMenuFrame::RemoveFrame(nsIAtom* aListName,
|
||||
if (mPopupFrames.ContainsFrame(aOldFrame)) {
|
||||
// Go ahead and remove this frame.
|
||||
mPopupFrames.DestroyFrame(aOldFrame);
|
||||
AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
rv = NS_OK;
|
||||
} else {
|
||||
rv = nsBoxFrame::RemoveFrame(aListName, aOldFrame);
|
||||
@ -1902,9 +1902,9 @@ nsMenuFrame::InsertFrames(nsIAtom* aListName,
|
||||
nsBoxLayoutState state(GetPresContext());
|
||||
SetDebug(state, aFrameList, mState & NS_STATE_CURRENTLY_IN_DEBUG);
|
||||
#endif
|
||||
AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
rv = NS_OK;
|
||||
} else {
|
||||
rv = nsBoxFrame::InsertFrames(aListName, aPrevFrame, aFrameList);
|
||||
@ -1931,9 +1931,9 @@ nsMenuFrame::AppendFrames(nsIAtom* aListName,
|
||||
nsBoxLayoutState state(GetPresContext());
|
||||
SetDebug(state, aFrameList, mState & NS_STATE_CURRENTLY_IN_DEBUG);
|
||||
#endif
|
||||
AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
rv = NS_OK;
|
||||
} else {
|
||||
rv = nsBoxFrame::AppendFrames(aListName, aFrameList);
|
||||
|
@ -580,8 +580,9 @@ nsPopupSetFrame::OpenPopup(nsPopupFrameList* aEntry, PRBool aActivateFlag)
|
||||
}
|
||||
|
||||
if (weakFrame.IsAlive()) {
|
||||
AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
PresContext()->PresShell()->FrameNeedsReflow(this, nsIPresShell::eTreeChange);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange,
|
||||
NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -118,9 +118,8 @@ nsProgressMeterFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
remainderContent->SetAttr(kNameSpaceID_None, nsGkAtoms::flex, rightFlex, PR_TRUE);
|
||||
|
||||
if (weakFrame.IsAlive()) {
|
||||
AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eTreeChange, NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
}
|
||||
return NS_OK;
|
||||
|
@ -266,9 +266,8 @@ nsSliderFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
aAttribute == nsGkAtoms::pageincrement ||
|
||||
aAttribute == nsGkAtoms::increment) {
|
||||
|
||||
AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eStyleChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eStyleChange, NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
|
||||
return rv;
|
||||
|
@ -608,8 +608,8 @@ nsSplitterFrameInner::MouseDrag(nsPresContext* aPresContext, nsGUIEvent* aEvent)
|
||||
/*
|
||||
nsIPresShell *shell = aPresContext->PresShell();
|
||||
|
||||
mOuter->mState |= NS_FRAME_IS_DIRTY;
|
||||
shell->FrameNeedsReflow(mOuter, nsIPresShell::eStyleChange);
|
||||
shell->FrameNeedsReflow(mOuter, nsIPresShell::eStyleChange,
|
||||
NS_FRAME_IS_DIRTY);
|
||||
*/
|
||||
mDidDrag = PR_TRUE;
|
||||
}
|
||||
@ -1002,9 +1002,8 @@ nsSplitterFrameInner::AdjustChildren(nsPresContext* aPresContext)
|
||||
aPresContext->PresShell()->FlushPendingNotifications(Flush_Display);
|
||||
}
|
||||
else {
|
||||
mOuter->AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
aPresContext->PresShell()->
|
||||
FrameNeedsReflow(mOuter, nsIPresShell::eTreeChange);
|
||||
FrameNeedsReflow(mOuter, nsIPresShell::eTreeChange, NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1100,8 +1099,8 @@ nsSplitterFrameInner::SetPreferredSize(nsBoxLayoutState& aState, nsIBox* aChildB
|
||||
nsWeakFrame weakBox(aChildBox);
|
||||
content->SetAttr(kNameSpaceID_None, attribute, prefValue, PR_TRUE);
|
||||
ENSURE_TRUE(weakBox.IsAlive());
|
||||
aChildBox->AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
aState.PresShell()->FrameNeedsReflow(aChildBox, nsIPresShell::eStyleChange);
|
||||
aState.PresShell()->FrameNeedsReflow(aChildBox, nsIPresShell::eStyleChange,
|
||||
NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
|
||||
|
||||
|
@ -476,7 +476,7 @@ nsSprocketLayout::Layout(nsIBox* aBox, nsBoxLayoutState& aState)
|
||||
layout = PR_FALSE;
|
||||
} else {
|
||||
// Always perform layout if we are dirty or have dirty children
|
||||
if (!(child->GetStateBits() & (NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN)))
|
||||
if (!NS_SUBTREE_DIRTY(child))
|
||||
layout = PR_FALSE;
|
||||
}
|
||||
|
||||
|
@ -267,7 +267,7 @@ nsStackLayout::Layout(nsIBox* aBox, nsBoxLayoutState& aState)
|
||||
PRBool sizeChanged = (oldRect != childRect);
|
||||
|
||||
// only lay out dirty children or children whose sizes have changed
|
||||
if (sizeChanged || (child->GetStateBits() & (NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN))) {
|
||||
if (sizeChanged || NS_SUBTREE_DIRTY(child)) {
|
||||
// add in the child's margin
|
||||
nsMargin margin;
|
||||
child->GetMargin(margin);
|
||||
|
@ -123,9 +123,9 @@ nsTextBoxFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
UpdateAttributes(aAttribute, aResize, aRedraw);
|
||||
|
||||
if (aResize) {
|
||||
AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eStyleChange);
|
||||
FrameNeedsReflow(this, nsIPresShell::eStyleChange,
|
||||
NS_FRAME_IS_DIRTY);
|
||||
} else if (aRedraw) {
|
||||
nsBoxLayoutState state(PresContext());
|
||||
Redraw(state);
|
||||
|
@ -1730,8 +1730,9 @@ nsTreeBodyFrame::MarkDirtyIfSelect()
|
||||
// XXX optimize this more
|
||||
|
||||
mStringWidth = -1;
|
||||
AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
PresContext()->PresShell()->FrameNeedsReflow(this, nsIPresShell::eTreeChange);
|
||||
PresContext()->PresShell()->FrameNeedsReflow(this,
|
||||
nsIPresShell::eTreeChange,
|
||||
NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2694,9 +2695,8 @@ nsTreeBodyFrame::PaintTreeBody(nsIRenderingContext& aRenderingContext,
|
||||
|
||||
if (oldPageCount != mPageLength || mHorzWidth != CalcHorzWidth(GetScrollParts())) {
|
||||
// Schedule a ResizeReflow that will update our info properly.
|
||||
AddStateBits(NS_FRAME_IS_DIRTY);
|
||||
PresContext()->PresShell()->
|
||||
FrameNeedsReflow(this, nsIPresShell::eResize);
|
||||
FrameNeedsReflow(this, nsIPresShell::eResize, NS_FRAME_IS_DIRTY);
|
||||
}
|
||||
#ifdef DEBUG
|
||||
PRInt32 rowCount = mRowCount;
|
||||
|
Loading…
x
Reference in New Issue
Block a user