nsresult txMozillaXMLOutput::endElement() { TX_ENSURE_CURRENTNODE; if (mBadChildLevel) { --mBadChildLevel; PR_LOG(txLog::xslt, PR_LOG_DEBUG, ("endElement, mBadChildLevel = %d\n", mBadChildLevel)); return NS_OK; } --mTreeDepth; nsresult rv = closePrevious(true); NS_ENSURE_SUCCESS(rv, rv); NS_ASSERTION(mCurrentNode->IsElement(), "borked mCurrentNode"); NS_ENSURE_TRUE(mCurrentNode->IsElement(), NS_ERROR_UNEXPECTED); Element* element = mCurrentNode->AsElement(); // Handle html-elements if (!mNoFixup) { if (element->IsHTML()) { rv = endHTMLElement(element); NS_ENSURE_SUCCESS(rv, rv); } // Handle elements that are different when parser-created PRInt32 ns = element->GetNameSpaceID(); nsIAtom* localName = element->Tag(); if ((ns == kNameSpaceID_XHTML && (localName == nsGkAtoms::title || localName == nsGkAtoms::object || localName == nsGkAtoms::applet || localName == nsGkAtoms::select || localName == nsGkAtoms::textarea)) || (ns == kNameSpaceID_SVG && localName == nsGkAtoms::title)) { element->DoneAddingChildren(true); } else if ((ns == kNameSpaceID_XHTML || ns == kNameSpaceID_SVG) && localName == nsGkAtoms::script) { nsCOMPtr<nsIScriptElement> sele = do_QueryInterface(element); NS_ABORT_IF_FALSE(sele, "script elements need to implement nsIScriptElement"); bool block = sele->AttemptToExecute(); // If the act of insertion evaluated the script, we're fine. // Else, add this script element to the array of loading scripts. if (block) { rv = mNotifier->AddScriptElement(sele); NS_ENSURE_SUCCESS(rv, rv); } } else if (ns == kNameSpaceID_XHTML && (localName == nsGkAtoms::input || localName == nsGkAtoms::button || localName == nsGkAtoms::menuitem #ifdef MOZ_MEDIA || localName == nsGkAtoms::audio || localName == nsGkAtoms::video #endif )) { element->DoneCreatingElement(); } } if (mCreatingNewDocument) { // Handle all sorts of stylesheets nsCOMPtr<nsIStyleSheetLinkingElement> ssle = do_QueryInterface(mCurrentNode); if (ssle) { ssle->SetEnableUpdates(true); bool willNotify; bool isAlternate; nsresult rv = ssle->UpdateStyleSheet(mNotifier, &willNotify, &isAlternate); if (mNotifier && NS_SUCCEEDED(rv) && willNotify && !isAlternate) { mNotifier->AddPendingStylesheet(); } } } // Add the element to the tree if it wasn't added before and take one step // up the tree PRUint32 last = mCurrentNodeStack.Count() - 1; NS_ASSERTION(last != (PRUint32)-1, "empty stack"); nsCOMPtr<nsINode> parent = mCurrentNodeStack.SafeObjectAt(last); mCurrentNodeStack.RemoveObjectAt(last); if (mCurrentNode == mNonAddedNode) { if (parent == mDocument) { NS_ASSERTION(!mRootContentCreated, "Parent to add to shouldn't be a document if we " "have a root content"); mRootContentCreated = true; } // Check to make sure that script hasn't inserted the node somewhere // else in the tree if (!mCurrentNode->GetNodeParent()) { parent->AppendChildTo(mNonAddedNode, true); } mNonAddedNode = nsnull; } mCurrentNode = parent; mTableState = static_cast<TableState>(NS_PTR_TO_INT32(mTableStateStack.pop())); return NS_OK; }
nsresult txMozillaXMLOutput::endElement() { TX_ENSURE_CURRENTNODE; if (mBadChildLevel) { --mBadChildLevel; MOZ_LOG(txLog::xslt, LogLevel::Debug, ("endElement, mBadChildLevel = %d\n", mBadChildLevel)); return NS_OK; } --mTreeDepth; nsresult rv = closePrevious(true); NS_ENSURE_SUCCESS(rv, rv); NS_ASSERTION(mCurrentNode->IsElement(), "borked mCurrentNode"); NS_ENSURE_TRUE(mCurrentNode->IsElement(), NS_ERROR_UNEXPECTED); Element* element = mCurrentNode->AsElement(); // Handle html-elements if (!mNoFixup) { if (element->IsHTMLElement()) { rv = endHTMLElement(element); NS_ENSURE_SUCCESS(rv, rv); } // Handle elements that are different when parser-created if (element->IsAnyOfHTMLElements(nsGkAtoms::title, nsGkAtoms::object, nsGkAtoms::select, nsGkAtoms::textarea) || element->IsSVGElement(nsGkAtoms::title)) { element->DoneAddingChildren(true); } else if (element->IsSVGElement(nsGkAtoms::script) || element->IsHTMLElement(nsGkAtoms::script)) { nsCOMPtr<nsIScriptElement> sele = do_QueryInterface(element); if (sele) { bool block = sele->AttemptToExecute(); // If the act of insertion evaluated the script, we're fine. // Else, add this script element to the array of loading scripts. if (block) { rv = mNotifier->AddScriptElement(sele); NS_ENSURE_SUCCESS(rv, rv); } } else { MOZ_ASSERT(nsNameSpaceManager::GetInstance()->mSVGDisabled, "Script elements need to implement nsIScriptElement and SVG wasn't disabled."); } } else if (element->IsAnyOfHTMLElements(nsGkAtoms::input, nsGkAtoms::button, nsGkAtoms::menuitem, nsGkAtoms::audio, nsGkAtoms::video)) { element->DoneCreatingElement(); } } if (mCreatingNewDocument) { // Handle all sorts of stylesheets nsCOMPtr<nsIStyleSheetLinkingElement> ssle = do_QueryInterface(mCurrentNode); if (ssle) { ssle->SetEnableUpdates(true); bool willNotify; bool isAlternate; nsresult rv = ssle->UpdateStyleSheet(mNotifier, &willNotify, &isAlternate); if (mNotifier && NS_SUCCEEDED(rv) && willNotify && !isAlternate) { mNotifier->AddPendingStylesheet(); } } } // Add the element to the tree if it wasn't added before and take one step // up the tree uint32_t last = mCurrentNodeStack.Count() - 1; NS_ASSERTION(last != (uint32_t)-1, "empty stack"); nsCOMPtr<nsINode> parent = mCurrentNodeStack.SafeObjectAt(last); mCurrentNodeStack.RemoveObjectAt(last); if (mCurrentNode == mNonAddedNode) { if (parent == mDocument) { NS_ASSERTION(!mRootContentCreated, "Parent to add to shouldn't be a document if we " "have a root content"); mRootContentCreated = true; } // Check to make sure that script hasn't inserted the node somewhere // else in the tree if (!mCurrentNode->GetParentNode()) { parent->AppendChildTo(mNonAddedNode, true); } mNonAddedNode = nullptr; } mCurrentNode = parent; mTableState = static_cast<TableState>(NS_PTR_TO_INT32(mTableStateStack.pop())); return NS_OK; }