From 82a0a650a6ccf82e8fe71b3aff2b30ecc3f1619a Mon Sep 17 00:00:00 2001 From: "L. David Baron" Date: Tue, 30 Jul 2013 17:36:10 -0700 Subject: [PATCH] Bug 898209 patch 8: Create and use ElementRestyler::mChangeList. r=heycam --- layout/base/RestyleManager.cpp | 41 ++++++++++++++++------------------ layout/base/RestyleManager.h | 6 ++--- 2 files changed, 22 insertions(+), 25 deletions(-) diff --git a/layout/base/RestyleManager.cpp b/layout/base/RestyleManager.cpp index e14f54378656..3f820dcf9758 100644 --- a/layout/base/RestyleManager.cpp +++ b/layout/base/RestyleManager.cpp @@ -1911,6 +1911,7 @@ RestyleManager::ReparentStyleContext(nsIFrame* aFrame) ElementRestyler::ElementRestyler(nsPresContext* aPresContext, nsIFrame* aFrame, + nsStyleChangeList* aChangeList, nsChangeHint aHintsHandledByAncestors) : mPresContext(aPresContext) , mFrame(aFrame) @@ -1918,6 +1919,7 @@ ElementRestyler::ElementRestyler(nsPresContext* aPresContext, // XXXldb Why does it make sense to use aParentContent? (See // comment above assertion at start of ElementRestyler::Restyle.) , mContent(mFrame->GetContent() ? mFrame->GetContent() : mParentContent) + , mChangeList(aChangeList) , mHintsHandled(NS_SubtractHint(aHintsHandledByAncestors, NS_HintsNotHandledForDescendantsIn(aHintsHandledByAncestors))) { @@ -1931,6 +1933,7 @@ ElementRestyler::ElementRestyler(const ElementRestyler& aParentRestyler, // XXXldb Why does it make sense to use aParentContent? (See // comment above assertion at start of ElementRestyler::Restyle.) , mContent(mFrame->GetContent() ? mFrame->GetContent() : mParentContent) + , mChangeList(aParentRestyler.mChangeList) , mHintsHandled(NS_SubtractHint(aParentRestyler.mHintsHandled, NS_HintsNotHandledForDescendantsIn(aParentRestyler.mHintsHandled))) { @@ -1945,6 +1948,7 @@ ElementRestyler::ElementRestyler(ParentContextFromChildFrame, // XXXldb Why does it make sense to use aParentContent? (See // comment above assertion at start of ElementRestyler::Restyle.) , mContent(mFrame->GetContent() ? mFrame->GetContent() : mParentContent) + , mChangeList(aParentRestyler.mChangeList) , mHintsHandled(NS_SubtractHint(aParentRestyler.mHintsHandled, NS_HintsNotHandledForDescendantsIn(aParentRestyler.mHintsHandled))) { @@ -1953,7 +1957,6 @@ ElementRestyler::ElementRestyler(ParentContextFromChildFrame, void ElementRestyler::CaptureChange(nsStyleContext* aOldContext, nsStyleContext* aNewContext, - nsStyleChangeList* aChangeList, /*in*/nsChangeHint aParentHintsNotHandledForDescendants, /*out*/nsChangeHint &aHintsNotHandledForDescendants, nsChangeHint aChangeToAssume) @@ -1975,14 +1978,14 @@ ElementRestyler::CaptureChange(nsStyleContext* aOldContext, NS_UpdateHint(ourChange, aChangeToAssume); if (NS_UpdateHint(mHintsHandled, ourChange)) { if (!(ourChange & nsChangeHint_ReconstructFrame) || mContent) { - aChangeList->AppendChange(mFrame, mContent, ourChange); + mChangeList->AppendChange(mFrame, mContent, ourChange); } } aHintsNotHandledForDescendants = NS_HintsNotHandledForDescendantsIn(ourChange); } /** - * Recompute style for mFrame and accumulate changes into aChangeList + * Recompute style for mFrame and accumulate changes into mChangeList * given that mHintsHandled is already accumulated for an ancestor. * mParentContent is the content node used to resolve the parent style * context. This means that, for pseudo-elements, it is the content @@ -1993,8 +1996,7 @@ ElementRestyler::CaptureChange(nsStyleContext* aOldContext, * nsStyleContext::CalcStyleDifference. */ void -ElementRestyler::Restyle(nsStyleChangeList *aChangeList, - nsChangeHint aParentFrameHintsNotHandledForDescendants, +ElementRestyler::Restyle(nsChangeHint aParentFrameHintsNotHandledForDescendants, nsRestyleHint aRestyleHint, RestyleTracker& aRestyleTracker, DesiredA11yNotifications aDesiredA11yNotifications, @@ -2043,7 +2045,7 @@ ElementRestyler::Restyle(nsStyleChangeList *aChangeList, RestyleTracker::RestyleData restyleData; if (aRestyleTracker.GetRestyleData(mContent->AsElement(), &restyleData)) { if (NS_UpdateHint(mHintsHandled, restyleData.mChangeHint)) { - aChangeList->AppendChange(mFrame, mContent, restyleData.mChangeHint); + mChangeList->AppendChange(mFrame, mContent, restyleData.mChangeHint); } aRestyleHint = nsRestyleHint(aRestyleHint | restyleData.mRestyleHint); } @@ -2084,8 +2086,7 @@ ElementRestyler::Restyle(nsStyleChangeList *aChangeList, ElementRestyler providerRestyler(PARENT_CONTEXT_FROM_CHILD_FRAME, *this, providerFrame); - providerRestyler.Restyle(aChangeList, - nsChangeHint_Hints_NotHandledForDescendants, + providerRestyler.Restyle(nsChangeHint_Hints_NotHandledForDescendants, aRestyleHint, aRestyleTracker, aDesiredA11yNotifications, @@ -2210,7 +2211,7 @@ ElementRestyler::Restyle(nsStyleChangeList *aChangeList, if (!newContext) { // This pseudo should no longer exist; gotta reframe NS_UpdateHint(mHintsHandled, nsChangeHint_ReconstructFrame); - aChangeList->AppendChange(mFrame, element, + mChangeList->AppendChange(mFrame, element, nsChangeHint_ReconstructFrame); // We're reframing anyway; just keep the same context newContext = oldContext; @@ -2260,7 +2261,7 @@ ElementRestyler::Restyle(nsStyleChangeList *aChangeList, oldContext, &newContext); } - CaptureChange(oldContext, newContext, aChangeList, + CaptureChange(oldContext, newContext, aParentFrameHintsNotHandledForDescendants, nonInheritedHints, assumeDifferenceHint); if (!(mHintsHandled & nsChangeHint_ReconstructFrame)) { @@ -2308,7 +2309,6 @@ ElementRestyler::Restyle(nsStyleChangeList *aChangeList, if (oldExtraContext != newExtraContext) { nsChangeHint extraHintsNotHandledForDescendants = nsChangeHint(0); CaptureChange(oldExtraContext, newExtraContext, - aChangeList, aParentFrameHintsNotHandledForDescendants, extraHintsNotHandledForDescendants, assumeDifferenceHint); @@ -2389,7 +2389,7 @@ ElementRestyler::Restyle(nsStyleChangeList *aChangeList, if (display->mDisplay != NS_STYLE_DISPLAY_NONE) { NS_ASSERTION(undisplayed->mContent, "Must have undisplayed content"); - aChangeList->AppendChange(nullptr, undisplayed->mContent, + mChangeList->AppendChange(nullptr, undisplayed->mContent, NS_STYLE_HINT_FRAMECHANGE); // The node should be removed from the undisplayed map when // we reframe it. @@ -2425,7 +2425,7 @@ ElementRestyler::Restyle(nsStyleChangeList *aChangeList, mPresContext)) { // Have to create the new :before frame NS_UpdateHint(mHintsHandled, nsChangeHint_ReconstructFrame); - aChangeList->AppendChange(mFrame, mContent, + mChangeList->AppendChange(mFrame, mContent, nsChangeHint_ReconstructFrame); } } @@ -2457,7 +2457,7 @@ ElementRestyler::Restyle(nsStyleChangeList *aChangeList, !nsLayoutUtils::GetAfterFrame(mFrame)) { // have to create the new :after frame NS_UpdateHint(mHintsHandled, nsChangeHint_ReconstructFrame); - aChangeList->AppendChange(mFrame, mContent, + mChangeList->AppendChange(mFrame, mContent, nsChangeHint_ReconstructFrame); } } @@ -2561,8 +2561,7 @@ ElementRestyler::Restyle(nsStyleChangeList *aChangeList, oofRestyler.mHintsHandled = NS_SubtractHint(oofRestyler.mHintsHandled, nsChangeHint_AllReflowHints); - oofRestyler.Restyle(aChangeList, - nonInheritedHints, + oofRestyler.Restyle(nonInheritedHints, childRestyleHint, aRestyleTracker, kidsDesiredA11yNotification, @@ -2573,8 +2572,7 @@ ElementRestyler::Restyle(nsStyleChangeList *aChangeList, // reresolve placeholder's context under the same parent // as the out-of-flow frame ElementRestyler phRestyler(*this, child); - phRestyler.Restyle(aChangeList, - nonInheritedHints, + phRestyler.Restyle(nonInheritedHints, childRestyleHint, aRestyleTracker, kidsDesiredA11yNotification, @@ -2584,8 +2582,7 @@ ElementRestyler::Restyle(nsStyleChangeList *aChangeList, else { // regular child frame if (child != resolvedChild) { ElementRestyler childRestyler(*this, child); - childRestyler.Restyle(aChangeList, - nonInheritedHints, + childRestyler.Restyle(nonInheritedHints, childRestyleHint, aRestyleTracker, kidsDesiredA11yNotification, @@ -2670,10 +2667,10 @@ RestyleManager::ComputeStyleChangeFor(nsIFrame* aFrame, // Outer loop over special siblings do { // Inner loop over next-in-flows of the current frame - ElementRestyler restyler(mPresContext, frame, + ElementRestyler restyler(mPresContext, frame, aChangeList, aMinChange); - restyler.Restyle(aChangeList, nsChangeHint(0), + restyler.Restyle(nsChangeHint(0), aRestyleDescendants ? eRestyle_Subtree : eRestyle_Self, aRestyleTracker, diff --git a/layout/base/RestyleManager.h b/layout/base/RestyleManager.h index 457c7665c80d..63518933cdfc 100644 --- a/layout/base/RestyleManager.h +++ b/layout/base/RestyleManager.h @@ -273,6 +273,7 @@ public: // Construct for the root of the subtree that we're restyling. ElementRestyler(nsPresContext* aPresContext, nsIFrame* aFrame, + nsStyleChangeList* aChangeList, nsChangeHint aHintsHandledByAncestors); // Construct for an element whose parent is being restyled. @@ -313,8 +314,7 @@ public: * nsRestyleHint(0) to mean recompute a new style context for our * current parent and existing rulenode, and the same for kids. */ - void Restyle(nsStyleChangeList *aChangeList, - nsChangeHint aParentFrameHintsNotHandledForDescendants, + void Restyle(nsChangeHint aParentFrameHintsNotHandledForDescendants, nsRestyleHint aRestyleHint, RestyleTracker& aRestyleTracker, DesiredA11yNotifications aDesiredA11yNotifications, @@ -333,7 +333,6 @@ public: private: void CaptureChange(nsStyleContext* aOldContext, nsStyleContext* aNewContext, - nsStyleChangeList* aChangeList, /*in*/nsChangeHint aParentHintsNotHandledForDescendants, /*out*/nsChangeHint &aHintsNotHandledForDescendants, nsChangeHint aChangeToAssume); @@ -346,6 +345,7 @@ private: // normal elements (not pseudo-elements) and for which we generate // framechange hints if we need them. nsIContent* const mContent; + nsStyleChangeList* const mChangeList; // We have already generated change list entries for hints listed in // mHintsHandled (initially it's those handled by ancestors, but by // the end of Restyle it is those handled for this frame as well). We