From 1ae8f2fbced5a768a1d5bcd17d3093f3a31db59f Mon Sep 17 00:00:00 2001 From: kipp Date: Wed, 3 Jun 1998 15:58:52 +0000 Subject: [PATCH] Use revised Presentation shell API; control notifications directly; propogate end of document load to document so that observers can be notified git-svn-id: svn://10.0.0.236/trunk@3058 18797224-902f-48f8-a5cc-f745e15eee43 --- .../html/document/src/nsHTMLContentSink.cpp | 145 +++++++++++------- .../html/document/src/nsHTMLContentSink.cpp | 145 +++++++++++------- 2 files changed, 174 insertions(+), 116 deletions(-) diff --git a/mozilla/content/html/document/src/nsHTMLContentSink.cpp b/mozilla/content/html/document/src/nsHTMLContentSink.cpp index 174baaf1a73..b944e3d9b84 100644 --- a/mozilla/content/html/document/src/nsHTMLContentSink.cpp +++ b/mozilla/content/html/document/src/nsHTMLContentSink.cpp @@ -210,6 +210,7 @@ protected: PRTime mLastUpdateTime; PRTime mUpdateDelta; PRBool mLayoutStarted; + PRInt32 mInMonolithicContainer; }; // Note: operator new zeros our memory @@ -281,14 +282,6 @@ PRInt32 HTMLContentSink::CloseHTML(const nsIParserNode& aNode) NS_ASSERTION(mStackPos > 0, "bad bad"); mNodeStack[--mStackPos] = eHTMLTag_unknown; - PRInt32 i, ns = mDocument->GetNumberOfShells(); - for (i = 0; i < ns; i++) { - nsIPresShell* shell = mDocument->GetShellAt(i); - if (nsnull != shell) { - shell->BeginObservingDocument(); - NS_RELEASE(shell); - } - } NS_IF_RELEASE(mCurrentForm); return 0; @@ -333,7 +326,7 @@ PRInt32 HTMLContentSink::OpenBody(const nsIParserNode& aNode) nsIAtom* atom = NS_NewAtom("BODY"); nsresult rv = NS_NewBodyPart(&mBody, atom); if (NS_OK == rv) { - mRoot->AppendChild(mBody); + mRoot->AppendChild(mBody, PR_FALSE); startLayout = PR_TRUE; } NS_RELEASE(atom); @@ -369,7 +362,6 @@ PRInt32 HTMLContentSink::CloseBody(const nsIParserNode& aNode) mNodeStack[--mStackPos] = eHTMLTag_unknown; // Reflow any lingering content - ReflowNewContent(); return 0; } @@ -514,6 +506,7 @@ PRInt32 HTMLContentSink::OpenContainer(const nsIParserNode& aNode) case eHTMLTag_table: rv = NS_NewTablePart(&container, atom); + mInMonolithicContainer++; break; case eHTMLTag_caption: @@ -598,44 +591,41 @@ PRInt32 HTMLContentSink::CloseContainer(const nsIParserNode& aNode) switch (aNode.GetNodeType()) { case eHTMLTag_option: ProcessCloseOPTIONTag(aNode); - - eHTMLTags parentType; - parent = GetCurrentContainer(&parentType); - container->Compact(); - - if(parent) { - parent->AppendChild(container); - } break; case eHTMLTag_select: ProcessCloseSELECTTag(aNode); // add fall through - - default: - if (nsnull != container) { - // Now that this container is complete, append it to it's parent - eHTMLTags parentType; - parent = GetCurrentContainer(&parentType); - container->Compact(); - - if(parent) { - parent->AppendChild(container); - if (parent == mBody) { - // We just closed a child of the body off. Trigger a - // content-appended reflow if enough time has elapsed - PRTime now = PR_Now(); - /* XXX this expression doesn't compile on the Mac - kipp said it had to do with a type issue. - if (now - mLastUpdateTime >= mUpdateDelta) { - mLastUpdateTime = now; - mUpdateDelta += mUpdateDelta; - ReflowNewContent(); - }*/ - } - } - NS_RELEASE(container); - } break; + + case eHTMLTag_table: + mInMonolithicContainer--; + break; + } + + if (nsnull != container) { + // Now that this container is complete, append it to it's parent + eHTMLTags parentType; + parent = GetCurrentContainer(&parentType); + container->Compact(); + + if (nsnull != parent) { + parent->AppendChild(container, parent == mBody ? PR_TRUE : PR_FALSE); +#if XXX + if (parent == mBody) { + // We just closed a child of the body off. Trigger a + // content-appended reflow if enough time has elapsed + PRTime now = PR_Now(); + /* XXX this expression doesn't compile on the Mac + kipp said it had to do with a type issue. + if (now - mLastUpdateTime >= mUpdateDelta) { + mLastUpdateTime = now; + mUpdateDelta += mUpdateDelta; + ReflowNewContent(); + }*/ + } +#endif + } + NS_RELEASE(container); } return 0; @@ -662,6 +652,19 @@ void HTMLContentSink::StartLayout() void HTMLContentSink::ReflowNewContent() { + PRInt32 i, ns = mDocument->GetNumberOfShells(); + for (i = 0; i < ns; i++) { + nsIPresShell* shell = mDocument->GetShellAt(i); + if (nsnull != shell) { + nsIPresContext* cx = shell->GetPresContext(); + nsRect r; + cx->GetVisibleArea(r); + shell->ResizeReflow(r.width, r.height); + NS_RELEASE(cx); + NS_RELEASE(shell); + } + } +#if XXX printf("reflow body\n"); // Trigger reflows in each of the presentation shells @@ -673,6 +676,7 @@ void HTMLContentSink::ReflowNewContent() NS_RELEASE(shell); } } +#endif } PRBool HTMLContentSink::CloseTopmostContainer() @@ -805,7 +809,7 @@ PRInt32 HTMLContentSink::AddLeaf(const nsIParserNode& aNode) if (NS_OK == rv) { if (nsnull != leaf) { if (nsnull != parent) { - parent->AppendChild(leaf); + parent->AppendChild(leaf, parent == mBody ? PR_TRUE : PR_FALSE); } else { // XXX drop stuff on the floor that doesn't have a container! // Bad parser! @@ -1301,22 +1305,43 @@ nsresult HTMLContentSink::ProcessWBRTag(nsIHTMLContent** aInstancePtrResult, return rv; } - /** - * This method gets called when the parser begins the process - * of building the content model via the content sink. - * - * @update 5/7/98 gess +/** + * This method gets called when the parser begins the process + * of building the content model via the content sink. + * + * @update 5/7/98 gess */ -void HTMLContentSink::WillBuildModel(void){ +void +HTMLContentSink::WillBuildModel(void) +{ + PR_LogPrint("WillBuildModel"); + mDocument->BeginLoad(); + + // XXX temporary + PRInt32 i, ns = mDocument->GetNumberOfShells(); + for (i = 0; i < ns; i++) { + nsIPresShell* shell = mDocument->GetShellAt(i); + if (nsnull != shell) { + shell->BeginObservingDocument(); + NS_RELEASE(shell); + } + } + + StartLayout(); } - /** - * This method gets called when the parser concludes the process - * of building the content model via the content sink. - * - * @update 5/7/98 gess +/** + * This method gets called when the parser concludes the process + * of building the content model via the content sink. + * + * @update 5/7/98 gess */ -void HTMLContentSink::DidBuildModel(void){ +void +HTMLContentSink::DidBuildModel(void) +{ + PR_LogPrint("DidBuildModel"); + ReflowNewContent(); + mDocument->EndLoad(); } /** @@ -1326,7 +1351,9 @@ void HTMLContentSink::DidBuildModel(void){ * * @update 5/7/98 gess */ -void HTMLContentSink::WillInterrupt(void) { +void +HTMLContentSink::WillInterrupt(void) +{ } /** @@ -1335,7 +1362,9 @@ void HTMLContentSink::WillInterrupt(void) { * * @update 5/7/98 gess */ -void HTMLContentSink::WillResume(void) { +void +HTMLContentSink::WillResume(void) +{ } //---------------------------------------------------------------------- diff --git a/mozilla/layout/html/document/src/nsHTMLContentSink.cpp b/mozilla/layout/html/document/src/nsHTMLContentSink.cpp index 174baaf1a73..b944e3d9b84 100644 --- a/mozilla/layout/html/document/src/nsHTMLContentSink.cpp +++ b/mozilla/layout/html/document/src/nsHTMLContentSink.cpp @@ -210,6 +210,7 @@ protected: PRTime mLastUpdateTime; PRTime mUpdateDelta; PRBool mLayoutStarted; + PRInt32 mInMonolithicContainer; }; // Note: operator new zeros our memory @@ -281,14 +282,6 @@ PRInt32 HTMLContentSink::CloseHTML(const nsIParserNode& aNode) NS_ASSERTION(mStackPos > 0, "bad bad"); mNodeStack[--mStackPos] = eHTMLTag_unknown; - PRInt32 i, ns = mDocument->GetNumberOfShells(); - for (i = 0; i < ns; i++) { - nsIPresShell* shell = mDocument->GetShellAt(i); - if (nsnull != shell) { - shell->BeginObservingDocument(); - NS_RELEASE(shell); - } - } NS_IF_RELEASE(mCurrentForm); return 0; @@ -333,7 +326,7 @@ PRInt32 HTMLContentSink::OpenBody(const nsIParserNode& aNode) nsIAtom* atom = NS_NewAtom("BODY"); nsresult rv = NS_NewBodyPart(&mBody, atom); if (NS_OK == rv) { - mRoot->AppendChild(mBody); + mRoot->AppendChild(mBody, PR_FALSE); startLayout = PR_TRUE; } NS_RELEASE(atom); @@ -369,7 +362,6 @@ PRInt32 HTMLContentSink::CloseBody(const nsIParserNode& aNode) mNodeStack[--mStackPos] = eHTMLTag_unknown; // Reflow any lingering content - ReflowNewContent(); return 0; } @@ -514,6 +506,7 @@ PRInt32 HTMLContentSink::OpenContainer(const nsIParserNode& aNode) case eHTMLTag_table: rv = NS_NewTablePart(&container, atom); + mInMonolithicContainer++; break; case eHTMLTag_caption: @@ -598,44 +591,41 @@ PRInt32 HTMLContentSink::CloseContainer(const nsIParserNode& aNode) switch (aNode.GetNodeType()) { case eHTMLTag_option: ProcessCloseOPTIONTag(aNode); - - eHTMLTags parentType; - parent = GetCurrentContainer(&parentType); - container->Compact(); - - if(parent) { - parent->AppendChild(container); - } break; case eHTMLTag_select: ProcessCloseSELECTTag(aNode); // add fall through - - default: - if (nsnull != container) { - // Now that this container is complete, append it to it's parent - eHTMLTags parentType; - parent = GetCurrentContainer(&parentType); - container->Compact(); - - if(parent) { - parent->AppendChild(container); - if (parent == mBody) { - // We just closed a child of the body off. Trigger a - // content-appended reflow if enough time has elapsed - PRTime now = PR_Now(); - /* XXX this expression doesn't compile on the Mac - kipp said it had to do with a type issue. - if (now - mLastUpdateTime >= mUpdateDelta) { - mLastUpdateTime = now; - mUpdateDelta += mUpdateDelta; - ReflowNewContent(); - }*/ - } - } - NS_RELEASE(container); - } break; + + case eHTMLTag_table: + mInMonolithicContainer--; + break; + } + + if (nsnull != container) { + // Now that this container is complete, append it to it's parent + eHTMLTags parentType; + parent = GetCurrentContainer(&parentType); + container->Compact(); + + if (nsnull != parent) { + parent->AppendChild(container, parent == mBody ? PR_TRUE : PR_FALSE); +#if XXX + if (parent == mBody) { + // We just closed a child of the body off. Trigger a + // content-appended reflow if enough time has elapsed + PRTime now = PR_Now(); + /* XXX this expression doesn't compile on the Mac + kipp said it had to do with a type issue. + if (now - mLastUpdateTime >= mUpdateDelta) { + mLastUpdateTime = now; + mUpdateDelta += mUpdateDelta; + ReflowNewContent(); + }*/ + } +#endif + } + NS_RELEASE(container); } return 0; @@ -662,6 +652,19 @@ void HTMLContentSink::StartLayout() void HTMLContentSink::ReflowNewContent() { + PRInt32 i, ns = mDocument->GetNumberOfShells(); + for (i = 0; i < ns; i++) { + nsIPresShell* shell = mDocument->GetShellAt(i); + if (nsnull != shell) { + nsIPresContext* cx = shell->GetPresContext(); + nsRect r; + cx->GetVisibleArea(r); + shell->ResizeReflow(r.width, r.height); + NS_RELEASE(cx); + NS_RELEASE(shell); + } + } +#if XXX printf("reflow body\n"); // Trigger reflows in each of the presentation shells @@ -673,6 +676,7 @@ void HTMLContentSink::ReflowNewContent() NS_RELEASE(shell); } } +#endif } PRBool HTMLContentSink::CloseTopmostContainer() @@ -805,7 +809,7 @@ PRInt32 HTMLContentSink::AddLeaf(const nsIParserNode& aNode) if (NS_OK == rv) { if (nsnull != leaf) { if (nsnull != parent) { - parent->AppendChild(leaf); + parent->AppendChild(leaf, parent == mBody ? PR_TRUE : PR_FALSE); } else { // XXX drop stuff on the floor that doesn't have a container! // Bad parser! @@ -1301,22 +1305,43 @@ nsresult HTMLContentSink::ProcessWBRTag(nsIHTMLContent** aInstancePtrResult, return rv; } - /** - * This method gets called when the parser begins the process - * of building the content model via the content sink. - * - * @update 5/7/98 gess +/** + * This method gets called when the parser begins the process + * of building the content model via the content sink. + * + * @update 5/7/98 gess */ -void HTMLContentSink::WillBuildModel(void){ +void +HTMLContentSink::WillBuildModel(void) +{ + PR_LogPrint("WillBuildModel"); + mDocument->BeginLoad(); + + // XXX temporary + PRInt32 i, ns = mDocument->GetNumberOfShells(); + for (i = 0; i < ns; i++) { + nsIPresShell* shell = mDocument->GetShellAt(i); + if (nsnull != shell) { + shell->BeginObservingDocument(); + NS_RELEASE(shell); + } + } + + StartLayout(); } - /** - * This method gets called when the parser concludes the process - * of building the content model via the content sink. - * - * @update 5/7/98 gess +/** + * This method gets called when the parser concludes the process + * of building the content model via the content sink. + * + * @update 5/7/98 gess */ -void HTMLContentSink::DidBuildModel(void){ +void +HTMLContentSink::DidBuildModel(void) +{ + PR_LogPrint("DidBuildModel"); + ReflowNewContent(); + mDocument->EndLoad(); } /** @@ -1326,7 +1351,9 @@ void HTMLContentSink::DidBuildModel(void){ * * @update 5/7/98 gess */ -void HTMLContentSink::WillInterrupt(void) { +void +HTMLContentSink::WillInterrupt(void) +{ } /** @@ -1335,7 +1362,9 @@ void HTMLContentSink::WillInterrupt(void) { * * @update 5/7/98 gess */ -void HTMLContentSink::WillResume(void) { +void +HTMLContentSink::WillResume(void) +{ } //----------------------------------------------------------------------