Bug 840480 r=roc

This commit is contained in:
Matt Woodrow 2013-02-20 13:13:01 +13:00
parent 748b4717a1
commit bfb6ac7eab
6 changed files with 32 additions and 52 deletions

View File

@ -109,8 +109,7 @@ CollectRestyles(nsISupports* aElement,
inline void
RestyleTracker::ProcessOneRestyle(Element* aElement,
nsRestyleHint aRestyleHint,
nsChangeHint aChangeHint,
OverflowChangedTracker& aTracker)
nsChangeHint aChangeHint)
{
NS_PRECONDITION((aRestyleHint & eRestyle_LaterSiblings) == 0,
"Someone should have handled this before calling us");
@ -122,15 +121,14 @@ RestyleTracker::ProcessOneRestyle(Element* aElement,
if (aRestyleHint & (eRestyle_Self | eRestyle_Subtree)) {
mFrameConstructor->RestyleElement(aElement, primaryFrame, aChangeHint,
*this,
(aRestyleHint & eRestyle_Subtree) != 0,
aTracker);
(aRestyleHint & eRestyle_Subtree) != 0);
} else if (aChangeHint &&
(primaryFrame ||
(aChangeHint & nsChangeHint_ReconstructFrame))) {
// Don't need to recompute style; just apply the hint
nsStyleChangeList changeList;
changeList.AppendChange(primaryFrame, aElement, aChangeHint);
mFrameConstructor->ProcessRestyledFrames(changeList, aTracker);
mFrameConstructor->ProcessRestyledFrames(changeList);
}
}
@ -144,8 +142,6 @@ RestyleTracker::DoProcessRestyles()
mFrameConstructor->mInStyleRefresh = true;
OverflowChangedTracker tracker;
// loop so that we process any restyle events generated by processing
while (mPendingRestyles.Count()) {
if (mHaveLaterSiblingRestyles) {
@ -210,7 +206,7 @@ RestyleTracker::DoProcessRestyles()
continue;
}
ProcessOneRestyle(element, data.mRestyleHint, data.mChangeHint, tracker);
ProcessOneRestyle(element, data.mRestyleHint, data.mChangeHint);
}
if (mHaveLaterSiblingRestyles) {
@ -239,13 +235,12 @@ RestyleTracker::DoProcessRestyles()
++currentRestyle) {
ProcessOneRestyle(currentRestyle->mElement,
currentRestyle->mRestyleHint,
currentRestyle->mChangeHint,
tracker);
currentRestyle->mChangeHint);
}
}
}
tracker.Flush();
mFrameConstructor->FlushOverflowChangedTracker();
// Set mInStyleRefresh to false now, since the EndUpdate call might
// add more restyles.

View File

