Fix for bug 192139 (Integrate latest Expat). r=bz, sr=jst.

This commit is contained in:
peterv%propagandism.org 2005-11-02 07:42:27 +00:00
parent fbb5ac336c
commit 21420dfee7
5 changed files with 85 additions and 38 deletions

View File

@ -83,9 +83,74 @@ txExpandedName::init(const nsAString& aQName, txNamespaceMap* aResolver,
//- Implementation of XMLUtils -/
//------------------------------/
// static
nsresult
XMLUtils::splitXMLName(const nsAString& aName, nsIAtom** aPrefix,
nsIAtom** aLocalName)
XMLUtils::splitExpatName(const PRUnichar *aExpatName, nsIAtom **aPrefix,
nsIAtom **aLocalName, PRInt32* aNameSpaceID)
{
/**
* Expat can send the following:
* localName
* namespaceURI<separator>localName
* namespaceURI<separator>localName<separator>prefix
*
* and we use 0xFFFF for the <separator>.
*
*/
const PRUnichar *uriEnd = nsnull;
const PRUnichar *nameEnd = nsnull;
const PRUnichar *pos;
for (pos = aExpatName; *pos; ++pos) {
if (*pos == 0xFFFF) {
if (uriEnd) {
nameEnd = pos;
}
else {
uriEnd = pos;
}
}
}
const PRUnichar *nameStart;
if (uriEnd) {
*aNameSpaceID =
txNamespaceManager::getNamespaceID(nsDependentSubstring(aExpatName,
uriEnd));
if (*aNameSpaceID == kNameSpaceID_Unknown) {
return NS_ERROR_FAILURE;
}
nameStart = (uriEnd + 1);
if (nameEnd) {
const PRUnichar *prefixStart = nameEnd + 1;
*aPrefix = NS_NewAtom(NS_ConvertUTF16toUTF8(prefixStart,
pos - prefixStart));
if (!*aPrefix) {
return NS_ERROR_OUT_OF_MEMORY;
}
}
else {
nameEnd = pos;
*aPrefix = nsnull;
}
}
else {
*aNameSpaceID = kNameSpaceID_None;
nameStart = aExpatName;
nameEnd = pos;
*aPrefix = nsnull;
}
*aLocalName = NS_NewAtom(NS_ConvertUTF16toUTF8(nameStart,
nameEnd - nameStart));
return *aLocalName ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
}
nsresult
XMLUtils::splitQName(const nsAString& aName, nsIAtom** aPrefix,
nsIAtom** aLocalName)
{
const nsAFlatString& qName = PromiseFlatString(aName);
const PRUnichar* colon;

View File

@ -127,8 +127,11 @@ extern nsIParserService *gTxParserService;
class XMLUtils {
public:
static nsresult splitXMLName(const nsAString& aName, nsIAtom** aPrefix,
nsIAtom** aLocalName);
static nsresult splitExpatName(const PRUnichar *aExpatName,
nsIAtom **aPrefix, nsIAtom **aLocalName,
PRInt32* aNameSpaceID);
static nsresult splitQName(const nsAString& aName, nsIAtom** aPrefix,
nsIAtom** aLocalName);
static const nsDependentSubstring getLocalPart(const nsAString& src);
/*

View File

@ -46,7 +46,6 @@
#include "nsIHttpEventSink.h"
#include "nsIInterfaceRequestor.h"
#include "nsILoadGroup.h"
#include "nsINameSpace.h"
#include "nsINameSpaceManager.h"
#include "nsINodeInfo.h"
#include "nsIParser.h"

View File

@ -960,8 +960,8 @@ txFnStartStripSpace(PRInt32 aNamespaceID,
const nsASingleFragmentString& name = tokenizer.nextToken();
PRInt32 ns = kNameSpaceID_None;
nsCOMPtr<nsIAtom> prefix, localName;
rv = XMLUtils::splitXMLName(name, getter_AddRefs(prefix),
getter_AddRefs(localName));
rv = XMLUtils::splitQName(name, getter_AddRefs(prefix),
getter_AddRefs(localName));
if (NS_FAILED(rv)) {
// check for "*" or "prefix:*"
PRUint32 length = name.Length();
@ -978,9 +978,9 @@ txFnStartStripSpace(PRInt32 aNamespaceID,
if (c[length-2] != ':') {
return NS_ERROR_XSLT_PARSE_FAILURE;
}
rv = XMLUtils::splitXMLName(Substring(name, 0, length-2),
getter_AddRefs(prefix),
getter_AddRefs(localName));
rv = XMLUtils::splitQName(Substring(name, 0, length-2),
getter_AddRefs(prefix),
getter_AddRefs(localName));
if (NS_FAILED(rv) || prefix) {
// bad chars or two ':'
return NS_ERROR_XSLT_PARSE_FAILURE;

View File

@ -152,9 +152,10 @@ txStylesheetCompiler::startElement(const PRUnichar *aName,
PRBool hasOwnNamespaceMap = PR_FALSE;
PRInt32 i;
for (i = 0; i < aAttrCount; ++i) {
rv = XMLUtils::splitXMLName(nsDependentString(aAttrs[i * 2]),
getter_AddRefs(atts[i].mPrefix),
getter_AddRefs(atts[i].mLocalName));
rv = XMLUtils::splitExpatName(aAttrs[i * 2],
getter_AddRefs(atts[i].mPrefix),
getter_AddRefs(atts[i].mLocalName),
&atts[i].mNamespaceID);
NS_ENSURE_SUCCESS(rv, rv);
atts[i].mValue.Append(aAttrs[i * 2 + 1]);
@ -162,7 +163,7 @@ txStylesheetCompiler::startElement(const PRUnichar *aName,
if (atts[i].mPrefix == txXMLAtoms::xmlns) {
prefixToBind = atts[i].mLocalName;
}
else if (!atts[i].mPrefix && atts[i].mLocalName == txXMLAtoms::xmlns) {
else if (atts[i].mNamespaceID == kNameSpaceID_XMLNS) {
prefixToBind = txXMLAtoms::_empty;
}
@ -184,33 +185,12 @@ txStylesheetCompiler::startElement(const PRUnichar *aName,
}
}
for (i = 0; i < aAttrCount; ++i) {
if (atts[i].mPrefix && atts[i].mPrefix != txXMLAtoms::xmlns) {
atts[i].mNamespaceID =
mElementContext->mMappings->lookupNamespace(atts[i].mPrefix);
NS_ENSURE_TRUE(atts[i].mNamespaceID != kNameSpaceID_Unknown,
NS_ERROR_FAILURE);
}
else if (atts[i].mPrefix == txXMLAtoms::xmlns ||
(!atts[i].mPrefix &&
atts[i].mLocalName == txXMLAtoms::xmlns)) {
atts[i].mNamespaceID = kNameSpaceID_XMLNS;
}
else {
atts[i].mNamespaceID = kNameSpaceID_None;
}
}
nsCOMPtr<nsIAtom> prefix, localname;
rv = XMLUtils::splitXMLName(nsDependentString(aName),
getter_AddRefs(prefix),
getter_AddRefs(localname));
PRInt32 namespaceID;
rv = XMLUtils::splitExpatName(aName, getter_AddRefs(prefix),
getter_AddRefs(localname), &namespaceID);
NS_ENSURE_SUCCESS(rv, rv);
PRInt32 namespaceID = mElementContext->mMappings->lookupNamespace(prefix);
NS_ENSURE_TRUE(namespaceID != kNameSpaceID_Unknown, NS_ERROR_FAILURE);
PRInt32 idOffset = aIDOffset;
if (idOffset > 0) {
idOffset /= 2;