void txMozillaXMLOutput::attribute(const nsAString& aName, const PRInt32 aNsID, const nsAString& aValue) { if (!mParentNode) // XXX Signal this? (can't add attributes after element closed) return; if (mBadChildLevel) { return; } nsCOMPtr<nsIDOMElement> element = do_QueryInterface(mCurrentNode); NS_ASSERTION(element, "No element to add the attribute to."); if (!element) // XXX Signal this? (no element to add attributes to) return; if ((mOutputFormat.mMethod == eHTMLOutput) && (aNsID == kNameSpaceID_None)) { // Outputting HTML as XHTML, lowercase attribute names nsAutoString lowerName; TX_ToLowerCase(aName, lowerName); element->SetAttributeNS(EmptyString(), lowerName, aValue); } else { nsAutoString nsURI; gTxNameSpaceManager->GetNameSpaceURI(aNsID, nsURI); element->SetAttributeNS(nsURI, aName, aValue); } }
nsresult txResultStringComparator::createSortableValue(Expr *aExpr, txIEvalContext *aContext, txObject *&aResult) { nsAutoPtr<StringValue> val(new StringValue); if (!val) { return NS_ERROR_OUT_OF_MEMORY; } nsresult rv; #ifdef TX_EXE rv = aExpr->evaluateToString(aContext, val->mStr); NS_ENSURE_SUCCESS(rv, rv); // We don't support case-order on standalone TX_ToLowerCase(val->mStr); #else if (!mCollation) return NS_ERROR_FAILURE; val->mCaseKey = new nsString; if (!val->mCaseKey) { return NS_ERROR_OUT_OF_MEMORY; } nsString& nsCaseKey = *(nsString *)val->mCaseKey; rv = aExpr->evaluateToString(aContext, nsCaseKey); NS_ENSURE_SUCCESS(rv, rv); if (nsCaseKey.IsEmpty()) { aResult = val.forget(); return NS_OK; } rv = mCollation->AllocateRawSortKey(nsICollation::kCollationCaseInSensitive, nsCaseKey, &val->mKey, &val->mLength); NS_ENSURE_SUCCESS(rv, rv); #endif aResult = val.forget(); return NS_OK; }
void txHTMLOutput::startElement(const nsAString& aName, const PRInt32 aNsID) { txXMLOutput::startElement(aName, aNsID); nsCOMPtr<nsIAtom> localAtom; if (aNsID == kNameSpaceID_None) { nsAutoString localName; TX_ToLowerCase(aName, localName); localAtom = do_GetAtom(localName); } else { localAtom = do_GetAtom(aName); } NS_ASSERTION(localAtom, "Can't get atom"); txExpandedName* currentElement = new txExpandedName(aNsID, localAtom); NS_ASSERTION(currentElement, "Can't create currentElement"); if (currentElement) mCurrentElements.push(currentElement); }
nsresult txExprParser::resolveQName(const nsAString& aQName, nsIAtom** aPrefix, txIParseContext* aContext, nsIAtom** aLocalName, PRInt32& aNamespace, bool aIsNameTest) { aNamespace = kNameSpaceID_None; PRInt32 idx = aQName.FindChar(':'); if (idx > 0) { *aPrefix = NS_NewAtom(StringHead(aQName, (PRUint32)idx)); if (!*aPrefix) { return NS_ERROR_OUT_OF_MEMORY; } *aLocalName = NS_NewAtom(Substring(aQName, (PRUint32)idx + 1, aQName.Length() - (idx + 1))); if (!*aLocalName) { NS_RELEASE(*aPrefix); return NS_ERROR_OUT_OF_MEMORY; } return aContext->resolveNamespacePrefix(*aPrefix, aNamespace); } // the lexer dealt with idx == 0 *aPrefix = 0; if (aIsNameTest && aContext->caseInsensitiveNameTests()) { nsAutoString lcname; TX_ToLowerCase(aQName, lcname); *aLocalName = NS_NewAtom(lcname); } else { *aLocalName = NS_NewAtom(aQName); } if (!*aLocalName) { return NS_ERROR_OUT_OF_MEMORY; } return NS_OK; }
void txMozillaXMLOutput::endHTMLElement(nsIDOMElement* aElement) { nsresult rv; nsCOMPtr<nsIContent> content = do_QueryInterface(aElement); NS_ASSERTION(content, "Can't QI to nsIContent"); nsIAtom *atom = content->Tag(); if (mTableState == ADDED_TBODY) { NS_ASSERTION(atom == txHTMLAtoms::tbody, "Element flagged as added tbody isn't a tbody"); nsCOMPtr<nsIDOMNode> parent; mCurrentNode->GetParentNode(getter_AddRefs(parent)); mCurrentNode = parent; mTableState = NS_STATIC_CAST(TableState, NS_PTR_TO_INT32(mTableStateStack.pop())); return; } // Load scripts if (mNotifier && atom == txHTMLAtoms::script) { // Add this script element to the array of loading script elements. nsCOMPtr<nsIScriptElement> scriptElement = do_QueryInterface(mCurrentNode); NS_ASSERTION(scriptElement, "Need script element"); mNotifier->AddScriptElement(scriptElement); } // Set document title else if (mCreatingNewDocument && atom == txHTMLAtoms::title && !mHaveTitleElement) { // The first title wins mHaveTitleElement = PR_TRUE; nsCOMPtr<nsIDOMNSDocument> domDoc = do_QueryInterface(mDocument); nsCOMPtr<nsIDOMNode> textNode; aElement->GetFirstChild(getter_AddRefs(textNode)); if (domDoc && textNode) { nsAutoString text; textNode->GetNodeValue(text); text.CompressWhitespace(); domDoc->SetTitle(text); } } else if (mCreatingNewDocument && atom == txHTMLAtoms::base && !mHaveBaseElement) { // The first base wins mHaveBaseElement = PR_TRUE; nsCOMPtr<nsIDocument> doc = do_QueryInterface(mDocument); NS_ASSERTION(doc, "document doesn't implement nsIDocument"); nsAutoString value; content->GetAttr(kNameSpaceID_None, txHTMLAtoms::target, value); doc->SetBaseTarget(value); content->GetAttr(kNameSpaceID_None, txHTMLAtoms::href, value); nsCOMPtr<nsIURI> baseURI; rv = NS_NewURI(getter_AddRefs(baseURI), value, nsnull); if (NS_FAILED(rv)) return; doc->SetBaseURI(baseURI); // The document checks if it is legal to set this base } else if (mCreatingNewDocument && atom == txHTMLAtoms::meta) { // handle HTTP-EQUIV data nsAutoString httpEquiv; content->GetAttr(kNameSpaceID_None, txHTMLAtoms::httpEquiv, httpEquiv); if (httpEquiv.IsEmpty()) return; nsAutoString value; content->GetAttr(kNameSpaceID_None, txHTMLAtoms::content, value); if (value.IsEmpty()) return; TX_ToLowerCase(httpEquiv); nsCOMPtr<nsIAtom> header = do_GetAtom(httpEquiv); processHTTPEquiv(header, value); } }