Fixing nsbeta2+ bug 33477, completing (more or less) the DOM Level 2 NamedNodeMap implementation, this includes modifying the XML content sink to properly pass attribute prefixes to the content objects. r=vidur@netscape.com

This commit is contained in:
jst%netscape.com 2000-06-23 00:21:32 +00:00
Родитель 2081dfa96c
Коммит 192aa0c82e
22 изменённых файлов: 956 добавлений и 554 удалений

Просмотреть файл

@ -35,10 +35,12 @@ static NS_DEFINE_IID(kIDOMNodeListIID, NS_IDOMNODELIST_IID);
//---------------------------------------------------------------------- //----------------------------------------------------------------------
nsDOMAttribute::nsDOMAttribute(nsIContent* aContent, nsDOMAttribute::nsDOMAttribute(nsIContent* aContent,
const nsString& aName, nsINodeInfo *aNodeInfo,
const nsString& aValue) const nsString& aValue)
: mName(aName), mValue(aValue) : mNodeInfo(aNodeInfo), mValue(aValue)
{ {
NS_ABORT_IF_FALSE(mNodeInfo, "We must get a nodeinfo here!");
NS_INIT_REFCNT(); NS_INIT_REFCNT();
// We don't add a reference to our content. It will tell us // We don't add a reference to our content. It will tell us
// to drop our reference when it goes away. // to drop our reference when it goes away.
@ -117,15 +119,7 @@ NS_IMETHODIMP
nsDOMAttribute::GetContent(nsIContent** aContent) nsDOMAttribute::GetContent(nsIContent** aContent)
{ {
*aContent = mContent; *aContent = mContent;
NS_IF_ADDREF(mContent); NS_IF_ADDREF(*aContent);
return NS_OK;
}
NS_IMETHODIMP
nsDOMAttribute::SetName(const nsString& aName)
{
mName=aName;
return NS_OK; return NS_OK;
} }
@ -163,29 +157,30 @@ nsDOMAttribute::SetScriptObject(void *aScriptObject)
nsresult nsresult
nsDOMAttribute::GetName(nsString& aName) nsDOMAttribute::GetName(nsString& aName)
{ {
aName=mName; NS_ENSURE_TRUE(mNodeInfo, NS_ERROR_FAILURE);
return NS_OK;
return mNodeInfo->GetQualifiedName(aName);
} }
nsresult nsresult
nsDOMAttribute::GetValue(nsString& aValue) nsDOMAttribute::GetValue(nsString& aValue)
{ {
NS_ENSURE_TRUE(mNodeInfo, NS_ERROR_FAILURE);
nsresult result = NS_OK; nsresult result = NS_OK;
if (nsnull != mContent) { if (nsnull != mContent) {
nsIAtom* nameAtom;
PRInt32 nameSpaceID;
nsresult attrResult; nsresult attrResult;
PRInt32 nameSpaceID;
nsCOMPtr<nsIAtom> name;
mNodeInfo->GetNameAtom(*getter_AddRefs(name));
mNodeInfo->GetNamespaceID(nameSpaceID);
mContent->ParseAttributeString(mName, nameAtom, nameSpaceID);
if (kNameSpaceID_Unknown == nameSpaceID) {
nameSpaceID = kNameSpaceID_None; // ignore unknown prefix XXX is this correct?
}
nsAutoString tmpValue; nsAutoString tmpValue;
attrResult = mContent->GetAttribute(nameSpaceID, nameAtom, tmpValue); attrResult = mContent->GetAttribute(nameSpaceID, name, tmpValue);
if (NS_CONTENT_ATTR_NOT_THERE != attrResult) { if (NS_CONTENT_ATTR_NOT_THERE != attrResult) {
mValue = tmpValue; mValue = tmpValue;
} }
NS_IF_RELEASE(nameAtom);
} }
aValue=mValue; aValue=mValue;
return result; return result;
@ -194,17 +189,11 @@ nsDOMAttribute::GetValue(nsString& aValue)
nsresult nsresult
nsDOMAttribute::SetValue(const nsString& aValue) nsDOMAttribute::SetValue(const nsString& aValue)
{ {
NS_ENSURE_TRUE(mNodeInfo, NS_ERROR_FAILURE);
nsresult result = NS_OK; nsresult result = NS_OK;
if (nsnull != mContent) { if (nsnull != mContent) {
nsIAtom* nameAtom; result = mContent->SetAttribute(mNodeInfo, aValue, PR_TRUE);
PRInt32 nameSpaceID;
mContent->ParseAttributeString(mName, nameAtom, nameSpaceID);
if (kNameSpaceID_Unknown == nameSpaceID) {
nameSpaceID = kNameSpaceID_None; // ignore unknown prefix XXX is this correct?
}
result = mContent->SetAttribute(nameSpaceID, nameAtom, aValue, PR_TRUE);
NS_IF_RELEASE(nameAtom);
} }
mValue=aValue; mValue=aValue;
@ -214,22 +203,22 @@ nsDOMAttribute::SetValue(const nsString& aValue)
nsresult nsresult
nsDOMAttribute::GetSpecified(PRBool* aSpecified) nsDOMAttribute::GetSpecified(PRBool* aSpecified)
{ {
NS_ENSURE_TRUE(mNodeInfo, NS_ERROR_FAILURE);
NS_ENSURE_ARG_POINTER(aSpecified);
nsresult result = NS_OK; nsresult result = NS_OK;
if (nsnull == mContent) { if (nsnull == mContent) {
*aSpecified = PR_FALSE; *aSpecified = PR_FALSE;
} } else {
else {
nsAutoString value; nsAutoString value;
nsresult attrResult; nsresult attrResult;
nsIAtom* nameAtom;
PRInt32 nameSpaceID; PRInt32 nameSpaceID;
nsCOMPtr<nsIAtom> name;
mContent->ParseAttributeString(mName, nameAtom, nameSpaceID); mNodeInfo->GetNameAtom(*getter_AddRefs(name));
if (kNameSpaceID_Unknown == nameSpaceID) { mNodeInfo->GetNamespaceID(nameSpaceID);
nameSpaceID = kNameSpaceID_None; // ignore unknown prefix XXX is this correct?
} attrResult = mContent->GetAttribute(nameSpaceID, name, value);
attrResult = mContent->GetAttribute(nameSpaceID, nameAtom, value);
NS_IF_RELEASE(nameAtom);
if (NS_CONTENT_ATTR_HAS_VALUE == attrResult) { if (NS_CONTENT_ATTR_HAS_VALUE == attrResult) {
*aSpecified = PR_TRUE; *aSpecified = PR_TRUE;
} }
@ -277,6 +266,8 @@ nsDOMAttribute::SetNodeValue(const nsString& aNodeValue)
NS_IMETHODIMP NS_IMETHODIMP
nsDOMAttribute::GetNodeType(PRUint16* aNodeType) nsDOMAttribute::GetNodeType(PRUint16* aNodeType)
{ {
NS_ENSURE_ARG_POINTER(aNodeType);
*aNodeType = (PRUint16)nsIDOMNode::ATTRIBUTE_NODE; *aNodeType = (PRUint16)nsIDOMNode::ATTRIBUTE_NODE;
return NS_OK; return NS_OK;
} }
@ -284,6 +275,8 @@ nsDOMAttribute::GetNodeType(PRUint16* aNodeType)
NS_IMETHODIMP NS_IMETHODIMP
nsDOMAttribute::GetParentNode(nsIDOMNode** aParentNode) nsDOMAttribute::GetParentNode(nsIDOMNode** aParentNode)
{ {
NS_ENSURE_ARG_POINTER(aParentNode);
*aParentNode = nsnull; *aParentNode = nsnull;
return NS_OK; return NS_OK;
} }
@ -360,6 +353,8 @@ nsDOMAttribute::GetLastChild(nsIDOMNode** aLastChild)
NS_IMETHODIMP NS_IMETHODIMP
nsDOMAttribute::GetPreviousSibling(nsIDOMNode** aPreviousSibling) nsDOMAttribute::GetPreviousSibling(nsIDOMNode** aPreviousSibling)
{ {
NS_ENSURE_ARG_POINTER(aPreviousSibling);
*aPreviousSibling = nsnull; *aPreviousSibling = nsnull;
return NS_OK; return NS_OK;
} }
@ -367,6 +362,8 @@ nsDOMAttribute::GetPreviousSibling(nsIDOMNode** aPreviousSibling)
NS_IMETHODIMP NS_IMETHODIMP
nsDOMAttribute::GetNextSibling(nsIDOMNode** aNextSibling) nsDOMAttribute::GetNextSibling(nsIDOMNode** aNextSibling)
{ {
NS_ENSURE_ARG_POINTER(aNextSibling);
*aNextSibling = nsnull; *aNextSibling = nsnull;
return NS_OK; return NS_OK;
} }
@ -374,6 +371,8 @@ nsDOMAttribute::GetNextSibling(nsIDOMNode** aNextSibling)
NS_IMETHODIMP NS_IMETHODIMP
nsDOMAttribute::GetAttributes(nsIDOMNamedNodeMap** aAttributes) nsDOMAttribute::GetAttributes(nsIDOMNamedNodeMap** aAttributes)
{ {
NS_ENSURE_ARG_POINTER(aAttributes);
*aAttributes = nsnull; *aAttributes = nsnull;
return NS_OK; return NS_OK;
} }
@ -409,18 +408,17 @@ nsDOMAttribute::CloneNode(PRBool aDeep, nsIDOMNode** aReturn)
if (nsnull != mContent) { if (nsnull != mContent) {
nsAutoString value; nsAutoString value;
nsIAtom* nameAtom;
PRInt32 nameSpaceID; PRInt32 nameSpaceID;
nsCOMPtr<nsIAtom> name;
mNodeInfo->GetNameAtom(*getter_AddRefs(name));
mNodeInfo->GetNamespaceID(nameSpaceID);
mContent->ParseAttributeString(mName, nameAtom, nameSpaceID); mContent->GetAttribute(nameSpaceID, name, value);
if (kNameSpaceID_Unknown == nameSpaceID) { newAttr = new nsDOMAttribute(nsnull, mNodeInfo, value);
nameSpaceID = kNameSpaceID_None; // ignore unknown prefix XXX is this correct?
}
mContent->GetAttribute(nameSpaceID, nameAtom, value);
newAttr = new nsDOMAttribute(nsnull, mName, value);
} }
else { else {
newAttr = new nsDOMAttribute(nsnull, mName, mValue); newAttr = new nsDOMAttribute(nsnull, mNodeInfo, mValue);
} }
if (nsnull == newAttr) { if (nsnull == newAttr) {
@ -452,35 +450,67 @@ nsDOMAttribute::GetOwnerDocument(nsIDOMDocument** aOwnerDocument)
NS_IMETHODIMP NS_IMETHODIMP
nsDOMAttribute::GetNamespaceURI(nsString& aNamespaceURI) nsDOMAttribute::GetNamespaceURI(nsString& aNamespaceURI)
{ {
NS_NOTYETIMPLEMENTED("write me!"); NS_ENSURE_TRUE(mNodeInfo, NS_ERROR_FAILURE);
return NS_ERROR_NOT_IMPLEMENTED;
return mNodeInfo->GetNamespaceURI(aNamespaceURI);
} }
NS_IMETHODIMP NS_IMETHODIMP
nsDOMAttribute::GetPrefix(nsString& aPrefix) nsDOMAttribute::GetPrefix(nsString& aPrefix)
{ {
NS_NOTYETIMPLEMENTED("write me!"); NS_ENSURE_TRUE(mNodeInfo, NS_ERROR_FAILURE);
return NS_ERROR_NOT_IMPLEMENTED;
return mNodeInfo->GetPrefix(aPrefix);
} }
NS_IMETHODIMP NS_IMETHODIMP
nsDOMAttribute::SetPrefix(const nsString& aPrefix) nsDOMAttribute::SetPrefix(const nsString& aPrefix)
{ {
NS_NOTYETIMPLEMENTED("write me!"); NS_ENSURE_TRUE(mNodeInfo, NS_ERROR_FAILURE);
return NS_ERROR_NOT_IMPLEMENTED; nsCOMPtr<nsINodeInfo> newNodeInfo;
nsCOMPtr<nsIAtom> prefix;
nsresult rv = NS_OK;
if (aPrefix.Length())
prefix = dont_AddRef(NS_NewAtom(aPrefix));
rv = mNodeInfo->PrefixChanged(prefix, *getter_AddRefs(newNodeInfo));
NS_ENSURE_SUCCESS(rv, rv);
if (mContent) {
nsCOMPtr<nsIAtom> name;
PRInt32 nameSpaceID;
nsAutoString tmpValue;
mNodeInfo->GetNameAtom(*getter_AddRefs(name));
mNodeInfo->GetNamespaceID(nameSpaceID);
rv = mContent->GetAttribute(nameSpaceID, name, tmpValue);
if (rv == NS_CONTENT_ATTR_HAS_VALUE) {
mContent->UnsetAttribute(nameSpaceID, name, PR_TRUE);
mContent->SetAttribute(newNodeInfo, tmpValue, PR_TRUE);
}
}
mNodeInfo = newNodeInfo;
return NS_OK;
} }
NS_IMETHODIMP NS_IMETHODIMP
nsDOMAttribute::GetLocalName(nsString& aLocalName) nsDOMAttribute::GetLocalName(nsString& aLocalName)
{ {
return GetName(aLocalName); NS_ENSURE_TRUE(mNodeInfo, NS_ERROR_FAILURE);
return mNodeInfo->GetLocalName(aLocalName);
} }
NS_IMETHODIMP NS_IMETHODIMP
nsDOMAttribute::Normalize() nsDOMAttribute::Normalize()
{ {
NS_NOTYETIMPLEMENTED("write me!"); // Nothing to do here
return NS_ERROR_NOT_IMPLEMENTED; return NS_OK;
} }
NS_IMETHODIMP NS_IMETHODIMP

Просмотреть файл

@ -28,6 +28,8 @@
#include "nsIScriptObjectOwner.h" #include "nsIScriptObjectOwner.h"
#include "nsGenericDOMNodeList.h" #include "nsGenericDOMNodeList.h"
#include "nsString.h" #include "nsString.h"
#include "nsCOMPtr.h"
#include "nsINodeInfo.h"
class nsIContent; class nsIContent;
class nsDOMAttribute; class nsDOMAttribute;
@ -41,7 +43,6 @@ public:
NS_IMETHOD DropReference() = 0; NS_IMETHOD DropReference() = 0;
NS_IMETHOD SetContent(nsIContent* aContent) = 0; NS_IMETHOD SetContent(nsIContent* aContent) = 0;
NS_IMETHOD GetContent(nsIContent** aContent) = 0; NS_IMETHOD GetContent(nsIContent** aContent) = 0;
NS_IMETHOD SetName(const nsString& aName) = 0;
}; };
// bogus child list for an attribute // bogus child list for an attribute
@ -69,8 +70,7 @@ class nsDOMAttribute : public nsIDOMAttr,
public nsIDOMAttributePrivate public nsIDOMAttributePrivate
{ {
public: public:
nsDOMAttribute(nsIContent* aContent, nsDOMAttribute(nsIContent* aContent, nsINodeInfo *aNodeInfo,
const nsString& aName,
const nsString& aValue); const nsString& aValue);
virtual ~nsDOMAttribute(); virtual ~nsDOMAttribute();
@ -89,11 +89,10 @@ public:
NS_IMETHOD DropReference(); NS_IMETHOD DropReference();
NS_IMETHOD SetContent(nsIContent* aContent); NS_IMETHOD SetContent(nsIContent* aContent);
NS_IMETHOD GetContent(nsIContent** aContent); NS_IMETHOD GetContent(nsIContent** aContent);
NS_IMETHOD SetName(const nsString& aName);
private: private:
nsIContent* mContent; nsIContent* mContent;
nsString mName; nsCOMPtr<nsINodeInfo> mNodeInfo;
nsString mValue; nsString mValue;
// XXX For now, there's only a single child - a text // XXX For now, there's only a single child - a text
// element representing the value // element representing the value

Просмотреть файл

@ -89,28 +89,6 @@ nsDOMAttributeMap::SetScriptObject(void *aScriptObject)
return NS_OK; return NS_OK;
} }
void
nsDOMAttributeMap::GetNormalizedName(PRInt32 aNameSpaceID,
nsIAtom* aNameAtom,
nsString& aAttrName)
{
nsCOMPtr<nsIAtom> prefix;
aAttrName.Truncate();
mContent->GetNameSpacePrefixFromId(aNameSpaceID, *getter_AddRefs(prefix));
if (prefix) {
prefix->ToString(aAttrName);
aAttrName.AppendWithConversion(":");
}
if (aNameAtom) {
nsAutoString tmp;
aNameAtom->ToString(tmp);
aAttrName.Append(tmp);
}
}
nsresult nsresult
nsDOMAttributeMap::GetNamedItem(const nsString &aAttrName, nsDOMAttributeMap::GetNamedItem(const nsString &aAttrName,
nsIDOMNode** aAttribute) nsIDOMNode** aAttribute)
@ -120,29 +98,51 @@ nsDOMAttributeMap::GetNamedItem(const nsString &aAttrName,
nsresult rv = NS_OK; nsresult rv = NS_OK;
if (mContent) { if (mContent) {
nsCOMPtr<nsIAtom> nameAtom; nsCOMPtr<nsIAtom> nameAtom(dont_AddRef(NS_NewAtom(aAttrName)));
PRInt32 nameSpaceID; nsCOMPtr<nsIAtom> prefix;
nsAutoString normalizedName;
mContent->ParseAttributeString(aAttrName, *getter_AddRefs(nameAtom),
nameSpaceID);
if (kNameSpaceID_Unknown == nameSpaceID) {
return NS_ERROR_DOM_NOT_FOUND_ERR;
}
GetNormalizedName(nameSpaceID, nameAtom, normalizedName);
nsresult attrResult; nsresult attrResult;
nsAutoString value; nsAutoString value;
attrResult = mContent->GetAttribute(nameSpaceID, nameAtom, value);
attrResult = mContent->GetAttribute(kNameSpaceID_Unknown, nameAtom,
*getter_AddRefs(prefix), value);
if (NS_CONTENT_ATTR_NOT_THERE != attrResult && NS_SUCCEEDED(attrResult)) { if (NS_CONTENT_ATTR_NOT_THERE != attrResult && NS_SUCCEEDED(attrResult)) {
nsDOMAttribute* domAttribute; PRInt32 nameSpaceID = kNameSpaceID_None;
domAttribute = new nsDOMAttribute(mContent, normalizedName, value);
if (!domAttribute) { if (prefix) {
rv = NS_ERROR_OUT_OF_MEMORY; nsCOMPtr<nsIAtom> tmpName, tmpPrefix;
PRInt32 tmpNameSpaceID, attrCount;
mContent->GetAttributeCount(attrCount);
while (attrCount--) {
mContent->GetAttributeNameAt(attrCount, tmpNameSpaceID,
*getter_AddRefs(tmpName),
*getter_AddRefs(tmpPrefix));
if (tmpName == nameAtom && tmpPrefix == prefix) {
nameSpaceID = tmpNameSpaceID;
break;
}
}
} }
nsCOMPtr<nsINodeInfo> ni;
mContent->GetNodeInfo(*getter_AddRefs(ni));
NS_ENSURE_TRUE(ni, NS_ERROR_FAILURE);
nsCOMPtr<nsINodeInfoManager> nimgr;
ni->GetNodeInfoManager(*getter_AddRefs(nimgr));
NS_ENSURE_TRUE(nimgr, NS_ERROR_FAILURE);
nimgr->GetNodeInfo(nameAtom, prefix, nameSpaceID,
*getter_AddRefs(ni));
NS_ENSURE_TRUE(ni, NS_ERROR_FAILURE);
nsDOMAttribute* domAttribute;
domAttribute = new nsDOMAttribute(mContent, ni, value);
NS_ENSURE_TRUE(domAttribute, NS_ERROR_OUT_OF_MEMORY);
rv = domAttribute->QueryInterface(NS_GET_IID(nsIDOMAttr), rv = domAttribute->QueryInterface(NS_GET_IID(nsIDOMAttr),
(void **)aAttribute); (void **)aAttribute);
} }
@ -172,24 +172,30 @@ nsDOMAttributeMap::SetNamedItem(nsIDOMNode *aNode, nsIDOMNode **aReturn)
nsAutoString name, value; nsAutoString name, value;
nsCOMPtr<nsIAtom> nameAtom; nsCOMPtr<nsIAtom> nameAtom;
PRInt32 nameSpaceID;
// Get normalized attribute name
attribute->GetName(name); attribute->GetName(name);
mContent->ParseAttributeString(name, *getter_AddRefs(nameAtom),
nameSpaceID);
if (kNameSpaceID_Unknown == nameSpaceID) {
nameSpaceID = kNameSpaceID_None; // ignore unknown prefix XXX is this correct?
}
GetNormalizedName(nameSpaceID, nameAtom, name);
nsresult attrResult = mContent->GetAttribute(nameSpaceID, nameAtom, value); nsCOMPtr<nsINodeInfo> ni;
mContent->GetNodeInfo(*getter_AddRefs(ni));
NS_ENSURE_TRUE(ni, NS_ERROR_FAILURE);
nsCOMPtr<nsINodeInfoManager> nimgr;
ni->GetNodeInfoManager(*getter_AddRefs(nimgr));
NS_ENSURE_TRUE(nimgr, NS_ERROR_FAILURE);
nimgr->GetNodeInfo(name, nsnull, kNameSpaceID_None, *getter_AddRefs(ni));
NS_ENSURE_TRUE(ni, NS_ERROR_FAILURE);
ni->GetNameAtom(*getter_AddRefs(nameAtom));
nsresult attrResult = mContent->GetAttribute(kNameSpaceID_Unknown,
nameAtom, value);
if (NS_CONTENT_ATTR_NOT_THERE != attrResult && NS_SUCCEEDED(attrResult)) { if (NS_CONTENT_ATTR_NOT_THERE != attrResult && NS_SUCCEEDED(attrResult)) {
nsDOMAttribute* domAttribute; nsDOMAttribute* domAttribute;
// We pass a null content here since the attr node we return isn't // We pass a null content here since the attr node we return isn't
// tied to this content anymore. // tied to this content anymore.
domAttribute = new nsDOMAttribute(nsnull, name, value); domAttribute = new nsDOMAttribute(nsnull, ni, value);
if (!domAttribute) { if (!domAttribute) {
return NS_ERROR_OUT_OF_MEMORY; return NS_ERROR_OUT_OF_MEMORY;
} }
@ -200,7 +206,7 @@ nsDOMAttributeMap::SetNamedItem(nsIDOMNode *aNode, nsIDOMNode **aReturn)
attribute->GetValue(value); attribute->GetValue(value);
rv = mContent->SetAttribute(nameSpaceID, nameAtom, value, PR_TRUE); rv = mContent->SetAttribute(kNameSpaceID_None, nameAtom, value, PR_TRUE);
} }
return rv; return rv;
@ -215,25 +221,48 @@ nsDOMAttributeMap::RemoveNamedItem(const nsString& aName, nsIDOMNode** aReturn)
nsresult rv = NS_OK; nsresult rv = NS_OK;
if (mContent) { if (mContent) {
nsCOMPtr<nsIAtom> nameAtom(dont_AddRef(NS_NewAtom(aName)));
PRInt32 nameSpaceID = kNameSpaceID_None;
nsCOMPtr<nsIDOMNode> attribute; nsCOMPtr<nsIDOMNode> attribute;
nsCOMPtr<nsIAtom> nameAtom; nsCOMPtr<nsIAtom> prefix;
PRInt32 nameSpaceID;
nsAutoString name; name.Assign(aName);
mContent->ParseAttributeString(aName, *getter_AddRefs(nameAtom),
nameSpaceID);
if (kNameSpaceID_Unknown == nameSpaceID) {
return NS_ERROR_DOM_NOT_FOUND_ERR;
}
GetNormalizedName(nameSpaceID, nameAtom, name);
nsresult attrResult; nsresult attrResult;
nsAutoString value; nsAutoString value;
attrResult = mContent->GetAttribute(nameSpaceID, nameAtom, value); attrResult = mContent->GetAttribute(kNameSpaceID_Unknown, nameAtom,
*getter_AddRefs(prefix), value);
if (NS_CONTENT_ATTR_NOT_THERE != attrResult && NS_SUCCEEDED(attrResult)) { if (NS_CONTENT_ATTR_NOT_THERE != attrResult && NS_SUCCEEDED(attrResult)) {
if (prefix) {
nsCOMPtr<nsIAtom> tmpName, tmpPrefix;
PRInt32 tmpNameSpaceID, attrCount;
mContent->GetAttributeCount(attrCount);
while (attrCount--) {
mContent->GetAttributeNameAt(attrCount, tmpNameSpaceID,
*getter_AddRefs(tmpName),
*getter_AddRefs(tmpPrefix));
if (tmpName == nameAtom && tmpPrefix == prefix) {
nameSpaceID = tmpNameSpaceID;
break;
}
}
}
nsCOMPtr<nsINodeInfo> ni;
mContent->GetNodeInfo(*getter_AddRefs(ni));
NS_ENSURE_TRUE(ni, NS_ERROR_FAILURE);
nsCOMPtr<nsINodeInfoManager> nimgr;
ni->GetNodeInfoManager(*getter_AddRefs(nimgr));
NS_ENSURE_TRUE(nimgr, NS_ERROR_FAILURE);
nimgr->GetNodeInfo(nameAtom, prefix, nameSpaceID, *getter_AddRefs(ni));
NS_ENSURE_TRUE(ni, NS_ERROR_FAILURE);
nsDOMAttribute* domAttribute; nsDOMAttribute* domAttribute;
domAttribute = new nsDOMAttribute(nsnull, name, value); domAttribute = new nsDOMAttribute(nsnull, ni, value);
if (!domAttribute) { if (!domAttribute) {
return NS_ERROR_OUT_OF_MEMORY; return NS_ERROR_OUT_OF_MEMORY;
} }
@ -254,6 +283,7 @@ nsDOMAttributeMap::RemoveNamedItem(const nsString& aName, nsIDOMNode** aReturn)
nsresult nsresult
nsDOMAttributeMap::Item(PRUint32 aIndex, nsIDOMNode** aReturn) nsDOMAttributeMap::Item(PRUint32 aIndex, nsIDOMNode** aReturn)
{ {
NS_ENSURE_ARG_POINTER(aReturn);
PRInt32 nameSpaceID; PRInt32 nameSpaceID;
nsCOMPtr<nsIAtom> nameAtom, prefix; nsCOMPtr<nsIAtom> nameAtom, prefix;
@ -266,14 +296,19 @@ nsDOMAttributeMap::Item(PRUint32 aIndex, nsIDOMNode** aReturn)
nsAutoString value, name; nsAutoString value, name;
mContent->GetAttribute(nameSpaceID, nameAtom, value); mContent->GetAttribute(nameSpaceID, nameAtom, value);
GetNormalizedName(nameSpaceID, nameAtom, name); nsCOMPtr<nsINodeInfo> ni;
mContent->GetNodeInfo(*getter_AddRefs(ni));
NS_ENSURE_TRUE(ni, NS_ERROR_FAILURE);
nsDOMAttribute* domAttribute; nsCOMPtr<nsINodeInfoManager> nimgr;
ni->GetNodeInfoManager(*getter_AddRefs(nimgr));
NS_ENSURE_TRUE(nimgr, NS_ERROR_FAILURE);
domAttribute = new nsDOMAttribute(mContent, name, value); nimgr->GetNodeInfo(nameAtom, prefix, nameSpaceID, *getter_AddRefs(ni));
if (!domAttribute) { NS_ENSURE_TRUE(ni, NS_ERROR_FAILURE);
return NS_ERROR_OUT_OF_MEMORY;
} nsDOMAttribute* domAttribute = new nsDOMAttribute(mContent, ni, value);
NS_ENSURE_TRUE(domAttribute, NS_ERROR_OUT_OF_MEMORY);
rv = domAttribute->QueryInterface(NS_GET_IID(nsIDOMAttr), rv = domAttribute->QueryInterface(NS_GET_IID(nsIDOMAttr),
(void **)aReturn); (void **)aReturn);
@ -309,21 +344,175 @@ nsDOMAttributeMap::GetNamedItemNS(const nsString& aNamespaceURI,
const nsString& aLocalName, const nsString& aLocalName,
nsIDOMNode** aReturn) nsIDOMNode** aReturn)
{ {
return NS_ERROR_NOT_IMPLEMENTED; NS_ENSURE_ARG_POINTER(aReturn);
*aReturn = nsnull;
nsresult rv = NS_OK;
if (mContent) {
nsCOMPtr<nsIAtom> nameAtom(dont_AddRef(NS_NewAtom(aLocalName)));
PRInt32 nameSpaceID = kNameSpaceID_None;
nsCOMPtr<nsIAtom> prefix;
nsCOMPtr<nsINodeInfo> ni;
mContent->GetNodeInfo(*getter_AddRefs(ni));
NS_ENSURE_TRUE(ni, NS_ERROR_FAILURE);
nsCOMPtr<nsINodeInfoManager> nimgr;
ni->GetNodeInfoManager(*getter_AddRefs(nimgr));
NS_ENSURE_TRUE(nimgr, NS_ERROR_FAILURE);
if (aNamespaceURI.Length()) {
nsCOMPtr<nsINameSpaceManager> nsmgr;
nimgr->GetNamespaceManager(*getter_AddRefs(nsmgr));
NS_ENSURE_TRUE(nsmgr, NS_ERROR_FAILURE);
nsmgr->GetNameSpaceID(aNamespaceURI, nameSpaceID);
if (nameSpaceID == kNameSpaceID_Unknown)
return NS_OK;
}
nsresult attrResult;
nsAutoString value;
attrResult = mContent->GetAttribute(nameSpaceID, nameAtom,
*getter_AddRefs(prefix), value);
if (NS_CONTENT_ATTR_NOT_THERE != attrResult && NS_SUCCEEDED(attrResult)) {
nimgr->GetNodeInfo(nameAtom, prefix, nameSpaceID, *getter_AddRefs(ni));
NS_ENSURE_TRUE(ni, NS_ERROR_FAILURE);
nsDOMAttribute* domAttribute;
domAttribute = new nsDOMAttribute(mContent, ni, value);
NS_ENSURE_TRUE(domAttribute, NS_ERROR_OUT_OF_MEMORY);
rv = domAttribute->QueryInterface(NS_GET_IID(nsIDOMAttr),
(void **)aReturn);
}
}
return rv;
} }
nsresult nsresult
nsDOMAttributeMap::SetNamedItemNS(nsIDOMNode* aArg, nsIDOMNode** aReturn) nsDOMAttributeMap::SetNamedItemNS(nsIDOMNode* aArg, nsIDOMNode** aReturn)
{ {
return NS_ERROR_NOT_IMPLEMENTED; NS_ENSURE_ARG_POINTER(aReturn);
nsresult rv = NS_OK;
*aReturn = nsnull;
if (mContent) {
nsCOMPtr<nsIDOMAttr> attribute(do_QueryInterface(aArg));
if (!attribute) {
return NS_ERROR_DOM_HIERARCHY_REQUEST_ERR;
}
nsAutoString name, nsURI, value;
nsCOMPtr<nsIAtom> nameAtom;
PRInt32 nameSpaceID;
attribute->GetName(name);
attribute->GetNamespaceURI(nsURI);
nsCOMPtr<nsINodeInfo> ni;
mContent->GetNodeInfo(*getter_AddRefs(ni));
NS_ENSURE_TRUE(ni, NS_ERROR_FAILURE);
nsCOMPtr<nsINodeInfoManager> nimgr;
ni->GetNodeInfoManager(*getter_AddRefs(nimgr));
NS_ENSURE_TRUE(nimgr, NS_ERROR_FAILURE);
nimgr->GetNodeInfo(name, nsURI, *getter_AddRefs(ni));
NS_ENSURE_TRUE(ni, NS_ERROR_FAILURE);
ni->GetNameAtom(*getter_AddRefs(nameAtom));
ni->GetNamespaceID(nameSpaceID);
nsresult attrResult = mContent->GetAttribute(nameSpaceID, nameAtom, value);
if (NS_CONTENT_ATTR_NOT_THERE != attrResult && NS_SUCCEEDED(attrResult)) {
nsDOMAttribute* domAttribute;
// We pass a null content here since the attr node we return isn't
// tied to this content anymore.
domAttribute = new nsDOMAttribute(nsnull, ni, value);
if (!domAttribute) {
return NS_ERROR_OUT_OF_MEMORY;
}
rv = domAttribute->QueryInterface(NS_GET_IID(nsIDOMAttr),
(void **)aReturn);
}
attribute->GetValue(value);
rv = mContent->SetAttribute(ni, value, PR_TRUE);
}
return rv;
} }
nsresult nsresult
nsDOMAttributeMap::RemoveNamedItemNS(const nsString& aNamespaceURI, nsDOMAttributeMap::RemoveNamedItemNS(const nsString& aNamespaceURI,
const nsString&aLocalName, const nsString& aLocalName,
nsIDOMNode** aReturn) nsIDOMNode** aReturn)
{ {
return NS_ERROR_NOT_IMPLEMENTED; NS_ENSURE_ARG_POINTER(aReturn);
*aReturn = nsnull;
nsresult rv = NS_OK;
if (mContent) {
nsCOMPtr<nsIAtom> nameAtom(dont_AddRef(NS_NewAtom(aLocalName)));
PRInt32 nameSpaceID = kNameSpaceID_None;
nsCOMPtr<nsIDOMNode> attribute;
nsCOMPtr<nsIAtom> prefix;
nsCOMPtr<nsINodeInfo> ni;
mContent->GetNodeInfo(*getter_AddRefs(ni));
NS_ENSURE_TRUE(ni, NS_ERROR_FAILURE);
nsCOMPtr<nsINodeInfoManager> nimgr;
ni->GetNodeInfoManager(*getter_AddRefs(nimgr));
NS_ENSURE_TRUE(nimgr, NS_ERROR_FAILURE);
if (aNamespaceURI.Length()) {
nsCOMPtr<nsINameSpaceManager> nsmgr;
nimgr->GetNamespaceManager(*getter_AddRefs(nsmgr));
NS_ENSURE_TRUE(nsmgr, NS_ERROR_FAILURE);
nsmgr->GetNameSpaceID(aNamespaceURI, nameSpaceID);
if (nameSpaceID == kNameSpaceID_Unknown)
return NS_ERROR_DOM_NOT_FOUND_ERR;
}
nsresult attrResult;
nsAutoString value;
attrResult = mContent->GetAttribute(nameSpaceID, nameAtom,
*getter_AddRefs(prefix), value);
if (NS_CONTENT_ATTR_NOT_THERE != attrResult && NS_SUCCEEDED(attrResult)) {
nimgr->GetNodeInfo(nameAtom, prefix, nameSpaceID, *getter_AddRefs(ni));
NS_ENSURE_TRUE(ni, NS_ERROR_FAILURE);
nsDOMAttribute* domAttribute;
domAttribute = new nsDOMAttribute(nsnull, ni, value);
if (!domAttribute) {
return NS_ERROR_OUT_OF_MEMORY;
}
rv = domAttribute->QueryInterface(NS_GET_IID(nsIDOMAttr),
(void **)aReturn);
} else {
return NS_ERROR_DOM_NOT_FOUND_ERR;
}
rv = mContent->UnsetAttribute(nameSpaceID, nameAtom, PR_TRUE);
}
return rv;
} }

Просмотреть файл

@ -63,15 +63,6 @@ public:
PRUint32* aResult); PRUint32* aResult);
#endif #endif
protected:
nsresult GetNamedItemCommon(const nsString& aAttrName,
PRInt32 aNameSpaceID,
nsIAtom* aNameAtom,
nsIDOMNode** aAttribute);
void GetNormalizedName(PRInt32 aNameSpaceID,
nsIAtom* aNameAtom,
nsString& aAttrName);
private: private:
nsIContent* mContent; nsIContent* mContent;
void* mScriptObject; void* mScriptObject;

Просмотреть файл

@ -2146,14 +2146,19 @@ NS_IMETHODIMP
nsDocument::CreateAttribute(const nsString& aName, nsDocument::CreateAttribute(const nsString& aName,
nsIDOMAttr** aReturn) nsIDOMAttr** aReturn)
{ {
NS_ENSURE_ARG_POINTER(aReturn);
NS_ENSURE_TRUE(mNodeInfoManager, NS_ERROR_NOT_INITIALIZED);
nsAutoString value; nsAutoString value;
nsDOMAttribute* attribute; nsDOMAttribute* attribute;
value.Truncate(); nsCOMPtr<nsINodeInfo> nodeInfo;
attribute = new nsDOMAttribute(nsnull, aName, value); nsresult rv = mNodeInfoManager->GetNodeInfo(aName, nsnull, kNameSpaceID_None,
if (nsnull == attribute) { *getter_AddRefs(nodeInfo));
return NS_ERROR_OUT_OF_MEMORY; NS_ENSURE_SUCCESS(rv, rv);
}
attribute = new nsDOMAttribute(nsnull, nodeInfo, value);
NS_ENSURE_TRUE(attribute, NS_ERROR_OUT_OF_MEMORY);
return attribute->QueryInterface(NS_GET_IID(nsIDOMAttr), (void**)aReturn); return attribute->QueryInterface(NS_GET_IID(nsIDOMAttr), (void**)aReturn);
} }

Просмотреть файл

@ -425,7 +425,7 @@ nsDocumentFragment::CloneNode(PRBool aDeep, nsIDOMNode** aReturn)
NS_IMETHODIMP NS_IMETHODIMP
nsDocumentFragment::Normalize() nsDocumentFragment::Normalize()
{ {
NS_NOTYETIMPLEMENTED("write me!"); // Nothing to do here yet
return NS_OK; return NS_OK;
} }

Просмотреть файл

@ -217,28 +217,26 @@ nsGenericDOMDataNode::GetOwnerDocument(nsIDOMDocument** aOwnerDocument)
nsresult nsresult
nsGenericDOMDataNode::GetNamespaceURI(nsString& aNamespaceURI) nsGenericDOMDataNode::GetNamespaceURI(nsString& aNamespaceURI)
{ {
NS_NOTYETIMPLEMENTED("write me!"); aNamespaceURI.Truncate();
return NS_OK; return NS_OK;
} }
nsresult nsresult
nsGenericDOMDataNode::GetPrefix(nsString& aPrefix) nsGenericDOMDataNode::GetPrefix(nsString& aPrefix)
{ {
NS_NOTYETIMPLEMENTED("write me!"); aPrefix.Truncate();
return NS_OK; return NS_OK;
} }
nsresult nsresult
nsGenericDOMDataNode::SetPrefix(const nsString& aPrefix) nsGenericDOMDataNode::SetPrefix(const nsString& aPrefix)
{ {
NS_NOTYETIMPLEMENTED("write me!");
return NS_ERROR_DOM_NAMESPACE_ERR; return NS_ERROR_DOM_NAMESPACE_ERR;
} }
nsresult nsresult
nsGenericDOMDataNode::Normalize() nsGenericDOMDataNode::Normalize()
{ {
NS_NOTYETIMPLEMENTED("write me!");
return NS_OK; return NS_OK;
} }

Просмотреть файл

@ -714,15 +714,9 @@ nsGenericElement::GetTagName(nsString& aTagName)
nsresult nsresult
nsGenericElement::GetAttribute(const nsString& aName, nsString& aReturn) nsGenericElement::GetAttribute(const nsString& aName, nsString& aReturn)
{ {
nsIAtom* nameAtom; nsCOMPtr<nsIAtom> nameAtom(dont_AddRef(NS_NewAtom(aName)));
PRInt32 nameSpaceID;
mContent->ParseAttributeString(aName, nameAtom, nameSpaceID); mContent->GetAttribute(kNameSpaceID_Unknown, nameAtom, aReturn);
if (kNameSpaceID_Unknown == nameSpaceID) {
nameSpaceID = kNameSpaceID_None; // ignore unknown prefix XXX is this correct?
}
mContent->GetAttribute(nameSpaceID, nameAtom, aReturn);
NS_RELEASE(nameAtom);
return NS_OK; return NS_OK;
} }
@ -1071,15 +1065,10 @@ nsGenericElement::HasAttribute(const nsString& aName, PRBool* aReturn)
{ {
NS_ENSURE_ARG_POINTER(aReturn); NS_ENSURE_ARG_POINTER(aReturn);
nsCOMPtr<nsIAtom> name; nsCOMPtr<nsIAtom> name(dont_AddRef(NS_NewAtom(aName)));
PRInt32 nsid;
nsresult rv = mContent->ParseAttributeString(aName, *getter_AddRefs(name),
nsid);
NS_ENSURE_SUCCESS(rv, rv);
nsAutoString tmp; nsAutoString tmp;
rv = mContent->GetAttribute(nsid, name, tmp); nsresult rv = mContent->GetAttribute(kNameSpaceID_Unknown, name, tmp);
*aReturn = rv == NS_CONTENT_ATTR_NOT_THERE ? PR_FALSE : PR_TRUE; *aReturn = rv == NS_CONTENT_ATTR_NOT_THERE ? PR_FALSE : PR_TRUE;
@ -2601,70 +2590,17 @@ nsGenericContainerElement::SetAttribute(PRInt32 aNameSpaceID, nsIAtom* aName,
const nsString& aValue, const nsString& aValue,
PRBool aNotify) PRBool aNotify)
{ {
NS_ASSERTION(kNameSpaceID_Unknown != aNameSpaceID, "must have name space ID"); nsresult rv;
if (kNameSpaceID_Unknown == aNameSpaceID) { nsCOMPtr<nsINodeInfoManager> nimgr;
return NS_ERROR_ILLEGAL_VALUE; rv = mNodeInfo->GetNodeInfoManager(*getter_AddRefs(nimgr));
} NS_ENSURE_SUCCESS(rv, rv);
NS_ASSERTION(nsnull != aName, "must have attribute name");
if (nsnull == aName) {
return NS_ERROR_NULL_POINTER;
}
nsresult rv = NS_ERROR_OUT_OF_MEMORY; nsCOMPtr<nsINodeInfo> ni;
rv = nimgr->GetNodeInfo(aName, nsnull, aNameSpaceID,
*getter_AddRefs(ni));
NS_ENSURE_SUCCESS(rv, rv);
if (nsnull == mAttributes) { return SetAttribute(ni, aValue, aNotify);
mAttributes = new nsVoidArray();
}
if (aNotify && (nsnull != mDocument)) {
mDocument->BeginUpdate();
}
if (nsnull != mAttributes) {
nsGenericAttribute* attr;
PRInt32 index;
PRInt32 count = mAttributes->Count();
for (index = 0; index < count; index++) {
attr = (nsGenericAttribute*)mAttributes->ElementAt(index);
if (attr->mNodeInfo->Equals(aName, aNameSpaceID)) {
attr->mValue = aValue;
rv = NS_OK;
break;
}
}
if (index >= count) { // didn't find it
nsCOMPtr<nsINodeInfoManager> nimgr;
mNodeInfo->GetNodeInfoManager(*getter_AddRefs(nimgr));
nsCOMPtr<nsINodeInfo> ni;
rv = nimgr->GetNodeInfo(aName, nsnull, aNameSpaceID,
*getter_AddRefs(ni));
NS_ENSURE_SUCCESS(rv, rv);
attr = new nsGenericAttribute(ni, aValue);
if (nsnull != attr) {
mAttributes->AppendElement(attr);
rv = NS_OK;
}
}
}
if (mDocument && NS_SUCCEEDED(rv)) {
nsCOMPtr<nsIBindingManager> bindingManager;
mDocument->GetBindingManager(getter_AddRefs(bindingManager));
nsCOMPtr<nsIXBLBinding> binding;
bindingManager->GetBinding(mContent, getter_AddRefs(binding));
if (binding)
binding->AttributeChanged(aName, aNameSpaceID, PR_FALSE);
if (aNotify) {
mDocument->AttributeChanged(mContent, aNameSpaceID, aName, NS_STYLE_HINT_UNKNOWN);
mDocument->EndUpdate();
}
}
return rv;
} }
nsresult nsresult
@ -2674,15 +2610,58 @@ nsGenericContainerElement::SetAttribute(nsINodeInfo* aNodeInfo,
{ {
NS_ENSURE_ARG_POINTER(aNodeInfo); NS_ENSURE_ARG_POINTER(aNodeInfo);
nsCOMPtr<nsIAtom> atom; nsresult rv = NS_ERROR_OUT_OF_MEMORY;
PRInt32 nsid;
aNodeInfo->GetNameAtom(*getter_AddRefs(atom)); if (!mAttributes) {
aNodeInfo->GetNamespaceID(nsid); mAttributes = new nsVoidArray();
NS_ENSURE_TRUE(mAttributes, NS_ERROR_OUT_OF_MEMORY);
}
if (aNotify && (nsnull != mDocument)) {
mDocument->BeginUpdate();
}
nsGenericAttribute* attr;
PRInt32 index;
PRInt32 count = mAttributes->Count();
for (index = 0; index < count; index++) {
attr = (nsGenericAttribute*)mAttributes->ElementAt(index);
if (attr->mNodeInfo == aNodeInfo) {
attr->mValue = aValue;
rv = NS_OK;
break;
}
}
if (index >= count) { // didn't find it
attr = new nsGenericAttribute(aNodeInfo, aValue);
NS_ENSURE_TRUE(attr, NS_ERROR_OUT_OF_MEMORY);
// We still rely on the old way of setting the attribute. mAttributes->AppendElement(attr);
rv = NS_OK;
}
return SetAttribute(nsid, atom, aValue, aNotify); if (mDocument && NS_SUCCEEDED(rv)) {
nsCOMPtr<nsIAtom> name;
PRInt32 nameSpaceID;
aNodeInfo->GetNameAtom(*getter_AddRefs(name));
aNodeInfo->GetNamespaceID(nameSpaceID);
nsCOMPtr<nsIBindingManager> bindingManager;
mDocument->GetBindingManager(getter_AddRefs(bindingManager));
nsCOMPtr<nsIXBLBinding> binding;
bindingManager->GetBinding(mContent, getter_AddRefs(binding));
if (binding)
binding->AttributeChanged(name, nameSpaceID, PR_FALSE);
if (aNotify) {
mDocument->AttributeChanged(mContent, nameSpaceID, name, NS_STYLE_HINT_UNKNOWN);
mDocument->EndUpdate();
}
}
return rv;
} }
nsresult nsresult
@ -2710,7 +2689,7 @@ nsGenericContainerElement::GetAttribute(PRInt32 aNameSpaceID, nsIAtom* aName,
PRInt32 index; PRInt32 index;
for (index = 0; index < count; index++) { for (index = 0; index < count; index++) {
const nsGenericAttribute* attr = (const nsGenericAttribute*)mAttributes->ElementAt(index); const nsGenericAttribute* attr = (const nsGenericAttribute*)mAttributes->ElementAt(index);
if ((attr->mNodeInfo->NamespaceEquals(kNameSpaceID_Unknown) || if ((aNameSpaceID == kNameSpaceID_Unknown ||
attr->mNodeInfo->NamespaceEquals(aNameSpaceID)) && attr->mNodeInfo->NamespaceEquals(aNameSpaceID)) &&
(attr->mNodeInfo->Equals(aName))) { (attr->mNodeInfo->Equals(aName))) {
attr->mNodeInfo->GetPrefixAtom(aPrefix); attr->mNodeInfo->GetPrefixAtom(aPrefix);
@ -2754,7 +2733,7 @@ nsGenericContainerElement::UnsetAttribute(PRInt32 aNameSpaceID, nsIAtom* aName,
PRBool found = PR_FALSE; PRBool found = PR_FALSE;
for (index = 0; index < count; index++) { for (index = 0; index < count; index++) {
nsGenericAttribute* attr = (nsGenericAttribute*)mAttributes->ElementAt(index); nsGenericAttribute* attr = (nsGenericAttribute*)mAttributes->ElementAt(index);
if ((attr->mNodeInfo->NamespaceEquals(kNameSpaceID_Unknown) || if ((aNameSpaceID == kNameSpaceID_Unknown ||
attr->mNodeInfo->NamespaceEquals(aNameSpaceID)) && attr->mNodeInfo->NamespaceEquals(aNameSpaceID)) &&
attr->mNodeInfo->Equals(aName)) { attr->mNodeInfo->Equals(aName)) {
if (aNotify && (nsnull != mDocument)) { if (aNotify && (nsnull != mDocument)) {

Просмотреть файл

@ -31,7 +31,7 @@ static NS_DEFINE_IID(kINameSpaceManagerIID, NS_INAMESPACEMANAGER_IID);
static NS_DEFINE_IID(kINameSpaceIID, NS_INAMESPACE_IID); static NS_DEFINE_IID(kINameSpaceIID, NS_INAMESPACE_IID);
static const char kXMLNSNameSpaceURI[] = "<This isn't really a namespace>"; static const char kXMLNSNameSpaceURI[] = "http://www.w3.org/2000/xmlns";
static const char kXMLNameSpaceURI[] = "http://www.w3.org/XML/1998/namespace"; static const char kXMLNameSpaceURI[] = "http://www.w3.org/XML/1998/namespace";
static const char kHTMLNameSpaceURI[] = "http://www.w3.org/TR/REC-html40"; // XXX?? "urn:w3-org-ns:HTML"?? static const char kHTMLNameSpaceURI[] = "http://www.w3.org/TR/REC-html40"; // XXX?? "urn:w3-org-ns:HTML"??
// XXX To be removed: Bug 7834 --- // XXX To be removed: Bug 7834 ---

Просмотреть файл

@ -219,8 +219,26 @@ nsXMLElement::SetAttribute(PRInt32 aNameSpaceID, nsIAtom* aName,
const nsString& aValue, const nsString& aValue,
PRBool aNotify) PRBool aNotify)
{ {
if ((kNameSpaceID_XLink == aNameSpaceID) && nsresult rv;
(kTypeAtom == aName)) { nsCOMPtr<nsINodeInfoManager> nimgr;
rv = mInner.mNodeInfo->GetNodeInfoManager(*getter_AddRefs(nimgr));
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsINodeInfo> ni;
rv = nimgr->GetNodeInfo(aName, nsnull, aNameSpaceID,
*getter_AddRefs(ni));
NS_ENSURE_SUCCESS(rv, rv);
return SetAttribute(ni, aValue, aNotify);
}
NS_IMETHODIMP
nsXMLElement::SetAttribute(nsINodeInfo *aNodeInfo, const nsString& aValue,
PRBool aNotify)
{
NS_ENSURE_ARG_POINTER(aNodeInfo);
if (aNodeInfo->Equals(kTypeAtom, kNameSpaceID_XLink)) {
if (aValue.EqualsAtom(kSimpleAtom, PR_FALSE)) { if (aValue.EqualsAtom(kSimpleAtom, PR_FALSE)) {
// NOTE: This really is a link according to the XLink spec, // NOTE: This really is a link according to the XLink spec,
// we do not need to check other attributes. If there // we do not need to check other attributes. If there
@ -237,24 +255,7 @@ nsXMLElement::SetAttribute(PRInt32 aNameSpaceID, nsIAtom* aName,
// We will check for actuate="onLoad" in MaybeTriggerAutoLink // We will check for actuate="onLoad" in MaybeTriggerAutoLink
} }
return mInner.SetAttribute(aNameSpaceID, aName, aValue, aNotify); return mInner.SetAttribute(aNodeInfo, aValue, aNotify);
}
NS_IMETHODIMP
nsXMLElement::SetAttribute(nsINodeInfo *aNodeInfo, const nsString& aValue,
PRBool aNotify)
{
NS_ENSURE_ARG_POINTER(aNodeInfo);
nsCOMPtr<nsIAtom> atom;
PRInt32 nsid;
aNodeInfo->GetNameAtom(*getter_AddRefs(atom));
aNodeInfo->GetNamespaceID(nsid);
// We still rely on the old way of setting the attribute.
return SetAttribute(nsid, atom, aValue, aNotify);
} }
static nsresult WebShellToPresContext(nsIWebShell *aShell, nsIPresContext **aPresContext) static nsresult WebShellToPresContext(nsIWebShell *aShell, nsIPresContext **aPresContext)

Просмотреть файл

@ -560,30 +560,39 @@ nsXMLContentSink::AddAttributes(const nsIParserNode& aNode,
name.Truncate(); name.Truncate();
name.Append(key); name.Append(key);
nsIAtom* nameSpacePrefix = CutNameSpacePrefix(name); nsCOMPtr<nsIAtom> nameSpacePrefix(dont_AddRef(CutNameSpacePrefix(name)));
nsIAtom* nameAtom = NS_NewAtom(name); nsCOMPtr<nsIAtom> nameAtom(dont_AddRef(NS_NewAtom(name)));
PRInt32 nameSpaceID = (nsnull == nameSpacePrefix) ? kNameSpaceID_None : GetNameSpaceId(nameSpacePrefix); PRInt32 nameSpaceID;
if (kNameSpaceID_Unknown == nameSpaceID) {
nameSpaceID = kNameSpaceID_None; // XXX is this correct? or is it a bad document? if (nameSpacePrefix) {
nameSpaceID = GetNameSpaceId(nameSpacePrefix);
} else {
if (nameAtom.get() == nsLayoutAtoms::xmlnsNameSpace)
nameSpaceID = kNameSpaceID_XMLNS;
else
nameSpaceID = kNameSpaceID_None;
} }
if ((kNameSpaceID_XMLNS == nameSpaceID) && aIsHTML) {
NS_RELEASE(nameAtom); if (kNameSpaceID_Unknown == nameSpaceID) {
nameSpaceID = kNameSpaceID_None;
nameAtom = dont_AddRef(NS_NewAtom(key));
nameSpacePrefix = nsnull;
} else if ((kNameSpaceID_XMLNS == nameSpaceID) && aIsHTML) {
name.InsertWithConversion("xmlns:", 0); name.InsertWithConversion("xmlns:", 0);
nameAtom = NS_NewAtom(name); nameAtom = dont_AddRef(NS_NewAtom(name));
nameSpaceID = kNameSpaceID_HTML; // XXX this is wrong, but necessary until HTML can store other namespaces for attrs nameSpaceID = kNameSpaceID_HTML; // XXX this is wrong, but necessary until HTML can store other namespaces for attrs
} }
nsAutoString value; nsCOMPtr<nsINodeInfo> ni;
if (NS_CONTENT_ATTR_NOT_THERE == mNodeInfoManager->GetNodeInfo(nameAtom, nameSpacePrefix, nameSpaceID,
aContent->GetAttribute(nameSpaceID, nameAtom, value)) { *getter_AddRefs(ni));
// Get value and remove mandatory quotes NS_ENSURE_TRUE(ni, NS_ERROR_FAILURE);
GetAttributeValueAt(aNode, i, v);
// Add attribute to content // Get value and remove mandatory quotes
aContent->SetAttribute(nameSpaceID, nameAtom, v, PR_FALSE); GetAttributeValueAt(aNode, i, v);
}
NS_RELEASE(nameAtom); // Add attribute to content
NS_IF_RELEASE(nameSpacePrefix); aContent->SetAttribute(ni, v, PR_FALSE);
} }
// Give autoloading links a chance to fire // Give autoloading links a chance to fire

Просмотреть файл

@ -35,10 +35,12 @@ static NS_DEFINE_IID(kIDOMNodeListIID, NS_IDOMNODELIST_IID);
//---------------------------------------------------------------------- //----------------------------------------------------------------------
nsDOMAttribute::nsDOMAttribute(nsIContent* aContent, nsDOMAttribute::nsDOMAttribute(nsIContent* aContent,
const nsString& aName, nsINodeInfo *aNodeInfo,
const nsString& aValue) const nsString& aValue)
: mName(aName), mValue(aValue) : mNodeInfo(aNodeInfo), mValue(aValue)
{ {
NS_ABORT_IF_FALSE(mNodeInfo, "We must get a nodeinfo here!");
NS_INIT_REFCNT(); NS_INIT_REFCNT();
// We don't add a reference to our content. It will tell us // We don't add a reference to our content. It will tell us
// to drop our reference when it goes away. // to drop our reference when it goes away.
@ -117,15 +119,7 @@ NS_IMETHODIMP
nsDOMAttribute::GetContent(nsIContent** aContent) nsDOMAttribute::GetContent(nsIContent** aContent)
{ {
*aContent = mContent; *aContent = mContent;
NS_IF_ADDREF(mContent); NS_IF_ADDREF(*aContent);
return NS_OK;
}
NS_IMETHODIMP
nsDOMAttribute::SetName(const nsString& aName)
{
mName=aName;
return NS_OK; return NS_OK;
} }
@ -163,29 +157,30 @@ nsDOMAttribute::SetScriptObject(void *aScriptObject)
nsresult nsresult
nsDOMAttribute::GetName(nsString& aName) nsDOMAttribute::GetName(nsString& aName)
{ {
aName=mName; NS_ENSURE_TRUE(mNodeInfo, NS_ERROR_FAILURE);
return NS_OK;
return mNodeInfo->GetQualifiedName(aName);
} }
nsresult nsresult
nsDOMAttribute::GetValue(nsString& aValue) nsDOMAttribute::GetValue(nsString& aValue)
{ {
NS_ENSURE_TRUE(mNodeInfo, NS_ERROR_FAILURE);
nsresult result = NS_OK; nsresult result = NS_OK;
if (nsnull != mContent) { if (nsnull != mContent) {
nsIAtom* nameAtom;
PRInt32 nameSpaceID;
nsresult attrResult; nsresult attrResult;
PRInt32 nameSpaceID;
nsCOMPtr<nsIAtom> name;
mNodeInfo->GetNameAtom(*getter_AddRefs(name));
mNodeInfo->GetNamespaceID(nameSpaceID);
mContent->ParseAttributeString(mName, nameAtom, nameSpaceID);
if (kNameSpaceID_Unknown == nameSpaceID) {
nameSpaceID = kNameSpaceID_None; // ignore unknown prefix XXX is this correct?
}
nsAutoString tmpValue; nsAutoString tmpValue;
attrResult = mContent->GetAttribute(nameSpaceID, nameAtom, tmpValue); attrResult = mContent->GetAttribute(nameSpaceID, name, tmpValue);
if (NS_CONTENT_ATTR_NOT_THERE != attrResult) { if (NS_CONTENT_ATTR_NOT_THERE != attrResult) {
mValue = tmpValue; mValue = tmpValue;
} }
NS_IF_RELEASE(nameAtom);
} }
aValue=mValue; aValue=mValue;
return result; return result;
@ -194,17 +189,11 @@ nsDOMAttribute::GetValue(nsString& aValue)
nsresult nsresult
nsDOMAttribute::SetValue(const nsString& aValue) nsDOMAttribute::SetValue(const nsString& aValue)
{ {
NS_ENSURE_TRUE(mNodeInfo, NS_ERROR_FAILURE);
nsresult result = NS_OK; nsresult result = NS_OK;
if (nsnull != mContent) { if (nsnull != mContent) {
nsIAtom* nameAtom; result = mContent->SetAttribute(mNodeInfo, aValue, PR_TRUE);
PRInt32 nameSpaceID;
mContent->ParseAttributeString(mName, nameAtom, nameSpaceID);
if (kNameSpaceID_Unknown == nameSpaceID) {
nameSpaceID = kNameSpaceID_None; // ignore unknown prefix XXX is this correct?
}
result = mContent->SetAttribute(nameSpaceID, nameAtom, aValue, PR_TRUE);
NS_IF_RELEASE(nameAtom);
} }
mValue=aValue; mValue=aValue;
@ -214,22 +203,22 @@ nsDOMAttribute::SetValue(const nsString& aValue)
nsresult nsresult
nsDOMAttribute::GetSpecified(PRBool* aSpecified) nsDOMAttribute::GetSpecified(PRBool* aSpecified)
{ {
NS_ENSURE_TRUE(mNodeInfo, NS_ERROR_FAILURE);
NS_ENSURE_ARG_POINTER(aSpecified);
nsresult result = NS_OK; nsresult result = NS_OK;
if (nsnull == mContent) { if (nsnull == mContent) {
*aSpecified = PR_FALSE; *aSpecified = PR_FALSE;
} } else {
else {
nsAutoString value; nsAutoString value;
nsresult attrResult; nsresult attrResult;
nsIAtom* nameAtom;
PRInt32 nameSpaceID; PRInt32 nameSpaceID;
nsCOMPtr<nsIAtom> name;
mContent->ParseAttributeString(mName, nameAtom, nameSpaceID); mNodeInfo->GetNameAtom(*getter_AddRefs(name));
if (kNameSpaceID_Unknown == nameSpaceID) { mNodeInfo->GetNamespaceID(nameSpaceID);
nameSpaceID = kNameSpaceID_None; // ignore unknown prefix XXX is this correct?
} attrResult = mContent->GetAttribute(nameSpaceID, name, value);
attrResult = mContent->GetAttribute(nameSpaceID, nameAtom, value);
NS_IF_RELEASE(nameAtom);
if (NS_CONTENT_ATTR_HAS_VALUE == attrResult) { if (NS_CONTENT_ATTR_HAS_VALUE == attrResult) {
*aSpecified = PR_TRUE; *aSpecified = PR_TRUE;
} }
@ -277,6 +266,8 @@ nsDOMAttribute::SetNodeValue(const nsString& aNodeValue)
NS_IMETHODIMP NS_IMETHODIMP
nsDOMAttribute::GetNodeType(PRUint16* aNodeType) nsDOMAttribute::GetNodeType(PRUint16* aNodeType)
{ {
NS_ENSURE_ARG_POINTER(aNodeType);
*aNodeType = (PRUint16)nsIDOMNode::ATTRIBUTE_NODE; *aNodeType = (PRUint16)nsIDOMNode::ATTRIBUTE_NODE;
return NS_OK; return NS_OK;
} }
@ -284,6 +275,8 @@ nsDOMAttribute::GetNodeType(PRUint16* aNodeType)
NS_IMETHODIMP NS_IMETHODIMP
nsDOMAttribute::GetParentNode(nsIDOMNode** aParentNode) nsDOMAttribute::GetParentNode(nsIDOMNode** aParentNode)
{ {
NS_ENSURE_ARG_POINTER(aParentNode);
*aParentNode = nsnull; *aParentNode = nsnull;
return NS_OK; return NS_OK;
} }
@ -360,6 +353,8 @@ nsDOMAttribute::GetLastChild(nsIDOMNode** aLastChild)
NS_IMETHODIMP NS_IMETHODIMP
nsDOMAttribute::GetPreviousSibling(nsIDOMNode** aPreviousSibling) nsDOMAttribute::GetPreviousSibling(nsIDOMNode** aPreviousSibling)
{ {
NS_ENSURE_ARG_POINTER(aPreviousSibling);
*aPreviousSibling = nsnull; *aPreviousSibling = nsnull;
return NS_OK; return NS_OK;
} }
@ -367,6 +362,8 @@ nsDOMAttribute::GetPreviousSibling(nsIDOMNode** aPreviousSibling)
NS_IMETHODIMP NS_IMETHODIMP
nsDOMAttribute::GetNextSibling(nsIDOMNode** aNextSibling) nsDOMAttribute::GetNextSibling(nsIDOMNode** aNextSibling)
{ {
NS_ENSURE_ARG_POINTER(aNextSibling);
*aNextSibling = nsnull; *aNextSibling = nsnull;
return NS_OK; return NS_OK;
} }
@ -374,6 +371,8 @@ nsDOMAttribute::GetNextSibling(nsIDOMNode** aNextSibling)
NS_IMETHODIMP NS_IMETHODIMP
nsDOMAttribute::GetAttributes(nsIDOMNamedNodeMap** aAttributes) nsDOMAttribute::GetAttributes(nsIDOMNamedNodeMap** aAttributes)
{ {
NS_ENSURE_ARG_POINTER(aAttributes);
*aAttributes = nsnull; *aAttributes = nsnull;
return NS_OK; return NS_OK;
} }
@ -409,18 +408,17 @@ nsDOMAttribute::CloneNode(PRBool aDeep, nsIDOMNode** aReturn)
if (nsnull != mContent) { if (nsnull != mContent) {
nsAutoString value; nsAutoString value;
nsIAtom* nameAtom;
PRInt32 nameSpaceID; PRInt32 nameSpaceID;
nsCOMPtr<nsIAtom> name;
mNodeInfo->GetNameAtom(*getter_AddRefs(name));
mNodeInfo->GetNamespaceID(nameSpaceID);
mContent->ParseAttributeString(mName, nameAtom, nameSpaceID); mContent->GetAttribute(nameSpaceID, name, value);
if (kNameSpaceID_Unknown == nameSpaceID) { newAttr = new nsDOMAttribute(nsnull, mNodeInfo, value);
nameSpaceID = kNameSpaceID_None; // ignore unknown prefix XXX is this correct?
}
mContent->GetAttribute(nameSpaceID, nameAtom, value);
newAttr = new nsDOMAttribute(nsnull, mName, value);
} }
else { else {
newAttr = new nsDOMAttribute(nsnull, mName, mValue); newAttr = new nsDOMAttribute(nsnull, mNodeInfo, mValue);
} }
if (nsnull == newAttr) { if (nsnull == newAttr) {
@ -452,35 +450,67 @@ nsDOMAttribute::GetOwnerDocument(nsIDOMDocument** aOwnerDocument)
NS_IMETHODIMP NS_IMETHODIMP
nsDOMAttribute::GetNamespaceURI(nsString& aNamespaceURI) nsDOMAttribute::GetNamespaceURI(nsString& aNamespaceURI)
{ {
NS_NOTYETIMPLEMENTED("write me!"); NS_ENSURE_TRUE(mNodeInfo, NS_ERROR_FAILURE);
return NS_ERROR_NOT_IMPLEMENTED;
return mNodeInfo->GetNamespaceURI(aNamespaceURI);
} }
NS_IMETHODIMP NS_IMETHODIMP
nsDOMAttribute::GetPrefix(nsString& aPrefix) nsDOMAttribute::GetPrefix(nsString& aPrefix)
{ {
NS_NOTYETIMPLEMENTED("write me!"); NS_ENSURE_TRUE(mNodeInfo, NS_ERROR_FAILURE);
return NS_ERROR_NOT_IMPLEMENTED;
return mNodeInfo->GetPrefix(aPrefix);
} }
NS_IMETHODIMP NS_IMETHODIMP
nsDOMAttribute::SetPrefix(const nsString& aPrefix) nsDOMAttribute::SetPrefix(const nsString& aPrefix)
{ {
NS_NOTYETIMPLEMENTED("write me!"); NS_ENSURE_TRUE(mNodeInfo, NS_ERROR_FAILURE);
return NS_ERROR_NOT_IMPLEMENTED; nsCOMPtr<nsINodeInfo> newNodeInfo;
nsCOMPtr<nsIAtom> prefix;
nsresult rv = NS_OK;
if (aPrefix.Length())
prefix = dont_AddRef(NS_NewAtom(aPrefix));
rv = mNodeInfo->PrefixChanged(prefix, *getter_AddRefs(newNodeInfo));
NS_ENSURE_SUCCESS(rv, rv);
if (mContent) {
nsCOMPtr<nsIAtom> name;
PRInt32 nameSpaceID;
nsAutoString tmpValue;
mNodeInfo->GetNameAtom(*getter_AddRefs(name));
mNodeInfo->GetNamespaceID(nameSpaceID);
rv = mContent->GetAttribute(nameSpaceID, name, tmpValue);
if (rv == NS_CONTENT_ATTR_HAS_VALUE) {
mContent->UnsetAttribute(nameSpaceID, name, PR_TRUE);
mContent->SetAttribute(newNodeInfo, tmpValue, PR_TRUE);
}
}
mNodeInfo = newNodeInfo;
return NS_OK;
} }
NS_IMETHODIMP NS_IMETHODIMP
nsDOMAttribute::GetLocalName(nsString& aLocalName) nsDOMAttribute::GetLocalName(nsString& aLocalName)
{ {
return GetName(aLocalName); NS_ENSURE_TRUE(mNodeInfo, NS_ERROR_FAILURE);
return mNodeInfo->GetLocalName(aLocalName);
} }
NS_IMETHODIMP NS_IMETHODIMP
nsDOMAttribute::Normalize() nsDOMAttribute::Normalize()
{ {
NS_NOTYETIMPLEMENTED("write me!"); // Nothing to do here
return NS_ERROR_NOT_IMPLEMENTED; return NS_OK;
} }
NS_IMETHODIMP NS_IMETHODIMP

Просмотреть файл

@ -28,6 +28,8 @@
#include "nsIScriptObjectOwner.h" #include "nsIScriptObjectOwner.h"
#include "nsGenericDOMNodeList.h" #include "nsGenericDOMNodeList.h"
#include "nsString.h" #include "nsString.h"
#include "nsCOMPtr.h"
#include "nsINodeInfo.h"
class nsIContent; class nsIContent;
class nsDOMAttribute; class nsDOMAttribute;
@ -41,7 +43,6 @@ public:
NS_IMETHOD DropReference() = 0; NS_IMETHOD DropReference() = 0;
NS_IMETHOD SetContent(nsIContent* aContent) = 0; NS_IMETHOD SetContent(nsIContent* aContent) = 0;
NS_IMETHOD GetContent(nsIContent** aContent) = 0; NS_IMETHOD GetContent(nsIContent** aContent) = 0;
NS_IMETHOD SetName(const nsString& aName) = 0;
}; };
// bogus child list for an attribute // bogus child list for an attribute
@ -69,8 +70,7 @@ class nsDOMAttribute : public nsIDOMAttr,
public nsIDOMAttributePrivate public nsIDOMAttributePrivate
{ {
public: public:
nsDOMAttribute(nsIContent* aContent, nsDOMAttribute(nsIContent* aContent, nsINodeInfo *aNodeInfo,
const nsString& aName,
const nsString& aValue); const nsString& aValue);
virtual ~nsDOMAttribute(); virtual ~nsDOMAttribute();
@ -89,11 +89,10 @@ public:
NS_IMETHOD DropReference(); NS_IMETHOD DropReference();
NS_IMETHOD SetContent(nsIContent* aContent); NS_IMETHOD SetContent(nsIContent* aContent);
NS_IMETHOD GetContent(nsIContent** aContent); NS_IMETHOD GetContent(nsIContent** aContent);
NS_IMETHOD SetName(const nsString& aName);
private: private:
nsIContent* mContent; nsIContent* mContent;
nsString mName; nsCOMPtr<nsINodeInfo> mNodeInfo;
nsString mValue; nsString mValue;
// XXX For now, there's only a single child - a text // XXX For now, there's only a single child - a text
// element representing the value // element representing the value

Просмотреть файл

@ -89,28 +89,6 @@ nsDOMAttributeMap::SetScriptObject(void *aScriptObject)
return NS_OK; return NS_OK;
} }
void
nsDOMAttributeMap::GetNormalizedName(PRInt32 aNameSpaceID,
nsIAtom* aNameAtom,
nsString& aAttrName)
{
nsCOMPtr<nsIAtom> prefix;
aAttrName.Truncate();
mContent->GetNameSpacePrefixFromId(aNameSpaceID, *getter_AddRefs(prefix));
if (prefix) {
prefix->ToString(aAttrName);
aAttrName.AppendWithConversion(":");
}
if (aNameAtom) {
nsAutoString tmp;
aNameAtom->ToString(tmp);
aAttrName.Append(tmp);
}
}
nsresult nsresult
nsDOMAttributeMap::GetNamedItem(const nsString &aAttrName, nsDOMAttributeMap::GetNamedItem(const nsString &aAttrName,
nsIDOMNode** aAttribute) nsIDOMNode** aAttribute)
@ -120,29 +98,51 @@ nsDOMAttributeMap::GetNamedItem(const nsString &aAttrName,
nsresult rv = NS_OK; nsresult rv = NS_OK;
if (mContent) { if (mContent) {
nsCOMPtr<nsIAtom> nameAtom; nsCOMPtr<nsIAtom> nameAtom(dont_AddRef(NS_NewAtom(aAttrName)));
PRInt32 nameSpaceID; nsCOMPtr<nsIAtom> prefix;
nsAutoString normalizedName;
mContent->ParseAttributeString(aAttrName, *getter_AddRefs(nameAtom),
nameSpaceID);
if (kNameSpaceID_Unknown == nameSpaceID) {
return NS_ERROR_DOM_NOT_FOUND_ERR;
}
GetNormalizedName(nameSpaceID, nameAtom, normalizedName);
nsresult attrResult; nsresult attrResult;
nsAutoString value; nsAutoString value;
attrResult = mContent->GetAttribute(nameSpaceID, nameAtom, value);
attrResult = mContent->GetAttribute(kNameSpaceID_Unknown, nameAtom,
*getter_AddRefs(prefix), value);
if (NS_CONTENT_ATTR_NOT_THERE != attrResult && NS_SUCCEEDED(attrResult)) { if (NS_CONTENT_ATTR_NOT_THERE != attrResult && NS_SUCCEEDED(attrResult)) {
nsDOMAttribute* domAttribute; PRInt32 nameSpaceID = kNameSpaceID_None;
domAttribute = new nsDOMAttribute(mContent, normalizedName, value);
if (!domAttribute) { if (prefix) {
rv = NS_ERROR_OUT_OF_MEMORY; nsCOMPtr<nsIAtom> tmpName, tmpPrefix;
PRInt32 tmpNameSpaceID, attrCount;
mContent->GetAttributeCount(attrCount);
while (attrCount--) {
mContent->GetAttributeNameAt(attrCount, tmpNameSpaceID,
*getter_AddRefs(tmpName),
*getter_AddRefs(tmpPrefix));
if (tmpName == nameAtom && tmpPrefix == prefix) {
nameSpaceID = tmpNameSpaceID;
break;
}
}
} }
nsCOMPtr<nsINodeInfo> ni;
mContent->GetNodeInfo(*getter_AddRefs(ni));
NS_ENSURE_TRUE(ni, NS_ERROR_FAILURE);
nsCOMPtr<nsINodeInfoManager> nimgr;
ni->GetNodeInfoManager(*getter_AddRefs(nimgr));
NS_ENSURE_TRUE(nimgr, NS_ERROR_FAILURE);
nimgr->GetNodeInfo(nameAtom, prefix, nameSpaceID,
*getter_AddRefs(ni));
NS_ENSURE_TRUE(ni, NS_ERROR_FAILURE);
nsDOMAttribute* domAttribute;
domAttribute = new nsDOMAttribute(mContent, ni, value);
NS_ENSURE_TRUE(domAttribute, NS_ERROR_OUT_OF_MEMORY);
rv = domAttribute->QueryInterface(NS_GET_IID(nsIDOMAttr), rv = domAttribute->QueryInterface(NS_GET_IID(nsIDOMAttr),
(void **)aAttribute); (void **)aAttribute);
} }
@ -172,24 +172,30 @@ nsDOMAttributeMap::SetNamedItem(nsIDOMNode *aNode, nsIDOMNode **aReturn)
nsAutoString name, value; nsAutoString name, value;
nsCOMPtr<nsIAtom> nameAtom; nsCOMPtr<nsIAtom> nameAtom;
PRInt32 nameSpaceID;
// Get normalized attribute name
attribute->GetName(name); attribute->GetName(name);
mContent->ParseAttributeString(name, *getter_AddRefs(nameAtom),
nameSpaceID);
if (kNameSpaceID_Unknown == nameSpaceID) {
nameSpaceID = kNameSpaceID_None; // ignore unknown prefix XXX is this correct?
}
GetNormalizedName(nameSpaceID, nameAtom, name);
nsresult attrResult = mContent->GetAttribute(nameSpaceID, nameAtom, value); nsCOMPtr<nsINodeInfo> ni;
mContent->GetNodeInfo(*getter_AddRefs(ni));
NS_ENSURE_TRUE(ni, NS_ERROR_FAILURE);
nsCOMPtr<nsINodeInfoManager> nimgr;
ni->GetNodeInfoManager(*getter_AddRefs(nimgr));
NS_ENSURE_TRUE(nimgr, NS_ERROR_FAILURE);
nimgr->GetNodeInfo(name, nsnull, kNameSpaceID_None, *getter_AddRefs(ni));
NS_ENSURE_TRUE(ni, NS_ERROR_FAILURE);
ni->GetNameAtom(*getter_AddRefs(nameAtom));
nsresult attrResult = mContent->GetAttribute(kNameSpaceID_Unknown,
nameAtom, value);
if (NS_CONTENT_ATTR_NOT_THERE != attrResult && NS_SUCCEEDED(attrResult)) { if (NS_CONTENT_ATTR_NOT_THERE != attrResult && NS_SUCCEEDED(attrResult)) {
nsDOMAttribute* domAttribute; nsDOMAttribute* domAttribute;
// We pass a null content here since the attr node we return isn't // We pass a null content here since the attr node we return isn't
// tied to this content anymore. // tied to this content anymore.
domAttribute = new nsDOMAttribute(nsnull, name, value); domAttribute = new nsDOMAttribute(nsnull, ni, value);
if (!domAttribute) { if (!domAttribute) {
return NS_ERROR_OUT_OF_MEMORY; return NS_ERROR_OUT_OF_MEMORY;
} }
@ -200,7 +206,7 @@ nsDOMAttributeMap::SetNamedItem(nsIDOMNode *aNode, nsIDOMNode **aReturn)
attribute->GetValue(value); attribute->GetValue(value);
rv = mContent->SetAttribute(nameSpaceID, nameAtom, value, PR_TRUE); rv = mContent->SetAttribute(kNameSpaceID_None, nameAtom, value, PR_TRUE);
} }
return rv; return rv;
@ -215,25 +221,48 @@ nsDOMAttributeMap::RemoveNamedItem(const nsString& aName, nsIDOMNode** aReturn)
nsresult rv = NS_OK; nsresult rv = NS_OK;
if (mContent) { if (mContent) {
nsCOMPtr<nsIAtom> nameAtom(dont_AddRef(NS_NewAtom(aName)));
PRInt32 nameSpaceID = kNameSpaceID_None;
nsCOMPtr<nsIDOMNode> attribute; nsCOMPtr<nsIDOMNode> attribute;
nsCOMPtr<nsIAtom> nameAtom; nsCOMPtr<nsIAtom> prefix;
PRInt32 nameSpaceID;
nsAutoString name; name.Assign(aName);
mContent->ParseAttributeString(aName, *getter_AddRefs(nameAtom),
nameSpaceID);
if (kNameSpaceID_Unknown == nameSpaceID) {
return NS_ERROR_DOM_NOT_FOUND_ERR;
}
GetNormalizedName(nameSpaceID, nameAtom, name);
nsresult attrResult; nsresult attrResult;
nsAutoString value; nsAutoString value;
attrResult = mContent->GetAttribute(nameSpaceID, nameAtom, value); attrResult = mContent->GetAttribute(kNameSpaceID_Unknown, nameAtom,
*getter_AddRefs(prefix), value);
if (NS_CONTENT_ATTR_NOT_THERE != attrResult && NS_SUCCEEDED(attrResult)) { if (NS_CONTENT_ATTR_NOT_THERE != attrResult && NS_SUCCEEDED(attrResult)) {
if (prefix) {
nsCOMPtr<nsIAtom> tmpName, tmpPrefix;
PRInt32 tmpNameSpaceID, attrCount;
mContent->GetAttributeCount(attrCount);
while (attrCount--) {
mContent->GetAttributeNameAt(attrCount, tmpNameSpaceID,
*getter_AddRefs(tmpName),
*getter_AddRefs(tmpPrefix));
if (tmpName == nameAtom && tmpPrefix == prefix) {
nameSpaceID = tmpNameSpaceID;
break;
}
}
}
nsCOMPtr<nsINodeInfo> ni;
mContent->GetNodeInfo(*getter_AddRefs(ni));
NS_ENSURE_TRUE(ni, NS_ERROR_FAILURE);
nsCOMPtr<nsINodeInfoManager> nimgr;
ni->GetNodeInfoManager(*getter_AddRefs(nimgr));
NS_ENSURE_TRUE(nimgr, NS_ERROR_FAILURE);
nimgr->GetNodeInfo(nameAtom, prefix, nameSpaceID, *getter_AddRefs(ni));
NS_ENSURE_TRUE(ni, NS_ERROR_FAILURE);
nsDOMAttribute* domAttribute; nsDOMAttribute* domAttribute;
domAttribute = new nsDOMAttribute(nsnull, name, value); domAttribute = new nsDOMAttribute(nsnull, ni, value);
if (!domAttribute) { if (!domAttribute) {
return NS_ERROR_OUT_OF_MEMORY; return NS_ERROR_OUT_OF_MEMORY;
} }
@ -254,6 +283,7 @@ nsDOMAttributeMap::RemoveNamedItem(const nsString& aName, nsIDOMNode** aReturn)
nsresult nsresult
nsDOMAttributeMap::Item(PRUint32 aIndex, nsIDOMNode** aReturn) nsDOMAttributeMap::Item(PRUint32 aIndex, nsIDOMNode** aReturn)
{ {
NS_ENSURE_ARG_POINTER(aReturn);
PRInt32 nameSpaceID; PRInt32 nameSpaceID;
nsCOMPtr<nsIAtom> nameAtom, prefix; nsCOMPtr<nsIAtom> nameAtom, prefix;
@ -266,14 +296,19 @@ nsDOMAttributeMap::Item(PRUint32 aIndex, nsIDOMNode** aReturn)
nsAutoString value, name; nsAutoString value, name;
mContent->GetAttribute(nameSpaceID, nameAtom, value); mContent->GetAttribute(nameSpaceID, nameAtom, value);
GetNormalizedName(nameSpaceID, nameAtom, name); nsCOMPtr<nsINodeInfo> ni;
mContent->GetNodeInfo(*getter_AddRefs(ni));
NS_ENSURE_TRUE(ni, NS_ERROR_FAILURE);
nsDOMAttribute* domAttribute; nsCOMPtr<nsINodeInfoManager> nimgr;
ni->GetNodeInfoManager(*getter_AddRefs(nimgr));
NS_ENSURE_TRUE(nimgr, NS_ERROR_FAILURE);
domAttribute = new nsDOMAttribute(mContent, name, value); nimgr->GetNodeInfo(nameAtom, prefix, nameSpaceID, *getter_AddRefs(ni));
if (!domAttribute) { NS_ENSURE_TRUE(ni, NS_ERROR_FAILURE);
return NS_ERROR_OUT_OF_MEMORY;
} nsDOMAttribute* domAttribute = new nsDOMAttribute(mContent, ni, value);
NS_ENSURE_TRUE(domAttribute, NS_ERROR_OUT_OF_MEMORY);
rv = domAttribute->QueryInterface(NS_GET_IID(nsIDOMAttr), rv = domAttribute->QueryInterface(NS_GET_IID(nsIDOMAttr),
(void **)aReturn); (void **)aReturn);
@ -309,21 +344,175 @@ nsDOMAttributeMap::GetNamedItemNS(const nsString& aNamespaceURI,
const nsString& aLocalName, const nsString& aLocalName,
nsIDOMNode** aReturn) nsIDOMNode** aReturn)
{ {
return NS_ERROR_NOT_IMPLEMENTED; NS_ENSURE_ARG_POINTER(aReturn);
*aReturn = nsnull;
nsresult rv = NS_OK;
if (mContent) {
nsCOMPtr<nsIAtom> nameAtom(dont_AddRef(NS_NewAtom(aLocalName)));
PRInt32 nameSpaceID = kNameSpaceID_None;
nsCOMPtr<nsIAtom> prefix;
nsCOMPtr<nsINodeInfo> ni;
mContent->GetNodeInfo(*getter_AddRefs(ni));
NS_ENSURE_TRUE(ni, NS_ERROR_FAILURE);
nsCOMPtr<nsINodeInfoManager> nimgr;
ni->GetNodeInfoManager(*getter_AddRefs(nimgr));
NS_ENSURE_TRUE(nimgr, NS_ERROR_FAILURE);
if (aNamespaceURI.Length()) {
nsCOMPtr<nsINameSpaceManager> nsmgr;
nimgr->GetNamespaceManager(*getter_AddRefs(nsmgr));
NS_ENSURE_TRUE(nsmgr, NS_ERROR_FAILURE);
nsmgr->GetNameSpaceID(aNamespaceURI, nameSpaceID);
if (nameSpaceID == kNameSpaceID_Unknown)
return NS_OK;
}
nsresult attrResult;
nsAutoString value;
attrResult = mContent->GetAttribute(nameSpaceID, nameAtom,
*getter_AddRefs(prefix), value);
if (NS_CONTENT_ATTR_NOT_THERE != attrResult && NS_SUCCEEDED(attrResult)) {
nimgr->GetNodeInfo(nameAtom, prefix, nameSpaceID, *getter_AddRefs(ni));
NS_ENSURE_TRUE(ni, NS_ERROR_FAILURE);
nsDOMAttribute* domAttribute;
domAttribute = new nsDOMAttribute(mContent, ni, value);
NS_ENSURE_TRUE(domAttribute, NS_ERROR_OUT_OF_MEMORY);
rv = domAttribute->QueryInterface(NS_GET_IID(nsIDOMAttr),
(void **)aReturn);
}
}
return rv;
} }
nsresult nsresult
nsDOMAttributeMap::SetNamedItemNS(nsIDOMNode* aArg, nsIDOMNode** aReturn) nsDOMAttributeMap::SetNamedItemNS(nsIDOMNode* aArg, nsIDOMNode** aReturn)
{ {
return NS_ERROR_NOT_IMPLEMENTED; NS_ENSURE_ARG_POINTER(aReturn);
nsresult rv = NS_OK;
*aReturn = nsnull;
if (mContent) {
nsCOMPtr<nsIDOMAttr> attribute(do_QueryInterface(aArg));
if (!attribute) {
return NS_ERROR_DOM_HIERARCHY_REQUEST_ERR;
}
nsAutoString name, nsURI, value;
nsCOMPtr<nsIAtom> nameAtom;
PRInt32 nameSpaceID;
attribute->GetName(name);
attribute->GetNamespaceURI(nsURI);
nsCOMPtr<nsINodeInfo> ni;
mContent->GetNodeInfo(*getter_AddRefs(ni));
NS_ENSURE_TRUE(ni, NS_ERROR_FAILURE);
nsCOMPtr<nsINodeInfoManager> nimgr;
ni->GetNodeInfoManager(*getter_AddRefs(nimgr));
NS_ENSURE_TRUE(nimgr, NS_ERROR_FAILURE);
nimgr->GetNodeInfo(name, nsURI, *getter_AddRefs(ni));
NS_ENSURE_TRUE(ni, NS_ERROR_FAILURE);
ni->GetNameAtom(*getter_AddRefs(nameAtom));
ni->GetNamespaceID(nameSpaceID);
nsresult attrResult = mContent->GetAttribute(nameSpaceID, nameAtom, value);
if (NS_CONTENT_ATTR_NOT_THERE != attrResult && NS_SUCCEEDED(attrResult)) {
nsDOMAttribute* domAttribute;
// We pass a null content here since the attr node we return isn't
// tied to this content anymore.
domAttribute = new nsDOMAttribute(nsnull, ni, value);
if (!domAttribute) {
return NS_ERROR_OUT_OF_MEMORY;
}
rv = domAttribute->QueryInterface(NS_GET_IID(nsIDOMAttr),
(void **)aReturn);
}
attribute->GetValue(value);
rv = mContent->SetAttribute(ni, value, PR_TRUE);
}
return rv;
} }
nsresult nsresult
nsDOMAttributeMap::RemoveNamedItemNS(const nsString& aNamespaceURI, nsDOMAttributeMap::RemoveNamedItemNS(const nsString& aNamespaceURI,
const nsString&aLocalName, const nsString& aLocalName,
nsIDOMNode** aReturn) nsIDOMNode** aReturn)
{ {
return NS_ERROR_NOT_IMPLEMENTED; NS_ENSURE_ARG_POINTER(aReturn);
*aReturn = nsnull;
nsresult rv = NS_OK;
if (mContent) {
nsCOMPtr<nsIAtom> nameAtom(dont_AddRef(NS_NewAtom(aLocalName)));
PRInt32 nameSpaceID = kNameSpaceID_None;
nsCOMPtr<nsIDOMNode> attribute;
nsCOMPtr<nsIAtom> prefix;
nsCOMPtr<nsINodeInfo> ni;
mContent->GetNodeInfo(*getter_AddRefs(ni));
NS_ENSURE_TRUE(ni, NS_ERROR_FAILURE);
nsCOMPtr<nsINodeInfoManager> nimgr;
ni->GetNodeInfoManager(*getter_AddRefs(nimgr));
NS_ENSURE_TRUE(nimgr, NS_ERROR_FAILURE);
if (aNamespaceURI.Length()) {
nsCOMPtr<nsINameSpaceManager> nsmgr;
nimgr->GetNamespaceManager(*getter_AddRefs(nsmgr));
NS_ENSURE_TRUE(nsmgr, NS_ERROR_FAILURE);
nsmgr->GetNameSpaceID(aNamespaceURI, nameSpaceID);
if (nameSpaceID == kNameSpaceID_Unknown)
return NS_ERROR_DOM_NOT_FOUND_ERR;
}
nsresult attrResult;
nsAutoString value;
attrResult = mContent->GetAttribute(nameSpaceID, nameAtom,
*getter_AddRefs(prefix), value);
if (NS_CONTENT_ATTR_NOT_THERE != attrResult && NS_SUCCEEDED(attrResult)) {
nimgr->GetNodeInfo(nameAtom, prefix, nameSpaceID, *getter_AddRefs(ni));
NS_ENSURE_TRUE(ni, NS_ERROR_FAILURE);
nsDOMAttribute* domAttribute;
domAttribute = new nsDOMAttribute(nsnull, ni, value);
if (!domAttribute) {
return NS_ERROR_OUT_OF_MEMORY;
}
rv = domAttribute->QueryInterface(NS_GET_IID(nsIDOMAttr),
(void **)aReturn);
} else {
return NS_ERROR_DOM_NOT_FOUND_ERR;
}
rv = mContent->UnsetAttribute(nameSpaceID, nameAtom, PR_TRUE);
}
return rv;
} }

Просмотреть файл

@ -63,15 +63,6 @@ public:
PRUint32* aResult); PRUint32* aResult);
#endif #endif
protected:
nsresult GetNamedItemCommon(const nsString& aAttrName,
PRInt32 aNameSpaceID,
nsIAtom* aNameAtom,
nsIDOMNode** aAttribute);
void GetNormalizedName(PRInt32 aNameSpaceID,
nsIAtom* aNameAtom,
nsString& aAttrName);
private: private:
nsIContent* mContent; nsIContent* mContent;
void* mScriptObject; void* mScriptObject;

Просмотреть файл

@ -2146,14 +2146,19 @@ NS_IMETHODIMP
nsDocument::CreateAttribute(const nsString& aName, nsDocument::CreateAttribute(const nsString& aName,
nsIDOMAttr** aReturn) nsIDOMAttr** aReturn)
{ {
NS_ENSURE_ARG_POINTER(aReturn);
NS_ENSURE_TRUE(mNodeInfoManager, NS_ERROR_NOT_INITIALIZED);
nsAutoString value; nsAutoString value;
nsDOMAttribute* attribute; nsDOMAttribute* attribute;
value.Truncate(); nsCOMPtr<nsINodeInfo> nodeInfo;
attribute = new nsDOMAttribute(nsnull, aName, value); nsresult rv = mNodeInfoManager->GetNodeInfo(aName, nsnull, kNameSpaceID_None,
if (nsnull == attribute) { *getter_AddRefs(nodeInfo));
return NS_ERROR_OUT_OF_MEMORY; NS_ENSURE_SUCCESS(rv, rv);
}
attribute = new nsDOMAttribute(nsnull, nodeInfo, value);
NS_ENSURE_TRUE(attribute, NS_ERROR_OUT_OF_MEMORY);
return attribute->QueryInterface(NS_GET_IID(nsIDOMAttr), (void**)aReturn); return attribute->QueryInterface(NS_GET_IID(nsIDOMAttr), (void**)aReturn);
} }

Просмотреть файл

@ -425,7 +425,7 @@ nsDocumentFragment::CloneNode(PRBool aDeep, nsIDOMNode** aReturn)
NS_IMETHODIMP NS_IMETHODIMP
nsDocumentFragment::Normalize() nsDocumentFragment::Normalize()
{ {
NS_NOTYETIMPLEMENTED("write me!"); // Nothing to do here yet
return NS_OK; return NS_OK;
} }

Просмотреть файл

@ -217,28 +217,26 @@ nsGenericDOMDataNode::GetOwnerDocument(nsIDOMDocument** aOwnerDocument)
nsresult nsresult
nsGenericDOMDataNode::GetNamespaceURI(nsString& aNamespaceURI) nsGenericDOMDataNode::GetNamespaceURI(nsString& aNamespaceURI)
{ {
NS_NOTYETIMPLEMENTED("write me!"); aNamespaceURI.Truncate();
return NS_OK; return NS_OK;
} }
nsresult nsresult
nsGenericDOMDataNode::GetPrefix(nsString& aPrefix) nsGenericDOMDataNode::GetPrefix(nsString& aPrefix)
{ {
NS_NOTYETIMPLEMENTED("write me!"); aPrefix.Truncate();
return NS_OK; return NS_OK;
} }
nsresult nsresult
nsGenericDOMDataNode::SetPrefix(const nsString& aPrefix) nsGenericDOMDataNode::SetPrefix(const nsString& aPrefix)
{ {
NS_NOTYETIMPLEMENTED("write me!");
return NS_ERROR_DOM_NAMESPACE_ERR; return NS_ERROR_DOM_NAMESPACE_ERR;
} }
nsresult nsresult
nsGenericDOMDataNode::Normalize() nsGenericDOMDataNode::Normalize()
{ {
NS_NOTYETIMPLEMENTED("write me!");
return NS_OK; return NS_OK;
} }

Просмотреть файл

@ -714,15 +714,9 @@ nsGenericElement::GetTagName(nsString& aTagName)
nsresult nsresult
nsGenericElement::GetAttribute(const nsString& aName, nsString& aReturn) nsGenericElement::GetAttribute(const nsString& aName, nsString& aReturn)
{ {
nsIAtom* nameAtom; nsCOMPtr<nsIAtom> nameAtom(dont_AddRef(NS_NewAtom(aName)));
PRInt32 nameSpaceID;
mContent->ParseAttributeString(aName, nameAtom, nameSpaceID); mContent->GetAttribute(kNameSpaceID_Unknown, nameAtom, aReturn);
if (kNameSpaceID_Unknown == nameSpaceID) {
nameSpaceID = kNameSpaceID_None; // ignore unknown prefix XXX is this correct?
}
mContent->GetAttribute(nameSpaceID, nameAtom, aReturn);
NS_RELEASE(nameAtom);
return NS_OK; return NS_OK;
} }
@ -1071,15 +1065,10 @@ nsGenericElement::HasAttribute(const nsString& aName, PRBool* aReturn)
{ {
NS_ENSURE_ARG_POINTER(aReturn); NS_ENSURE_ARG_POINTER(aReturn);
nsCOMPtr<nsIAtom> name; nsCOMPtr<nsIAtom> name(dont_AddRef(NS_NewAtom(aName)));
PRInt32 nsid;
nsresult rv = mContent->ParseAttributeString(aName, *getter_AddRefs(name),
nsid);
NS_ENSURE_SUCCESS(rv, rv);
nsAutoString tmp; nsAutoString tmp;
rv = mContent->GetAttribute(nsid, name, tmp); nsresult rv = mContent->GetAttribute(kNameSpaceID_Unknown, name, tmp);
*aReturn = rv == NS_CONTENT_ATTR_NOT_THERE ? PR_FALSE : PR_TRUE; *aReturn = rv == NS_CONTENT_ATTR_NOT_THERE ? PR_FALSE : PR_TRUE;
@ -2601,70 +2590,17 @@ nsGenericContainerElement::SetAttribute(PRInt32 aNameSpaceID, nsIAtom* aName,
const nsString& aValue, const nsString& aValue,
PRBool aNotify) PRBool aNotify)
{ {
NS_ASSERTION(kNameSpaceID_Unknown != aNameSpaceID, "must have name space ID"); nsresult rv;
if (kNameSpaceID_Unknown == aNameSpaceID) { nsCOMPtr<nsINodeInfoManager> nimgr;
return NS_ERROR_ILLEGAL_VALUE; rv = mNodeInfo->GetNodeInfoManager(*getter_AddRefs(nimgr));
} NS_ENSURE_SUCCESS(rv, rv);
NS_ASSERTION(nsnull != aName, "must have attribute name");
if (nsnull == aName) {
return NS_ERROR_NULL_POINTER;
}
nsresult rv = NS_ERROR_OUT_OF_MEMORY; nsCOMPtr<nsINodeInfo> ni;
rv = nimgr->GetNodeInfo(aName, nsnull, aNameSpaceID,
*getter_AddRefs(ni));
NS_ENSURE_SUCCESS(rv, rv);
if (nsnull == mAttributes) { return SetAttribute(ni, aValue, aNotify);
mAttributes = new nsVoidArray();
}
if (aNotify && (nsnull != mDocument)) {
mDocument->BeginUpdate();
}
if (nsnull != mAttributes) {
nsGenericAttribute* attr;
PRInt32 index;
PRInt32 count = mAttributes->Count();
for (index = 0; index < count; index++) {
attr = (nsGenericAttribute*)mAttributes->ElementAt(index);
if (attr->mNodeInfo->Equals(aName, aNameSpaceID)) {
attr->mValue = aValue;
rv = NS_OK;
break;
}
}
if (index >= count) { // didn't find it
nsCOMPtr<nsINodeInfoManager> nimgr;
mNodeInfo->GetNodeInfoManager(*getter_AddRefs(nimgr));
nsCOMPtr<nsINodeInfo> ni;
rv = nimgr->GetNodeInfo(aName, nsnull, aNameSpaceID,
*getter_AddRefs(ni));
NS_ENSURE_SUCCESS(rv, rv);
attr = new nsGenericAttribute(ni, aValue);
if (nsnull != attr) {
mAttributes->AppendElement(attr);
rv = NS_OK;
}
}
}
if (mDocument && NS_SUCCEEDED(rv)) {
nsCOMPtr<nsIBindingManager> bindingManager;
mDocument->GetBindingManager(getter_AddRefs(bindingManager));
nsCOMPtr<nsIXBLBinding> binding;
bindingManager->GetBinding(mContent, getter_AddRefs(binding));
if (binding)
binding->AttributeChanged(aName, aNameSpaceID, PR_FALSE);
if (aNotify) {
mDocument->AttributeChanged(mContent, aNameSpaceID, aName, NS_STYLE_HINT_UNKNOWN);
mDocument->EndUpdate();
}
}
return rv;
} }
nsresult nsresult
@ -2674,15 +2610,58 @@ nsGenericContainerElement::SetAttribute(nsINodeInfo* aNodeInfo,
{ {
NS_ENSURE_ARG_POINTER(aNodeInfo); NS_ENSURE_ARG_POINTER(aNodeInfo);
nsCOMPtr<nsIAtom> atom; nsresult rv = NS_ERROR_OUT_OF_MEMORY;
PRInt32 nsid;
aNodeInfo->GetNameAtom(*getter_AddRefs(atom)); if (!mAttributes) {
aNodeInfo->GetNamespaceID(nsid); mAttributes = new nsVoidArray();
NS_ENSURE_TRUE(mAttributes, NS_ERROR_OUT_OF_MEMORY);
}
if (aNotify && (nsnull != mDocument)) {
mDocument->BeginUpdate();
}
nsGenericAttribute* attr;
PRInt32 index;
PRInt32 count = mAttributes->Count();
for (index = 0; index < count; index++) {
attr = (nsGenericAttribute*)mAttributes->ElementAt(index);
if (attr->mNodeInfo == aNodeInfo) {
attr->mValue = aValue;
rv = NS_OK;
break;
}
}
if (index >= count) { // didn't find it
attr = new nsGenericAttribute(aNodeInfo, aValue);
NS_ENSURE_TRUE(attr, NS_ERROR_OUT_OF_MEMORY);
// We still rely on the old way of setting the attribute. mAttributes->AppendElement(attr);
rv = NS_OK;
}
return SetAttribute(nsid, atom, aValue, aNotify); if (mDocument && NS_SUCCEEDED(rv)) {
nsCOMPtr<nsIAtom> name;
PRInt32 nameSpaceID;
aNodeInfo->GetNameAtom(*getter_AddRefs(name));
aNodeInfo->GetNamespaceID(nameSpaceID);
nsCOMPtr<nsIBindingManager> bindingManager;
mDocument->GetBindingManager(getter_AddRefs(bindingManager));
nsCOMPtr<nsIXBLBinding> binding;
bindingManager->GetBinding(mContent, getter_AddRefs(binding));
if (binding)
binding->AttributeChanged(name, nameSpaceID, PR_FALSE);
if (aNotify) {
mDocument->AttributeChanged(mContent, nameSpaceID, name, NS_STYLE_HINT_UNKNOWN);
mDocument->EndUpdate();
}
}
return rv;
} }
nsresult nsresult
@ -2710,7 +2689,7 @@ nsGenericContainerElement::GetAttribute(PRInt32 aNameSpaceID, nsIAtom* aName,
PRInt32 index; PRInt32 index;
for (index = 0; index < count; index++) { for (index = 0; index < count; index++) {
const nsGenericAttribute* attr = (const nsGenericAttribute*)mAttributes->ElementAt(index); const nsGenericAttribute* attr = (const nsGenericAttribute*)mAttributes->ElementAt(index);
if ((attr->mNodeInfo->NamespaceEquals(kNameSpaceID_Unknown) || if ((aNameSpaceID == kNameSpaceID_Unknown ||
attr->mNodeInfo->NamespaceEquals(aNameSpaceID)) && attr->mNodeInfo->NamespaceEquals(aNameSpaceID)) &&
(attr->mNodeInfo->Equals(aName))) { (attr->mNodeInfo->Equals(aName))) {
attr->mNodeInfo->GetPrefixAtom(aPrefix); attr->mNodeInfo->GetPrefixAtom(aPrefix);
@ -2754,7 +2733,7 @@ nsGenericContainerElement::UnsetAttribute(PRInt32 aNameSpaceID, nsIAtom* aName,
PRBool found = PR_FALSE; PRBool found = PR_FALSE;
for (index = 0; index < count; index++) { for (index = 0; index < count; index++) {
nsGenericAttribute* attr = (nsGenericAttribute*)mAttributes->ElementAt(index); nsGenericAttribute* attr = (nsGenericAttribute*)mAttributes->ElementAt(index);
if ((attr->mNodeInfo->NamespaceEquals(kNameSpaceID_Unknown) || if ((aNameSpaceID == kNameSpaceID_Unknown ||
attr->mNodeInfo->NamespaceEquals(aNameSpaceID)) && attr->mNodeInfo->NamespaceEquals(aNameSpaceID)) &&
attr->mNodeInfo->Equals(aName)) { attr->mNodeInfo->Equals(aName)) {
if (aNotify && (nsnull != mDocument)) { if (aNotify && (nsnull != mDocument)) {

Просмотреть файл

@ -31,7 +31,7 @@ static NS_DEFINE_IID(kINameSpaceManagerIID, NS_INAMESPACEMANAGER_IID);
static NS_DEFINE_IID(kINameSpaceIID, NS_INAMESPACE_IID); static NS_DEFINE_IID(kINameSpaceIID, NS_INAMESPACE_IID);
static const char kXMLNSNameSpaceURI[] = "<This isn't really a namespace>"; static const char kXMLNSNameSpaceURI[] = "http://www.w3.org/2000/xmlns";
static const char kXMLNameSpaceURI[] = "http://www.w3.org/XML/1998/namespace"; static const char kXMLNameSpaceURI[] = "http://www.w3.org/XML/1998/namespace";
static const char kHTMLNameSpaceURI[] = "http://www.w3.org/TR/REC-html40"; // XXX?? "urn:w3-org-ns:HTML"?? static const char kHTMLNameSpaceURI[] = "http://www.w3.org/TR/REC-html40"; // XXX?? "urn:w3-org-ns:HTML"??
// XXX To be removed: Bug 7834 --- // XXX To be removed: Bug 7834 ---

Просмотреть файл

@ -219,8 +219,26 @@ nsXMLElement::SetAttribute(PRInt32 aNameSpaceID, nsIAtom* aName,
const nsString& aValue, const nsString& aValue,
PRBool aNotify) PRBool aNotify)
{ {
if ((kNameSpaceID_XLink == aNameSpaceID) && nsresult rv;
(kTypeAtom == aName)) { nsCOMPtr<nsINodeInfoManager> nimgr;
rv = mInner.mNodeInfo->GetNodeInfoManager(*getter_AddRefs(nimgr));
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsINodeInfo> ni;
rv = nimgr->GetNodeInfo(aName, nsnull, aNameSpaceID,
*getter_AddRefs(ni));
NS_ENSURE_SUCCESS(rv, rv);
return SetAttribute(ni, aValue, aNotify);
}
NS_IMETHODIMP
nsXMLElement::SetAttribute(nsINodeInfo *aNodeInfo, const nsString& aValue,
PRBool aNotify)
{
NS_ENSURE_ARG_POINTER(aNodeInfo);
if (aNodeInfo->Equals(kTypeAtom, kNameSpaceID_XLink)) {
if (aValue.EqualsAtom(kSimpleAtom, PR_FALSE)) { if (aValue.EqualsAtom(kSimpleAtom, PR_FALSE)) {
// NOTE: This really is a link according to the XLink spec, // NOTE: This really is a link according to the XLink spec,
// we do not need to check other attributes. If there // we do not need to check other attributes. If there
@ -237,24 +255,7 @@ nsXMLElement::SetAttribute(PRInt32 aNameSpaceID, nsIAtom* aName,
// We will check for actuate="onLoad" in MaybeTriggerAutoLink // We will check for actuate="onLoad" in MaybeTriggerAutoLink
} }
return mInner.SetAttribute(aNameSpaceID, aName, aValue, aNotify); return mInner.SetAttribute(aNodeInfo, aValue, aNotify);
}
NS_IMETHODIMP
nsXMLElement::SetAttribute(nsINodeInfo *aNodeInfo, const nsString& aValue,
PRBool aNotify)
{
NS_ENSURE_ARG_POINTER(aNodeInfo);
nsCOMPtr<nsIAtom> atom;
PRInt32 nsid;
aNodeInfo->GetNameAtom(*getter_AddRefs(atom));
aNodeInfo->GetNamespaceID(nsid);
// We still rely on the old way of setting the attribute.
return SetAttribute(nsid, atom, aValue, aNotify);
} }
static nsresult WebShellToPresContext(nsIWebShell *aShell, nsIPresContext **aPresContext) static nsresult WebShellToPresContext(nsIWebShell *aShell, nsIPresContext **aPresContext)

Просмотреть файл

@ -560,30 +560,39 @@ nsXMLContentSink::AddAttributes(const nsIParserNode& aNode,
name.Truncate(); name.Truncate();
name.Append(key); name.Append(key);
nsIAtom* nameSpacePrefix = CutNameSpacePrefix(name); nsCOMPtr<nsIAtom> nameSpacePrefix(dont_AddRef(CutNameSpacePrefix(name)));
nsIAtom* nameAtom = NS_NewAtom(name); nsCOMPtr<nsIAtom> nameAtom(dont_AddRef(NS_NewAtom(name)));
PRInt32 nameSpaceID = (nsnull == nameSpacePrefix) ? kNameSpaceID_None : GetNameSpaceId(nameSpacePrefix); PRInt32 nameSpaceID;
if (kNameSpaceID_Unknown == nameSpaceID) {
nameSpaceID = kNameSpaceID_None; // XXX is this correct? or is it a bad document? if (nameSpacePrefix) {
nameSpaceID = GetNameSpaceId(nameSpacePrefix);
} else {
if (nameAtom.get() == nsLayoutAtoms::xmlnsNameSpace)
nameSpaceID = kNameSpaceID_XMLNS;
else
nameSpaceID = kNameSpaceID_None;
} }
if ((kNameSpaceID_XMLNS == nameSpaceID) && aIsHTML) {
NS_RELEASE(nameAtom); if (kNameSpaceID_Unknown == nameSpaceID) {
nameSpaceID = kNameSpaceID_None;
nameAtom = dont_AddRef(NS_NewAtom(key));
nameSpacePrefix = nsnull;
} else if ((kNameSpaceID_XMLNS == nameSpaceID) && aIsHTML) {
name.InsertWithConversion("xmlns:", 0); name.InsertWithConversion("xmlns:", 0);
nameAtom = NS_NewAtom(name); nameAtom = dont_AddRef(NS_NewAtom(name));
nameSpaceID = kNameSpaceID_HTML; // XXX this is wrong, but necessary until HTML can store other namespaces for attrs nameSpaceID = kNameSpaceID_HTML; // XXX this is wrong, but necessary until HTML can store other namespaces for attrs
} }
nsAutoString value; nsCOMPtr<nsINodeInfo> ni;
if (NS_CONTENT_ATTR_NOT_THERE == mNodeInfoManager->GetNodeInfo(nameAtom, nameSpacePrefix, nameSpaceID,
aContent->GetAttribute(nameSpaceID, nameAtom, value)) { *getter_AddRefs(ni));
// Get value and remove mandatory quotes NS_ENSURE_TRUE(ni, NS_ERROR_FAILURE);
GetAttributeValueAt(aNode, i, v);
// Add attribute to content // Get value and remove mandatory quotes
aContent->SetAttribute(nameSpaceID, nameAtom, v, PR_FALSE); GetAttributeValueAt(aNode, i, v);
}
NS_RELEASE(nameAtom); // Add attribute to content
NS_IF_RELEASE(nameSpacePrefix); aContent->SetAttribute(ni, v, PR_FALSE);
} }
// Give autoloading links a chance to fire // Give autoloading links a chance to fire