NS_IMETHODIMP nsHTMLContentSerializer::AppendElementEnd(nsIDOMElement *aElement, nsAString& aStr) { NS_ENSURE_ARG(aElement); nsCOMPtr<nsIContent> content = do_QueryInterface(aElement); if (!content) return NS_ERROR_FAILURE; nsIAtom *name = content->Tag(); if (name == nsGkAtoms::script || name == nsGkAtoms::style || name == nsGkAtoms::noscript || name == nsGkAtoms::noframes) { --mDisableEntityEncoding; } PRBool forceFormat = content->HasAttr(kNameSpaceID_None, nsGkAtoms::mozdirty); if ((mDoFormat || forceFormat) && !mPreLevel && !mDoRaw) { DecrIndentation(name); } if (name == nsGkAtoms::script) { nsCOMPtr<nsIScriptElement> script = do_QueryInterface(aElement); if (script && script->IsMalformed()) { // We're looking at a malformed script tag. This means that the end tag // was missing in the source. Imitate that here by not serializing the end // tag. --mPreLevel; return NS_OK; } } else 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); } } nsIParserService* parserService = nsContentUtils::GetParserService(); if (parserService) { PRBool isContainer; parserService->IsContainer(parserService->HTMLAtomTagToId(name), isContainer); if (!isContainer) return NS_OK; } if ((mDoFormat || forceFormat) && !mPreLevel && !mDoRaw) { PRBool lineBreakBeforeClose = LineBreakBeforeClose(content->GetNameSpaceID(), name); if (mColPos && lineBreakBeforeClose) { AppendNewLineToString(aStr); } if (!mColPos) { AppendIndentation(aStr); } else if (mAddSpace) { AppendToString(PRUnichar(' '), aStr); mAddSpace = PR_FALSE; } } else if (mAddSpace) { AppendToString(PRUnichar(' '), aStr); mAddSpace = PR_FALSE; } nsAutoString nameStr; name->ToString(nameStr); AppendToString(kEndTag, aStr); AppendToString(nameStr.get(), -1, aStr); AppendToString(kGreaterThan, aStr); MaybeLeaveFromPreContent(content); if ((mDoFormat || forceFormat) && !mPreLevel && !mDoRaw && LineBreakAfterClose(content->GetNameSpaceID(), name)) { AppendNewLineToString(aStr); } else { MaybeFlagNewlineForRootNode(aElement); } if (name == nsGkAtoms::body) { --mInBody; } return NS_OK; }
NS_IMETHODIMP nsHTMLContentSerializer::AppendElementEnd(nsIDOMElement *aElement, nsAString& aStr) { NS_ENSURE_ARG(aElement); nsCOMPtr<nsIContent> content = do_QueryInterface(aElement); if (!content) return NS_ERROR_FAILURE; PRBool hasDirtyAttr = content->HasAttr(kNameSpaceID_None, nsGkAtoms::mozdirty); nsIAtom *name = content->Tag(); if (name == nsGkAtoms::script) { nsCOMPtr<nsIScriptElement> script = do_QueryInterface(aElement); if (script && script->IsMalformed()) { // We're looking at a malformed script tag. This means that the end tag // was missing in the source. Imitate that here by not serializing the end // tag. return NS_OK; } } if (name == nsGkAtoms::pre || name == nsGkAtoms::script || name == nsGkAtoms::style) { mPreLevel--; } if (mIsCopying && (name == nsGkAtoms::ol)) { NS_ASSERTION((mOLStateStack.Count() > 0), "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.Count() > 0) { olState* state = (olState*)mOLStateStack.ElementAt(mOLStateStack.Count() -1); mOLStateStack.RemoveElementAt(mOLStateStack.Count() -1); delete state; } } nsIParserService* parserService = nsContentUtils::GetParserService(); if (parserService && (name != nsGkAtoms::style)) { PRBool isContainer; parserService->IsContainer(parserService->HTMLAtomTagToId(name), isContainer); if (!isContainer) return NS_OK; } if (LineBreakBeforeClose(name, hasDirtyAttr)) { AppendToString(mLineBreak, aStr); mMayIgnoreLineBreakSequence = PR_TRUE; mColPos = 0; mAddSpace = PR_FALSE; } else if (mAddSpace) { AppendToString(PRUnichar(' '), aStr); mAddSpace = PR_FALSE; } EndIndentation(name, hasDirtyAttr, aStr); nsAutoString nameStr; name->ToString(nameStr); AppendToString(kEndTag, aStr); AppendToString(nameStr.get(), -1, aStr); AppendToString(kGreaterThan, aStr); if (LineBreakAfterClose(name, hasDirtyAttr)) { AppendToString(mLineBreak, aStr); mMayIgnoreLineBreakSequence = PR_TRUE; mColPos = 0; } else { MaybeFlagNewline(aElement); } mInCDATA = PR_FALSE; return NS_OK; }