Bug 562700 part 3. Store Element in the restyle table and pass it to the actual restyling functions. r=dbaron

This commit is contained in:
Boris Zbarsky 2010-05-14 13:04:51 -04:00
parent ecc1fd2ec3
commit 1e17a7151a
2 changed files with 46 additions and 50 deletions

View File

@ -8065,22 +8065,22 @@ nsCSSFrameConstructor::ProcessRestyledFrames(nsStyleChangeList& aChangeList)
}
void
nsCSSFrameConstructor::RestyleElement(nsIContent *aContent,
nsCSSFrameConstructor::RestyleElement(Element *aElement,
nsIFrame *aPrimaryFrame,
nsChangeHint aMinHint)
{
NS_ASSERTION(aPrimaryFrame == aContent->GetPrimaryFrame(),
NS_ASSERTION(aPrimaryFrame == aElement->GetPrimaryFrame(),
"frame/content mismatch");
if (aPrimaryFrame && aPrimaryFrame->GetContent() != aContent) {
if (aPrimaryFrame && aPrimaryFrame->GetContent() != aElement) {
// XXXbz this is due to image maps messing with the primary frame pointer
// of <area>s. See bug 135040. We can remove this block once that's fixed.
aPrimaryFrame = nsnull;
}
NS_ASSERTION(!aPrimaryFrame || aPrimaryFrame->GetContent() == aContent,
NS_ASSERTION(!aPrimaryFrame || aPrimaryFrame->GetContent() == aElement,
"frame/content mismatch");
if (aMinHint & nsChangeHint_ReconstructFrame) {
RecreateFramesForContent(aContent, PR_FALSE);
RecreateFramesForContent(aElement, PR_FALSE);
} else if (aPrimaryFrame) {
nsStyleChangeList changeList;
mPresShell->FrameManager()->
@ -8088,26 +8088,21 @@ nsCSSFrameConstructor::RestyleElement(nsIContent *aContent,
ProcessRestyledFrames(changeList);
} else {
// no frames, reconstruct for content
MaybeRecreateFramesForContent(aContent);
MaybeRecreateFramesForElement(aElement);
}
}
void
nsCSSFrameConstructor::RestyleLaterSiblings(nsIContent *aContent)
nsCSSFrameConstructor::RestyleLaterSiblings(Element *aElement)
{
nsIContent *parent = aContent->GetParent();
if (!parent)
return; // root element has no later siblings
for (PRInt32 index = parent->IndexOf(aContent) + 1,
index_end = parent->GetChildCount();
index != index_end; ++index) {
nsIContent *child = parent->GetChildAt(index);
if (!child->IsElement())
for (nsIContent* sibling = aElement->GetNextSibling();
sibling;
sibling = sibling->GetNextSibling()) {
if (!sibling->IsElement())
continue;
nsIFrame* primaryFrame = child->GetPrimaryFrame();
RestyleElement(child, primaryFrame, NS_STYLE_HINT_NONE);
RestyleElement(sibling->AsElement(), sibling->GetPrimaryFrame(),
NS_STYLE_HINT_NONE);
}
}
@ -8898,21 +8893,20 @@ nsCSSFrameConstructor::CaptureStateFor(nsIFrame* aFrame,
}
nsresult
nsCSSFrameConstructor::MaybeRecreateFramesForContent(nsIContent* aContent)
nsCSSFrameConstructor::MaybeRecreateFramesForElement(Element* aElement)
{
nsresult result = NS_OK;
nsFrameManager *frameManager = mPresShell->FrameManager();
nsStyleContext *oldContext = frameManager->GetUndisplayedContent(aContent);
nsStyleContext *oldContext = frameManager->GetUndisplayedContent(aElement);
if (oldContext) {
// The parent has a frame, so try resolving a new context.
// XXXbz this should take Element, not nsIContent
nsRefPtr<nsStyleContext> newContext = mPresShell->StyleSet()->
ResolveStyleFor(aContent->AsElement(), oldContext->GetParent());
ResolveStyleFor(aElement, oldContext->GetParent());
frameManager->ChangeUndisplayedContent(aContent, newContext);
frameManager->ChangeUndisplayedContent(aElement, newContext);
if (newContext->GetStyleDisplay()->mDisplay != NS_STYLE_DISPLAY_NONE) {
result = RecreateFramesForContent(aContent, PR_FALSE);
result = RecreateFramesForContent(aElement, PR_FALSE);
}
}
return result;
@ -11547,7 +11541,7 @@ nsCSSFrameConstructor::RestyleForRemove(Element* aContainer,
static PLDHashOperator
CollectRestyles(nsISupports* aContent,
CollectRestyles(nsISupports* aElement,
nsCSSFrameConstructor::RestyleData& aData,
void* aRestyleArrayPtr)
{
@ -11556,7 +11550,7 @@ CollectRestyles(nsISupports* aContent,
(aRestyleArrayPtr);
nsCSSFrameConstructor::RestyleEnumerateData* currentRestyle =
*restyleArrayPtr;
currentRestyle->mContent = static_cast<nsIContent*>(aContent);
currentRestyle->mElement = static_cast<Element*>(aElement);
currentRestyle->mRestyleHint = aData.mRestyleHint;
currentRestyle->mChangeHint = aData.mChangeHint;
@ -11567,33 +11561,33 @@ CollectRestyles(nsISupports* aContent,
}
void
nsCSSFrameConstructor::ProcessOneRestyle(nsIContent* aContent,
nsCSSFrameConstructor::ProcessOneRestyle(Element* aElement,
nsRestyleHint aRestyleHint,
nsChangeHint aChangeHint)
{
NS_PRECONDITION(aContent, "Must have content node");
NS_PRECONDITION(aElement, "Must have element");
if (!aContent->IsInDoc() ||
aContent->GetCurrentDoc() != mDocument) {
if (!aElement->IsInDoc() ||
aElement->GetCurrentDoc() != mDocument) {
// Content node has been removed from our document; nothing else
// to do here
return;
}
nsIFrame* primaryFrame = aContent->GetPrimaryFrame();
nsIFrame* primaryFrame = aElement->GetPrimaryFrame();
if (aRestyleHint & eRestyle_Self) {
RestyleElement(aContent, primaryFrame, aChangeHint);
RestyleElement(aElement, primaryFrame, aChangeHint);
} else if (aChangeHint &&
(primaryFrame ||
(aChangeHint & nsChangeHint_ReconstructFrame))) {
// Don't need to recompute style; just apply the hint
nsStyleChangeList changeList;
changeList.AppendChange(primaryFrame, aContent, aChangeHint);
changeList.AppendChange(primaryFrame, aElement, aChangeHint);
ProcessRestyledFrames(changeList);
}
if (aRestyleHint & eRestyle_LaterSiblings) {
RestyleLaterSiblings(aContent);
RestyleLaterSiblings(aElement);
}
}
@ -11689,7 +11683,7 @@ nsCSSFrameConstructor::ProcessPendingRestyleTable(
for (RestyleEnumerateData* currentRestyle = restylesToProcess;
currentRestyle != lastRestyle;
++currentRestyle) {
ProcessOneRestyle(currentRestyle->mContent,
ProcessOneRestyle(currentRestyle->mElement,
currentRestyle->mRestyleHint,
currentRestyle->mChangeHint);
}

View File

@ -82,6 +82,8 @@ class nsFrameConstructorSaveState;
class nsCSSFrameConstructor : public nsARefreshObserver
{
public:
typedef mozilla::dom::Element Element;
nsCSSFrameConstructor(nsIDocument *aDocument, nsIPresShell* aPresShell);
~nsCSSFrameConstructor(void) {
NS_ASSERTION(mUpdateCount == 0, "Dying in the middle of our own update?");
@ -305,7 +307,8 @@ private:
// This function does not call ProcessAttachedQueue() on the binding manager.
// If the caller wants that to happen synchronously, it needs to handle that
// itself.
void ProcessOneRestyle(nsIContent* aContent, nsRestyleHint aRestyleHint,
void ProcessOneRestyle(Element* aElement,
nsRestyleHint aRestyleHint,
nsChangeHint aChangeHint);
void ProcessPendingRestyleTable(
@ -315,20 +318,19 @@ public:
// Restyling for a ContentInserted (notification after insertion) or
// for a CharacterDataChanged. |aContainer| must be non-null; when
// the container is null, no work is needed.
void RestyleForInsertOrChange(mozilla::dom::Element* aContainer,
nsIContent* aChild);
void RestyleForInsertOrChange(Element* aContainer, nsIContent* aChild);
// This would be the same as RestyleForInsertOrChange if we got the
// notification before the removal. However, we get it after, so we
// have to use the index. |aContainer| must be non-null; when the
// container is null, no work is needed. aFollowingSibling is the
// sibling that used to come after aOldChild before the removal.
void RestyleForRemove(mozilla::dom::Element* aContainer,
void RestyleForRemove(Element* aContainer,
nsIContent* aOldChild,
nsIContent* aFollowingSibling);
// Same for a ContentAppended. |aContainer| must be non-null; when
// the container is null, no work is needed.
void RestyleForAppend(mozilla::dom::Element* aContainer,
nsIContent* aFirstNewContent);
void RestyleForAppend(Element* aContainer, nsIContent* aFirstNewContent);
// Process any pending restyles. This should be called after
// CreateNeededFrames.
@ -345,7 +347,7 @@ public:
void RebuildAllStyleData(nsChangeHint aExtraHint);
// See PostRestyleEventCommon below.
void PostRestyleEvent(mozilla::dom::Element* aElement,
void PostRestyleEvent(Element* aElement,
nsRestyleHint aRestyleHint,
nsChangeHint aMinChangeHint)
{
@ -357,7 +359,7 @@ public:
}
// See PostRestyleEventCommon below.
void PostAnimationRestyleEvent(mozilla::dom::Element* aElement,
void PostAnimationRestyleEvent(Element* aElement,
nsRestyleHint aRestyleHint,
nsChangeHint aMinChangeHint)
{
@ -382,7 +384,7 @@ private:
* IsProcessingAnimationStyleChange() value
* (which is the default value).
*/
void PostRestyleEventCommon(mozilla::dom::Element* aElement,
void PostRestyleEventCommon(Element* aElement,
nsRestyleHint aRestyleHint,
nsChangeHint aMinChangeHint,
PRBool aForAnimation);
@ -450,16 +452,16 @@ private:
nsIFrame*& aPageFrame,
nsIFrame*& aCanvasFrame);
void DoContentStateChanged(mozilla::dom::Element* aElement,
void DoContentStateChanged(Element* aElement,
PRInt32 aStateMask);
/* aMinHint is the minimal change that should be made to the element */
// XXXbz do we really need the aPrimaryFrame argument here?
void RestyleElement(nsIContent* aContent,
void RestyleElement(Element* aElement,
nsIFrame* aPrimaryFrame,
nsChangeHint aMinHint);
void RestyleLaterSiblings(nsIContent* aContent);
void RestyleLaterSiblings(Element* aElement);
nsresult InitAndRestoreFrame (const nsFrameConstructorState& aState,
nsIContent* aContent,
@ -499,7 +501,7 @@ private:
// Construct the frames for the document element. This must always return a
// singe new frame (which may, of course, have a bunch of kids).
// XXXbz no need to return a frame here, imo.
nsresult ConstructDocElementFrame(mozilla::dom::Element* aDocElement,
nsresult ConstructDocElementFrame(Element* aDocElement,
nsILayoutHistoryState* aFrameState,
nsIFrame** aNewFrame);
@ -1499,7 +1501,7 @@ private:
PendingBinding* aPendingBinding,
nsFrameItems& aFrameItems);
nsresult MaybeRecreateFramesForContent(nsIContent* aContent);
nsresult MaybeRecreateFramesForElement(Element* aElement);
// If aAsyncInsert is true then a restyle event will be posted to handle the
// required ContentInserted call instead of doing it immediately.
@ -1839,7 +1841,7 @@ public:
};
struct RestyleEnumerateData : public RestyleData {
nsCOMPtr<nsIContent> mContent;
nsCOMPtr<Element> mElement;
};
friend class nsFrameConstructorState;