bool nsXHTMLContentSerializer::CheckElementEnd(nsIContent * aContent, bool & aForceFormat, nsAString& aStr) { NS_ASSERTION(!mIsHTMLSerializer, "nsHTMLContentSerializer shouldn't call this method !"); aForceFormat = aContent->HasAttr(kNameSpaceID_None, nsGkAtoms::mozdirty); nsIAtom *name = aContent->Tag(); PRInt32 namespaceID = aContent->GetNameSpaceID(); // this method is not called by nsHTMLContentSerializer // so we don't have to check HTML element, just XHTML if (namespaceID == kNameSpaceID_XHTML) { if (mIsCopying && name == nsGkAtoms::ol) { NS_ASSERTION((!mOLStateStack.IsEmpty()), "Cannot have an empty OL Stack"); /* Though at this point we must always have an state to be deleted as all the OL opening tags are supposed to push an olState object to the stack*/ if (!mOLStateStack.IsEmpty()) { mOLStateStack.RemoveElementAt(mOLStateStack.Length() -1); } } if (HasNoChildren(aContent)) { nsIParserService* parserService = nsContentUtils::GetParserService(); if (parserService) { bool isContainer; parserService-> IsContainer(parserService->HTMLCaseSensitiveAtomTagToId(name), isContainer); if (!isContainer) { // non-container HTML elements are already closed, // see AppendEndOfElementStart return false; } } } // for backward compatibility with old HTML user agents, // empty elements should have an ending tag, so we mustn't call // nsXMLContentSerializer::CheckElementEnd return true; } bool dummyFormat; return nsXMLContentSerializer::CheckElementEnd(aContent, dummyFormat, aStr); }
void nsXHTMLContentSerializer::AppendEndOfElementStart(nsIContent *aOriginalElement, nsIAtom * aName, PRInt32 aNamespaceID, nsAString& aStr) { // this method is not called by nsHTMLContentSerializer // so we don't have to check HTML element, just XHTML NS_ASSERTION(!mIsHTMLSerializer, "nsHTMLContentSerializer shouldn't call this method !"); if (kNameSpaceID_XHTML != aNamespaceID) { nsXMLContentSerializer::AppendEndOfElementStart(aOriginalElement, aName, aNamespaceID, aStr); return; } nsIContent* content = aOriginalElement; // for non empty elements, even if they are not a container, we always // serialize their content, because the XHTML element could contain non XHTML // nodes useful in some context, like in an XSLT stylesheet if (HasNoChildren(content)) { nsIParserService* parserService = nsContentUtils::GetParserService(); if (parserService) { bool isContainer; parserService-> IsContainer(parserService->HTMLCaseSensitiveAtomTagToId(aName), isContainer); if (!isContainer) { // for backward compatibility with HTML 4 user agents // only non-container HTML elements can be closed immediatly, // and a space is added before /> AppendToString(NS_LITERAL_STRING(" />"), aStr); return; } } } AppendToString(kGreaterThan, aStr); }
Status Update() override { if (HasNoChildren()) { return Status::Success; } // Keep going until a child behavior says it's running. while (1) { auto &child = children.at(index); auto status = child->Tick(); // If the child fails, or keeps running, do the same. if (status != Status::Success) { return status; } // Hit the end of the array, job done! if (++index == children.size()) { return Status::Success; } } }