Fix bug 297801 by making removal and reinsertion of the root element less

magical.  r=peterv, sr=jst
This commit is contained in:
bzbarsky@mit.edu
2006-01-12 17:11:57 +00:00
parent d2602b2c74
commit 0614bc751d
2 changed files with 21 additions and 9 deletions

View File

@@ -371,6 +371,10 @@ protected:
// parser interrupt mode. // parser interrupt mode.
PRUint8 mDeflectedCount; PRUint8 mDeflectedCount;
// Boolean indicating whether we've notified insertion of our root content
// yet. We want to make sure to only do this once.
PRPackedBool mNotifiedRootInsertion;
nsCOMPtr<nsIObserverEntry> mObservers; nsCOMPtr<nsIObserverEntry> mObservers;
void StartLayout(); void StartLayout();
@@ -2876,6 +2880,22 @@ HTMLContentSink::OpenContainer(const nsIParserNode& aNode)
case eHTMLTag_html: case eHTMLTag_html:
if (mRoot) { if (mRoot) {
AddAttributes(aNode, mRoot, PR_TRUE, PR_TRUE); AddAttributes(aNode, mRoot, PR_TRUE, PR_TRUE);
if (!mNotifiedRootInsertion) {
NS_ASSERTION(!mLayoutStarted,
"How did we start layout without notifying on root?");
// Now make sure to notify that we have now inserted our root. If
// there has been no initial reflow yet it'll be a no-op, but if
// there has been one we need this to get its frames constructed.
// Note that if mNotifiedRootInsertion is true we don't notify here,
// since that just means there are multiple <html> tags in the
// document; in those cases we just want to put all the attrs on one
// tag.
mNotifiedRootInsertion = PR_TRUE;
PRInt32 index = mDocument->IndexOf(mRoot);
NS_ASSERTION(index != -1, "mRoot not child of document?");
NotifyInsert(nsnull, mRoot, index);
}
} }
break; break;
case eHTMLTag_form: case eHTMLTag_form:
@@ -3673,7 +3693,7 @@ HTMLContentSink::NotifyInsert(nsIContent* aContent,
nsIContent* aChildContent, nsIContent* aChildContent,
PRInt32 aIndexInContainer) PRInt32 aIndexInContainer)
{ {
if (aContent->GetCurrentDoc() != mDocument) { if (aContent && aContent->GetCurrentDoc() != mDocument) {
// aContent is not actually in our document anymore.... Just bail out of // aContent is not actually in our document anymore.... Just bail out of
// here; notifying on our document for this insert would be wrong. // here; notifying on our document for this insert would be wrong.
return; return;

View File

@@ -5185,14 +5185,6 @@ PresShell::ContentRemoved(nsIDocument *aDocument,
mFrameConstructor->ContentRemoved(aContainer, aChild, mFrameConstructor->ContentRemoved(aContainer, aChild,
aIndexInContainer, PR_FALSE); aIndexInContainer, PR_FALSE);
// If we have no root content node at this point, be sure to reset
// mDidInitialReflow to PR_FALSE, this will allow InitialReflow()
// to be called again should a new root node be inserted for this
// presShell. (Bug 167355)
if (mDocument && !mDocument->GetRootContent())
mDidInitialReflow = PR_FALSE;
VERIFY_STYLE_TREE; VERIFY_STYLE_TREE;
DidCauseReflow(); DidCauseReflow();
} }