Bug 394887, create widgets for popups lazily, second attempt with a slight change to see if performance is ok

This commit is contained in:
enndeakin@sympatico.ca 2007-09-16 08:51:27 -07:00
Родитель fa7e748a56
Коммит 994e392924
2 изменённых файлов: 23 добавлений и 16 удалений

Просмотреть файл

@ -254,6 +254,28 @@ nsMenuPopupFrame::SetInitialChildList(nsIAtom* aListName,
return nsBoxFrame::SetInitialChildList(aListName, aChildList);
}
PRBool
nsMenuPopupFrame::IsLeaf() const
{
if (mGeneratedChildren)
return PR_FALSE;
if (mPopupType != ePopupTypeMenu) {
// any panel with a type attribute, such as the autocomplete popup,
// is always generated right away.
return !mContent->HasAttr(kNameSpaceID_None, nsGkAtoms::type);
}
// menu popups generate their child frames lazily only when opened, so
// behave like a leaf frame. However, generate child frames normally if
// the parent menu has a sizetopopup attribute. In this case the size of
// the parent menu is dependant on the size of the popup, so the frames
// need to exist in order to calculate this size.
nsIContent* parentContent = mContent->GetParent();
return (parentContent &&
!parentContent->HasAttr(kNameSpaceID_None, nsGkAtoms::sizetopopup));
}
void
nsMenuPopupFrame::AdjustView()
{

Просмотреть файл

@ -183,22 +183,7 @@ public:
NS_IMETHOD SetInitialChildList(nsIAtom* aListName,
nsIFrame* aChildList);
virtual PRBool IsLeaf() const
{
if (!mGeneratedChildren && mPopupType == ePopupTypeMenu) {
// menu popups generate their child frames lazily only when opened, so
// behave like a leaf frame. However, generate child frames normally if
// the parent menu has a sizetopopup attribute. In this case the size of
// the parent menu is dependant on the size of the popup, so the frames
// need to exist in order to calculate this size.
nsIContent* parentContent = mContent->GetParent();
if (parentContent &&
!parentContent->HasAttr(kNameSpaceID_None, nsGkAtoms::sizetopopup))
return PR_TRUE;
}
return PR_FALSE;
}
virtual PRBool IsLeaf() const;
// AdjustView should be called by the parent frame after the popup has been
// laid out, so that the view can be shown.