mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-11 20:35:50 +00:00
Fix for bug 192139 (Integrate latest Expat). r=bz, sr=jst.
This commit is contained in:
parent
fbb5ac336c
commit
21420dfee7
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
/*
|
||||
|
@ -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"
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user