@ -31,6 +31,11 @@ class OverflowChangedTracker
{
public:
~OverflowChangedTracker()
{
NS_ASSERTION(mEntryList.empty(), "Need to flush before destroying!");
}
/**
* Add a frame that has had a style change, and needs its
* overflow updated.
@ -247,8 +252,7 @@ private:
*/
inline void ProcessOneRestyle(Element* aElement,
nsRestyleHint aRestyleHint,
nsChangeHint aChangeHint,
OverflowChangedTracker& aTracker);
nsChangeHint aChangeHint);
/**
* The guts of our restyle processing.

View File

@ -1437,7 +1437,6 @@ nsCSSFrameConstructor::nsCSSFrameConstructor(nsIDocument *aDocument,
, mInStyleRefresh(false)
, mHoverGeneration(0)
, mRebuildAllExtraHint(nsChangeHint(0))
, mOverflowChangedTracker(nullptr)
, mAnimationGeneration(0)
, mPendingRestyles(ELEMENT_HAS_PENDING_RESTYLE |
ELEMENT_IS_POTENTIAL_RESTYLE_ROOT, this)
@ -1517,9 +1516,7 @@ nsCSSFrameConstructor::NotifyDestroyingFrame(nsIFrame* aFrame)
CountersDirty();
}
if (mOverflowChangedTracker) {
mOverflowChangedTracker->RemoveFrame(aFrame);
}
mOverflowChangedTracker.RemoveFrame(aFrame);
nsFrameManager::NotifyDestroyingFrame(aFrame);
}
@ -8201,8 +8198,7 @@ NeedToReframeForAddingOrRemovingTransform(nsIFrame* aFrame)
}
nsresult
nsCSSFrameConstructor::ProcessRestyledFrames(nsStyleChangeList& aChangeList,
OverflowChangedTracker& aTracker)
nsCSSFrameConstructor::ProcessRestyledFrames(nsStyleChangeList& aChangeList)
{
NS_ASSERTION(!nsContentUtils::IsSafeToRunScript(),
"Someone forgot a script blocker");
@ -8212,10 +8208,6 @@ nsCSSFrameConstructor::ProcessRestyledFrames(nsStyleChangeList& aChangeList,
SAMPLE_LABEL("CSS", "ProcessRestyledFrames");
MOZ_ASSERT(!GetOverflowChangedTracker(),
"Can't have multiple overflow changed trackers!");
SetOverflowChangedTracker(&aTracker);
// Make sure to not rebuild quote or counter lists while we're
// processing restyles
BeginUpdate();
@ -8346,7 +8338,7 @@ nsCSSFrameConstructor::ProcessRestyledFrames(nsStyleChangeList& aChangeList,
// updating overflows since that will happen when it's reflowed.
if (!(childFrame->GetStateBits() &
(NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN))) {
aTracker.AddFrame(childFrame);
mOverflowChangedTracker.AddFrame(childFrame);
}
NS_ASSERTION(!nsLayoutUtils::GetNextContinuationOrSpecialSibling(childFrame),
"SVG frames should not have continuations or special siblings");
@ -8359,7 +8351,7 @@ nsCSSFrameConstructor::ProcessRestyledFrames(nsStyleChangeList& aChangeList,
if (!(frame->GetStateBits() &
(NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN))) {
while (frame) {
aTracker.AddFrame(frame);
mOverflowChangedTracker.AddFrame(frame);
frame =
nsLayoutUtils::GetNextContinuationOrSpecialSibling(frame);
@ -8401,7 +8393,6 @@ nsCSSFrameConstructor::ProcessRestyledFrames(nsStyleChangeList& aChangeList,
#endif
}
SetOverflowChangedTracker(nullptr);
aChangeList.Clear();
return NS_OK;
}
@ -8411,8 +8402,7 @@ nsCSSFrameConstructor::RestyleElement(Element *aElement,
nsIFrame *aPrimaryFrame,
nsChangeHint aMinHint,
RestyleTracker& aRestyleTracker,
bool aRestyleDescendants,
OverflowChangedTracker& aTracker)
bool aRestyleDescendants)
{
NS_ASSERTION(aPrimaryFrame == aElement->GetPrimaryFrame(),
"frame/content mismatch");
@ -8450,7 +8440,7 @@ nsCSSFrameConstructor::RestyleElement(Element *aElement,
nsStyleChangeList changeList;
ComputeStyleChangeFor(aPrimaryFrame, &changeList, aMinHint,
aRestyleTracker, aRestyleDescendants);
ProcessRestyledFrames(changeList, aTracker);
ProcessRestyledFrames(changeList);
} else {
// no frames, reconstruct for content
MaybeRecreateFramesForElement(aElement);
@ -12234,9 +12224,8 @@ nsCSSFrameConstructor::DoRebuildAllStyleData(RestyleTracker& aRestyleTracker,
&changeList, aExtraHint,
aRestyleTracker, true);
// Process the required changes
OverflowChangedTracker tracker;
ProcessRestyledFrames(changeList, tracker);
tracker.Flush();
ProcessRestyledFrames(changeList);
FlushOverflowChangedTracker();
// Tell the style set it's safe to destroy the old rule tree. We
// must do this after the ProcessRestyledFrames call in case the

View File

@ -241,8 +241,7 @@ public:
// This function does not call ProcessAttachedQueue() on the binding manager.
// If the caller wants that to happen synchronously, it needs to handle that
// itself.
nsresult ProcessRestyledFrames(nsStyleChangeList& aRestyleArray,
OverflowChangedTracker& aTracker);
nsresult ProcessRestyledFrames(nsStyleChangeList& aRestyleArray);
private:
@ -307,13 +306,9 @@ public:
PostRestyleEventCommon(aElement, aRestyleHint, aMinChangeHint, true);
}
OverflowChangedTracker *GetOverflowChangedTracker() const
{
return mOverflowChangedTracker;
}
void SetOverflowChangedTracker(OverflowChangedTracker *aTracker)
void FlushOverflowChangedTracker()
{
mOverflowChangedTracker = aTracker;
mOverflowChangedTracker.Flush();
}
private:
@ -406,8 +401,7 @@ private:
nsIFrame* aPrimaryFrame,
nsChangeHint aMinHint,
RestyleTracker& aRestyleTracker,
bool aRestyleDescendants,
OverflowChangedTracker& aTracker);
bool aRestyleDescendants);
nsresult InitAndRestoreFrame (const nsFrameConstructorState& aState,
nsIContent* aContent,
@ -1914,7 +1908,7 @@ private:
nsCOMPtr<nsILayoutHistoryState> mTempFrameTreeState;
OverflowChangedTracker *mOverflowChangedTracker;
OverflowChangedTracker mOverflowChangedTracker;
// The total number of animation flushes by this frame constructor.
// Used to keep the layer and animation manager in sync.

View File

@ -2734,9 +2734,8 @@ PresShell::RecreateFramesFor(nsIContent* aContent)
// Mark ourselves as not safe to flush while we're doing frame construction.
++mChangeNestCount;
css::OverflowChangedTracker tracker;
nsresult rv = mFrameConstructor->ProcessRestyledFrames(changeList, tracker);
tracker.Flush();
nsresult rv = mFrameConstructor->ProcessRestyledFrames(changeList);
mFrameConstructor->FlushOverflowChangedTracker();
--mChangeNestCount;
return rv;
@ -7899,9 +7898,8 @@ PresShell::Observe(nsISupports* aSubject,
{
nsAutoScriptBlocker scriptBlocker;
++mChangeNestCount;
css::OverflowChangedTracker tracker;
mFrameConstructor->ProcessRestyledFrames(changeList, tracker);
tracker.Flush();
mFrameConstructor->ProcessRestyledFrames(changeList);
mFrameConstructor->FlushOverflowChangedTracker();
--mChangeNestCount;
}
}

View File

@ -429,10 +429,10 @@ nsTransitionManager::UpdateAllThrottledStyles()
}
}
OverflowChangedTracker tracker;
mPresContext->PresShell()->FrameConstructor()->
ProcessRestyledFrames(changeList, tracker);
tracker.Flush();
ProcessRestyledFrames(changeList);
mPresContext->PresShell()->FrameConstructor()->
FlushOverflowChangedTracker();
}
already_AddRefed<nsIStyleRule>