rv = mRoot->GetAttribute(kNameSpaceID_None, nsXULAtoms::containment, containment);
rv = mRoot->GetAttr(kNameSpaceID_None, nsXULAtoms::containment, containment);
nsXULTemplateBuilder::ComputeContainmentProperties(){    // The 'containment' attribute on the root node is a    // whitespace-separated list that tells us which properties we    // should use to test for containment.    nsresult rv;    mContainmentProperties.Clear();    nsAutoString containment;    rv = mRoot->GetAttribute(kNameSpaceID_None, nsXULAtoms::containment, containment);    if (NS_FAILED(rv)) return rv;    PRUint32 len = containment.Length();    PRUint32 offset = 0;    while (offset < len) {        while (offset < len && nsCRT::IsAsciiSpace(containment[offset]))            ++offset;        if (offset >= len)            break;        PRUint32 end = offset;        while (end < len && !nsCRT::IsAsciiSpace(containment[end]))            ++end;        nsAutoString propertyStr;        containment.Mid(propertyStr, offset, end - offset);        nsCOMPtr<nsIRDFResource> property;        rv = gRDFService->GetUnicodeResource(propertyStr.GetUnicode(), getter_AddRefs(property));        if (NS_FAILED(rv)) return rv;        rv = mContainmentProperties.Add(property);        if (NS_FAILED(rv)) return rv;        offset = end;    }#define TREE_PROPERTY_HACK 1#if defined(TREE_PROPERTY_HACK)    if (! len) {        // Some ever-present membership tests.        mContainmentProperties.Add(kNC_child);        mContainmentProperties.Add(kNC_Folder);    }#endif    return NS_OK;}