From 97573598b3bbeed578a3ae5cbdeba7298f4b91c3 Mon Sep 17 00:00:00 2001 From: "hyatt%netscape.com" Date: Wed, 21 Feb 2001 03:18:45 +0000 Subject: [PATCH] Fix a frame creation slowdown caused by XBL. 2-3% speedup. r=danm, sr=waterson --- content/xbl/src/nsBindingManager.cpp | 11 ++++++++--- layout/base/nsCSSFrameConstructor.cpp | 8 ++++++++ layout/html/style/src/nsCSSFrameConstructor.cpp | 8 ++++++++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/content/xbl/src/nsBindingManager.cpp b/content/xbl/src/nsBindingManager.cpp index a43e858bbd68..a6bcf662d52c 100644 --- a/content/xbl/src/nsBindingManager.cpp +++ b/content/xbl/src/nsBindingManager.cpp @@ -785,6 +785,8 @@ nsBindingManager::SetAnonymousNodesFor(nsIContent* aContent, nsISupportsArray* a NS_IMETHODIMP nsBindingManager::GetXBLChildNodesFor(nsIContent* aContent, nsIDOMNodeList** aResult) { + *aResult = nsnull; + PRUint32 length; // Retrieve the anonymous content that we should build. @@ -798,9 +800,12 @@ nsBindingManager::GetXBLChildNodesFor(nsIContent* aContent, nsIDOMNodeList** aRe // We may have an altered list of children from XBL insertion points. // If we don't have any anonymous kids, we next check to see if we have // insertion points. - if (! *aResult) - GetContentListFor(aContent, aResult); - + if (! *aResult) { + if (mContentListTable) { + nsISupportsKey key(aContent); + *aResult = NS_STATIC_CAST(nsIDOMNodeList*, mContentListTable->Get(&key)); + } + } return NS_OK; } diff --git a/layout/base/nsCSSFrameConstructor.cpp b/layout/base/nsCSSFrameConstructor.cpp index 9fecf758e5ce..007a263f915a 100644 --- a/layout/base/nsCSSFrameConstructor.cpp +++ b/layout/base/nsCSSFrameConstructor.cpp @@ -49,6 +49,7 @@ #include "nsStyleConsts.h" #include "nsTableOuterFrame.h" #include "nsIXMLDocument.h" +#include "nsIDOMXULElement.h" #include "nsIWebShell.h" #include "nsHTMLContainerFrame.h" #include "nsINameSpaceManager.h" @@ -814,6 +815,11 @@ struct ChildIterator mBindingManager->GetXBLChildNodesFor(mContent, getter_AddRefs(mNodes)); if (mNodes) mNodes->GetLength(&mLength); + else { + PRInt32 l; + mContent->ChildCount(l); + mLength = l; + } } PRBool HasMoreChildren() { @@ -826,6 +832,8 @@ struct ChildIterator mNodes->Item(mIndex, getter_AddRefs(node)); node->QueryInterface(NS_GET_IID(nsIContent), (void**)aChild); } + else + mContent->ChildAt(mIndex, *aChild); // Addref happens here. mIndex++; } }; diff --git a/layout/html/style/src/nsCSSFrameConstructor.cpp b/layout/html/style/src/nsCSSFrameConstructor.cpp index 9fecf758e5ce..007a263f915a 100644 --- a/layout/html/style/src/nsCSSFrameConstructor.cpp +++ b/layout/html/style/src/nsCSSFrameConstructor.cpp @@ -49,6 +49,7 @@ #include "nsStyleConsts.h" #include "nsTableOuterFrame.h" #include "nsIXMLDocument.h" +#include "nsIDOMXULElement.h" #include "nsIWebShell.h" #include "nsHTMLContainerFrame.h" #include "nsINameSpaceManager.h" @@ -814,6 +815,11 @@ struct ChildIterator mBindingManager->GetXBLChildNodesFor(mContent, getter_AddRefs(mNodes)); if (mNodes) mNodes->GetLength(&mLength); + else { + PRInt32 l; + mContent->ChildCount(l); + mLength = l; + } } PRBool HasMoreChildren() { @@ -826,6 +832,8 @@ struct ChildIterator mNodes->Item(mIndex, getter_AddRefs(node)); node->QueryInterface(NS_GET_IID(nsIContent), (void**)aChild); } + else + mContent->ChildAt(mIndex, *aChild); // Addref happens here. mIndex++; } };