void nsHTMLMenuElement::TraverseContent(nsIContent* aContent, nsIMenuBuilder* aBuilder, PRInt8& aSeparator) { nsCOMPtr<nsIContent> child; for (child = aContent->GetFirstChild(); child; child = child->GetNextSibling()) { nsGenericHTMLElement* element = nsGenericHTMLElement::FromContent(child); if (!element) { continue; } nsIAtom* tag = child->Tag(); if (tag == nsGkAtoms::menuitem) { nsHTMLMenuItemElement* menuitem = nsHTMLMenuItemElement::FromContent(child); if (menuitem->IsHidden()) { continue; } nsAutoString label; menuitem->GetLabel(label); if (label.IsEmpty()) { continue; } nsAutoString icon; menuitem->GetIcon(icon); aBuilder->AddItemFor(menuitem, CanLoadIcon(child, icon)); aSeparator = ST_FALSE; } else if (tag == nsGkAtoms::menu && !element->IsHidden()) { if (child->HasAttr(kNameSpaceID_None, nsGkAtoms::label)) { nsAutoString label; child->GetAttr(kNameSpaceID_None, nsGkAtoms::label, label); BuildSubmenu(label, child, aBuilder); aSeparator = ST_FALSE; } else { AddSeparator(aBuilder, aSeparator); TraverseContent(child, aBuilder, aSeparator); AddSeparator(aBuilder, aSeparator); } } } }
void HTMLMenuElement::BuildSubmenu(const nsAString& aLabel, nsIContent* aContent, nsIMenuBuilder* aBuilder) { aBuilder->OpenContainer(aLabel); int8_t separator = ST_TRUE_INIT; TraverseContent(aContent, aBuilder, separator); if (separator == ST_TRUE) { aBuilder->UndoAddSeparator(); } aBuilder->CloseContainer(); }