static nsresult createDocFragment(txIEvalContext *aContext, nsIContent** aResult) { txExecutionState* es = static_cast<txExecutionState*>(aContext->getPrivateContext()); if (!es) { NS_ERROR("Need txExecutionState!"); return NS_ERROR_UNEXPECTED; } const txXPathNode& document = es->getSourceDocument(); nsIDocument *doc = txXPathNativeNode::getDocument(document); nsCOMPtr<nsIDOMDocumentFragment> domFragment; nsresult rv = NS_NewDocumentFragment(getter_AddRefs(domFragment), doc->NodeInfoManager()); NS_ENSURE_SUCCESS(rv, rv); return CallQueryInterface(domFragment, aResult); }
static nsresult convertRtfToNode(txIEvalContext *aContext, txResultTreeFragment *aRtf) { txExecutionState* es = static_cast<txExecutionState*>(aContext->getPrivateContext()); if (!es) { NS_ERROR("Need txExecutionState!"); return NS_ERROR_UNEXPECTED; } const txXPathNode& document = es->getSourceDocument(); nsIDocument *doc = txXPathNativeNode::getDocument(document); nsCOMPtr<nsIDOMDocumentFragment> domFragment; nsresult rv = NS_NewDocumentFragment(getter_AddRefs(domFragment), doc->NodeInfoManager()); NS_ENSURE_SUCCESS(rv, rv); txOutputFormat format; txMozillaXMLOutput mozHandler(&format, domFragment, PR_TRUE); rv = aRtf->flushToHandler(&mozHandler); NS_ENSURE_SUCCESS(rv, rv); rv = mozHandler.closePrevious(PR_TRUE); NS_ENSURE_SUCCESS(rv, rv); // The txResultTreeFragment will own this. const txXPathNode* node = txXPathNativeNode::createXPathNode(domFragment, PR_TRUE); NS_ENSURE_TRUE(node, NS_ERROR_OUT_OF_MEMORY); aRtf->setNode(node); return NS_OK; }
NS_IMETHODIMP nsParserUtils::ParseFragment(const nsAString& aFragment, PRUint32 aFlags, bool aIsXML, nsIURI* aBaseURI, nsIDOMElement* aContextElement, nsIDOMDocumentFragment** aReturn) { NS_ENSURE_ARG(aContextElement); *aReturn = nsnull; nsresult rv; nsCOMPtr<nsIParser> parser = do_CreateInstance(kCParserCID, &rv); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIDocument> document; nsCOMPtr<nsIDOMDocument> domDocument; nsCOMPtr<nsIDOMNode> contextNode; contextNode = do_QueryInterface(aContextElement); contextNode->GetOwnerDocument(getter_AddRefs(domDocument)); document = do_QueryInterface(domDocument); NS_ENSURE_TRUE(document, NS_ERROR_NOT_AVAILABLE); // stop scripts nsRefPtr<nsScriptLoader> loader; bool scripts_enabled = false; if (document) { loader = document->ScriptLoader(); scripts_enabled = loader->GetEnabled(); } if (scripts_enabled) { loader->SetEnabled(false); } // Wrap things in a div or body for parsing, but it won't show up in // the fragment. nsAutoTArray<nsString, 2> tagStack; nsCAutoString base, spec; if (aIsXML) { // XHTML if (aBaseURI) { base.Append(NS_LITERAL_CSTRING(XHTML_DIV_TAG)); base.Append(NS_LITERAL_CSTRING(" xml:base=\"")); aBaseURI->GetSpec(spec); // nsEscapeHTML is good enough, because we only need to get // quotes, ampersands, and angle brackets char* escapedSpec = nsEscapeHTML(spec.get()); if (escapedSpec) base += escapedSpec; NS_Free(escapedSpec); base.Append(NS_LITERAL_CSTRING("\"")); tagStack.AppendElement(NS_ConvertUTF8toUTF16(base)); } else { tagStack.AppendElement(NS_LITERAL_STRING(XHTML_DIV_TAG)); } } if (NS_SUCCEEDED(rv)) { nsCOMPtr<nsIContent> fragment; if (aIsXML) { rv = nsContentUtils::ParseFragmentXML(aFragment, document, tagStack, true, aReturn); fragment = do_QueryInterface(*aReturn); } else { NS_NewDocumentFragment(aReturn, document->NodeInfoManager()); fragment = do_QueryInterface(*aReturn); rv = nsContentUtils::ParseFragmentHTML(aFragment, fragment, nsGkAtoms::body, kNameSpaceID_XHTML, false, true); // Now, set the base URI on all subtree roots. if (aBaseURI) { aBaseURI->GetSpec(spec); nsAutoString spec16; CopyUTF8toUTF16(spec, spec16); nsIContent* node = fragment->GetFirstChild(); while (node) { if (node->IsElement()) { node->SetAttr(kNameSpaceID_XML, nsGkAtoms::base, nsGkAtoms::xml, spec16, false); } node = node->GetNextSibling(); } } } if (fragment) { nsTreeSanitizer sanitizer(aFlags); sanitizer.Sanitize(fragment); } } if (scripts_enabled) loader->SetEnabled(true); return rv; }