From 9bf72a1b879b19df42ebef4b4d3ebe94abfe20fe Mon Sep 17 00:00:00 2001 From: Jonas Sicking Date: Tue, 14 Jun 2011 00:56:49 -0700 Subject: [PATCH] Bug 659539 Part 1: Give nsINodeInfos a nodeType, nodeName and localName. r=bz --- content/base/public/nsContentUtils.h | 5 +- content/base/public/nsINodeInfo.h | 52 ++++++++++++------ content/base/src/nsCommentNode.cpp | 2 + content/base/src/nsContentUtils.cpp | 5 +- content/base/src/nsDOMAttribute.cpp | 6 +- content/base/src/nsDOMAttributeMap.cpp | 9 ++- content/base/src/nsDOMDocumentType.cpp | 24 ++++---- content/base/src/nsDOMDocumentType.h | 2 - content/base/src/nsDocument.cpp | 9 ++- content/base/src/nsDocumentFragment.cpp | 3 +- content/base/src/nsGenericDOMDataNode.cpp | 7 +++ content/base/src/nsGenericElement.cpp | 16 +++++- content/base/src/nsGkAtomList.h | 1 + content/base/src/nsNodeInfo.cpp | 55 ++++++++++++++----- content/base/src/nsNodeInfo.h | 42 +++++++++++++- content/base/src/nsNodeInfoManager.cpp | 52 +++++++++++------- content/base/src/nsNodeInfoManager.h | 9 ++- content/base/src/nsNodeUtils.cpp | 4 +- content/base/src/nsTextNode.cpp | 2 + .../html/content/src/nsHTMLAudioElement.cpp | 3 +- .../html/content/src/nsHTMLImageElement.cpp | 3 +- .../html/content/src/nsHTMLOptionElement.cpp | 3 +- .../html/content/src/nsTextEditorState.cpp | 6 +- content/html/document/src/ImageDocument.cpp | 3 +- content/html/document/src/MediaDocument.cpp | 9 ++- content/html/document/src/PluginDocument.cpp | 3 +- content/html/document/src/VideoDocument.cpp | 3 +- .../html/document/src/nsHTMLContentSink.cpp | 16 ++++-- .../src/nsHTMLFragmentContentSink.cpp | 20 +++---- content/svg/content/src/nsSVGElement.cpp | 3 +- content/svg/content/src/nsSVGUseElement.cpp | 4 +- content/xbl/src/nsXBLContentSink.cpp | 3 +- content/xml/content/src/nsXMLCDATASection.cpp | 5 +- .../src/nsXMLProcessingInstruction.cpp | 27 +++++---- .../content/src/nsXMLProcessingInstruction.h | 3 - content/xml/content/src/nsXMLStylesheetPI.cpp | 7 ++- content/xml/document/src/nsXMLContentSink.cpp | 3 +- .../document/src/nsXMLFragmentContentSink.cpp | 29 ++-------- content/xslt/src/xslt/txMozillaTextOutput.cpp | 3 +- content/xslt/src/xslt/txMozillaXMLOutput.cpp | 6 +- content/xtf/src/nsXTFElementWrapper.cpp | 4 +- content/xul/content/src/nsXULElement.cpp | 9 +-- content/xul/document/src/nsXULContentSink.cpp | 6 +- content/xul/document/src/nsXULDocument.cpp | 3 +- .../document/src/nsXULPrototypeDocument.cpp | 7 ++- .../xul/templates/src/nsXULContentBuilder.cpp | 3 +- layout/base/nsCSSFrameConstructor.cpp | 8 ++- layout/build/nsContentDLF.cpp | 9 ++- layout/forms/nsComboboxControlFrame.cpp | 3 +- layout/forms/nsFileControlFrame.cpp | 9 ++- layout/forms/nsIsIndexFrame.cpp | 9 ++- layout/forms/nsProgressFrame.cpp | 3 +- layout/generic/nsGfxScrollFrame.cpp | 9 ++- layout/generic/nsVideoFrame.cpp | 6 +- layout/xul/base/src/nsDocElementBoxFrame.cpp | 6 +- parser/html/nsHtml5TreeOperation.cpp | 6 +- 56 files changed, 377 insertions(+), 190 deletions(-) diff --git a/content/base/public/nsContentUtils.h b/content/base/public/nsContentUtils.h index c3fb18ede910..89c42f9cf9fc 100644 --- a/content/base/public/nsContentUtils.h +++ b/content/base/public/nsContentUtils.h @@ -546,6 +546,7 @@ public: static nsresult GetNodeInfoFromQName(const nsAString& aNamespaceURI, const nsAString& aQualifiedName, nsNodeInfoManager* aNodeInfoManager, + PRUint16 aNodeType, nsINodeInfo** aNodeInfo); static void SplitExpatName(const PRUnichar *aExpatName, nsIAtom **aPrefix, @@ -689,7 +690,9 @@ public: nsNodeInfoManager *niMgr = aNodeInfo->NodeInfoManager(); *aResult = niMgr->GetNodeInfo(aName, aNodeInfo->GetPrefixAtom(), - aNodeInfo->NamespaceID()).get(); + aNodeInfo->NamespaceID(), + aNodeInfo->NodeType(), + aNodeInfo->GetExtraName()).get(); return *aResult ? NS_OK : NS_ERROR_OUT_OF_MEMORY; } diff --git a/content/base/public/nsINodeInfo.h b/content/base/public/nsINodeInfo.h index 2520899cbfc1..5fbd49d2ab5a 100644 --- a/content/base/public/nsINodeInfo.h +++ b/content/base/public/nsINodeInfo.h @@ -81,7 +81,7 @@ public: NS_DECLARE_STATIC_IID_ACCESSOR(NS_INODEINFO_IID) nsINodeInfo() - : mInner(nsnull, nsnull, kNameSpaceID_None), + : mInner(nsnull, nsnull, kNameSpaceID_None, 0, nsnull), mOwnerManager(nsnull) { } @@ -159,30 +159,35 @@ public: /* * Get the namespace URI for a node, if the node has a namespace URI. - * - * For the HTML element "" in a HTML document this will return a null - * string and for the XML element "" (assuming that this element, - * or one of its ancestors has an - * xmlns:html='http://www.w3.org/1999/xhtml' attribute) this will return - * the string "http://www.w3.org/1999/xhtml". */ virtual nsresult GetNamespaceURI(nsAString& aNameSpaceURI) const = 0; /* * Get the namespace ID for a node if the node has a namespace, if not this * returns kNameSpaceID_None. - * - * For the HTML element "" in a HTML document this will return - * kNameSpaceID_None and for the XML element "" (assuming that - * this element, or one of its ancestors has an - * xmlns:html='http://www.w3.org/1999/xhtml' attribute) this will return - * the namespace ID for "http://www.w3.org/1999/xhtml". */ PRInt32 NamespaceID() const { return mInner.mNamespaceID; } + /* + * Get the nodetype for the node. Returns the values specified in nsIDOMNode + * for nsIDOMNode.nodeType + */ + PRUint16 NodeType() const + { + return mInner.mNodeType; + } + + /* + * Get the extra name, used by PIs and DocTypes, for the node. + */ + nsIAtom* GetExtraName() const + { + return mInner.mExtraName; + } + /* * Get and set the ID attribute atom for this node. * See http://www.w3.org/TR/1998/REC-xml-19980210#sec-attribute-types @@ -322,24 +327,28 @@ protected: public: nsNodeInfoInner() : mName(nsnull), mPrefix(nsnull), mNamespaceID(kNameSpaceID_Unknown), - mNameString(nsnull) + mNodeType(0), mNameString(nsnull), mExtraName(nsnull) { } - nsNodeInfoInner(nsIAtom *aName, nsIAtom *aPrefix, PRInt32 aNamespaceID) + nsNodeInfoInner(nsIAtom *aName, nsIAtom *aPrefix, PRInt32 aNamespaceID, + PRUint16 aNodeType, nsIAtom* aExtraName) : mName(aName), mPrefix(aPrefix), mNamespaceID(aNamespaceID), - mNameString(nsnull) + mNodeType(aNodeType), mNameString(nsnull), mExtraName(aExtraName) { } - nsNodeInfoInner(const nsAString& aTmpName, nsIAtom *aPrefix, PRInt32 aNamespaceID) + nsNodeInfoInner(const nsAString& aTmpName, nsIAtom *aPrefix, + PRInt32 aNamespaceID, PRUint16 aNodeType) : mName(nsnull), mPrefix(aPrefix), mNamespaceID(aNamespaceID), - mNameString(&aTmpName) + mNodeType(aNodeType), mNameString(&aTmpName), mExtraName(nsnull) { } nsIAtom* mName; nsIAtom* mPrefix; PRInt32 mNamespaceID; + PRUint16 mNodeType; // As defined by nsIDOMNode.nodeType const nsAString* mNameString; + nsIAtom* mExtraName; // Only used by PIs and DocTypes }; // nsNodeInfoManager needs to pass mInner to the hash table. @@ -361,6 +370,13 @@ protected: // Qualified name in "corrected case"; this will depend on our // document and on mNamespaceID. nsString mQualifiedNameCorrectedCase; + + // nodeName for the node. + nsString mNodeName; + + // localName for the node. This is either equal to mInner.mName, or a + // void string, depending on mInner.mNodeType. + nsString mLocalName; }; NS_DEFINE_STATIC_IID_ACCESSOR(nsINodeInfo, NS_INODEINFO_IID) diff --git a/content/base/src/nsCommentNode.cpp b/content/base/src/nsCommentNode.cpp index bacd6db301f0..5c60a5973b08 100644 --- a/content/base/src/nsCommentNode.cpp +++ b/content/base/src/nsCommentNode.cpp @@ -106,6 +106,8 @@ NS_NewCommentNode(nsIContent** aInstancePtrResult, nsCommentNode::nsCommentNode(already_AddRefed aNodeInfo) : nsGenericDOMDataNode(aNodeInfo) { + NS_ABORT_IF_FALSE(mNodeInfo->NodeType() == nsIDOMNode::COMMENT_NODE, + "Bad NodeType in aNodeInfo"); } nsCommentNode::~nsCommentNode() diff --git a/content/base/src/nsContentUtils.cpp b/content/base/src/nsContentUtils.cpp index 3b0c8433f764..5f320b75744f 100644 --- a/content/base/src/nsContentUtils.cpp +++ b/content/base/src/nsContentUtils.cpp @@ -2088,6 +2088,7 @@ nsresult nsContentUtils::GetNodeInfoFromQName(const nsAString& aNamespaceURI, const nsAString& aQualifiedName, nsNodeInfoManager* aNodeInfoManager, + PRUint16 aNodeType, nsINodeInfo** aNodeInfo) { nsIParserService* parserService = GetParserService(); @@ -2107,11 +2108,11 @@ nsContentUtils::GetNodeInfoFromQName(const nsAString& aNamespaceURI, nsCOMPtr prefix = do_GetAtom(Substring(qName.get(), colon)); rv = aNodeInfoManager->GetNodeInfo(Substring(colon + 1, end), prefix, - nsID, aNodeInfo); + nsID, aNodeType, aNodeInfo); } else { rv = aNodeInfoManager->GetNodeInfo(aQualifiedName, nsnull, nsID, - aNodeInfo); + aNodeType, aNodeInfo); } NS_ENSURE_SUCCESS(rv, rv); diff --git a/content/base/src/nsDOMAttribute.cpp b/content/base/src/nsDOMAttribute.cpp index 65d914c078eb..62c01d055f55 100644 --- a/content/base/src/nsDOMAttribute.cpp +++ b/content/base/src/nsDOMAttribute.cpp @@ -72,7 +72,8 @@ nsDOMAttribute::nsDOMAttribute(nsDOMAttributeMap *aAttrMap, : nsIAttribute(aAttrMap, aNodeInfo, aNsAware), mValue(aValue), mChild(nsnull) { NS_ABORT_IF_FALSE(mNodeInfo, "We must get a nodeinfo here!"); - + NS_ABORT_IF_FALSE(mNodeInfo->NodeType() == nsIDOMNode::ATTRIBUTE_NODE, + "Wrong nodeType"); // We don't add a reference to our content. It will tell us // to drop our reference when it goes away. @@ -192,7 +193,8 @@ nsDOMAttribute::SetOwnerDocument(nsIDocument* aDocument) nsCOMPtr newNodeInfo; newNodeInfo = aDocument->NodeInfoManager()-> GetNodeInfo(mNodeInfo->NameAtom(), mNodeInfo->GetPrefixAtom(), - mNodeInfo->NamespaceID()); + mNodeInfo->NamespaceID(), + nsIDOMNode::ATTRIBUTE_NODE); NS_ENSURE_TRUE(newNodeInfo, NS_ERROR_OUT_OF_MEMORY); NS_ASSERTION(newNodeInfo, "GetNodeInfo lies"); mNodeInfo.swap(newNodeInfo); diff --git a/content/base/src/nsDOMAttributeMap.cpp b/content/base/src/nsDOMAttributeMap.cpp index 99ea25bb2951..c8c0618de730 100644 --- a/content/base/src/nsDOMAttributeMap.cpp +++ b/content/base/src/nsDOMAttributeMap.cpp @@ -341,7 +341,8 @@ nsDOMAttributeMap::SetNamedItemInternal(nsIDOMNode *aNode, } rv = mContent->NodeInfo()->NodeInfoManager()-> - GetNodeInfo(name, nsnull, kNameSpaceID_None, getter_AddRefs(ni)); + GetNodeInfo(name, nsnull, kNameSpaceID_None, + nsIDOMNode::ATTRIBUTE_NODE, getter_AddRefs(ni)); NS_ENSURE_SUCCESS(rv, rv); // value is already empty } @@ -407,7 +408,8 @@ nsDOMAttributeMap::GetItemAt(PRUint32 aIndex, nsresult *aResult) // have the wrong owner document. nsCOMPtr ni; ni = mContent->NodeInfo()->NodeInfoManager()-> - GetNodeInfo(name->LocalName(), name->GetPrefix(), name->NamespaceID()); + GetNodeInfo(name->LocalName(), name->GetPrefix(), name->NamespaceID(), + nsIDOMNode::ATTRIBUTE_NODE); if (ni) { node = GetAttribute(ni, PR_TRUE); } @@ -484,7 +486,8 @@ nsDOMAttributeMap::GetNamedItemNSInternal(const nsAString& aNamespaceURI, nameAtom->Equals(aLocalName)) { nsCOMPtr ni; ni = mContent->NodeInfo()->NodeInfoManager()-> - GetNodeInfo(nameAtom, name->GetPrefix(), nameSpaceID); + GetNodeInfo(nameAtom, name->GetPrefix(), nameSpaceID, + nsIDOMNode::ATTRIBUTE_NODE); NS_ENSURE_TRUE(ni, NS_ERROR_OUT_OF_MEMORY); if (aRemove) { diff --git a/content/base/src/nsDOMDocumentType.cpp b/content/base/src/nsDOMDocumentType.cpp index 0ef8ed04f833..5a7542318a4e 100644 --- a/content/base/src/nsDOMDocumentType.cpp +++ b/content/base/src/nsDOMDocumentType.cpp @@ -78,12 +78,14 @@ NS_NewDOMDocumentType(nsIDOMDocumentType** aDocType, nimgr->SetDocumentPrincipal(aPrincipal); } - nsCOMPtr ni; - ni = nimgr->GetNodeInfo(nsGkAtoms::documentTypeNodeName, nsnull, - kNameSpaceID_None); + nsCOMPtr ni = + nimgr->GetNodeInfo(nsGkAtoms::documentTypeNodeName, nsnull, + kNameSpaceID_None, + nsIDOMNode::DOCUMENT_TYPE_NODE, + aName); NS_ENSURE_TRUE(ni, NS_ERROR_OUT_OF_MEMORY); - *aDocType = new nsDOMDocumentType(ni.forget(), aName, aPublicId, aSystemId, + *aDocType = new nsDOMDocumentType(ni.forget(), aPublicId, aSystemId, aInternalSubset); NS_ADDREF(*aDocType); @@ -91,16 +93,16 @@ NS_NewDOMDocumentType(nsIDOMDocumentType** aDocType, } nsDOMDocumentType::nsDOMDocumentType(already_AddRefed aNodeInfo, - nsIAtom *aName, const nsAString& aPublicId, const nsAString& aSystemId, const nsAString& aInternalSubset) : nsDOMDocumentTypeForward(aNodeInfo), - mName(aName), mPublicId(aPublicId), mSystemId(aSystemId), mInternalSubset(aInternalSubset) { + NS_ABORT_IF_FALSE(mNodeInfo->NodeType() == nsIDOMNode::DOCUMENT_TYPE_NODE, + "Bad NodeType in aNodeInfo"); } nsDOMDocumentType::~nsDOMDocumentType() @@ -133,7 +135,7 @@ nsDOMDocumentType::IsNodeOfType(PRUint32 aFlags) const void nsDOMDocumentType::NodeName(nsAString& aNodeName) { - mName->ToString(aNodeName); + mNodeInfo->GetExtraName()->ToString(aNodeName); } PRUint16 @@ -151,7 +153,7 @@ nsDOMDocumentType::GetText() NS_IMETHODIMP nsDOMDocumentType::GetName(nsAString& aName) { - mName->ToString(aName); + mNodeInfo->GetExtraName()->ToString(aName); return NS_OK; } @@ -182,7 +184,7 @@ nsGenericDOMDataNode* nsDOMDocumentType::CloneDataNode(nsINodeInfo *aNodeInfo, PRBool aCloneText) const { nsCOMPtr ni = aNodeInfo; - return new nsDOMDocumentType(ni.forget(), mName, mPublicId, mSystemId, + return new nsDOMDocumentType(ni.forget(), mPublicId, mSystemId, mInternalSubset); } @@ -208,7 +210,9 @@ nsDOMDocumentType::BindToTree(nsIDocument *aDocument, nsIContent *aParent, nsCOMPtr newNodeInfo; newNodeInfo = nimgr->GetNodeInfo(mNodeInfo->NameAtom(), mNodeInfo->GetPrefixAtom(), - mNodeInfo->NamespaceID()); + mNodeInfo->NamespaceID(), + nsIDOMNode::DOCUMENT_TYPE_NODE, + mNodeInfo->GetExtraName()); NS_ENSURE_TRUE(newNodeInfo, NS_ERROR_OUT_OF_MEMORY); mNodeInfo.swap(newNodeInfo); diff --git a/content/base/src/nsDOMDocumentType.h b/content/base/src/nsDOMDocumentType.h index 53471cf2d003..cff20fb5eb9b 100644 --- a/content/base/src/nsDOMDocumentType.h +++ b/content/base/src/nsDOMDocumentType.h @@ -70,7 +70,6 @@ class nsDOMDocumentType : public nsDOMDocumentTypeForward { public: nsDOMDocumentType(already_AddRefed aNodeInfo, - nsIAtom *aName, const nsAString& aPublicId, const nsAString& aSystemId, const nsAString& aInternalSubset); @@ -113,7 +112,6 @@ public: virtual nsXPCClassInfo* GetClassInfo(); protected: - nsCOMPtr mName; nsString mPublicId; nsString mSystemId; nsString mInternalSubset; diff --git a/content/base/src/nsDocument.cpp b/content/base/src/nsDocument.cpp index 02e9a109e92a..b63a76de08c1 100644 --- a/content/base/src/nsDocument.cpp +++ b/content/base/src/nsDocument.cpp @@ -1997,6 +1997,8 @@ nsDocument::Init() mNodeInfo = mNodeInfoManager->GetDocumentNodeInfo(); NS_ENSURE_TRUE(mNodeInfo, NS_ERROR_OUT_OF_MEMORY); + NS_ABORT_IF_FALSE(mNodeInfo->NodeType() == nsIDOMNode::DOCUMENT_NODE, + "Bad NodeType in aNodeInfo"); NS_ASSERTION(GetOwnerDoc() == this, "Our nodeinfo is busted!"); @@ -4384,6 +4386,7 @@ nsDocument::CreateElementNS(const nsAString& aNamespaceURI, nsresult rv = nsContentUtils::GetNodeInfoFromQName(aNamespaceURI, aQualifiedName, mNodeInfoManager, + nsIDOMNode::ELEMENT_NODE, getter_AddRefs(nodeInfo)); NS_ENSURE_SUCCESS(rv, rv); @@ -4516,6 +4519,7 @@ nsDocument::CreateAttribute(const nsAString& aName, nsCOMPtr nodeInfo; rv = mNodeInfoManager->GetNodeInfo(aName, nsnull, kNameSpaceID_None, + nsIDOMNode::ATTRIBUTE_NODE, getter_AddRefs(nodeInfo)); NS_ENSURE_SUCCESS(rv, rv); @@ -4537,6 +4541,7 @@ nsDocument::CreateAttributeNS(const nsAString & aNamespaceURI, nsresult rv = nsContentUtils::GetNodeInfoFromQName(aNamespaceURI, aQualifiedName, mNodeInfoManager, + nsIDOMNode::ATTRIBUTE_NODE, getter_AddRefs(nodeInfo)); NS_ENSURE_SUCCESS(rv, rv); @@ -5199,7 +5204,8 @@ nsDocument::SetTitle(const nsAString& aTitle) { nsCOMPtr titleInfo; titleInfo = mNodeInfoManager->GetNodeInfo(nsGkAtoms::title, nsnull, - kNameSpaceID_XHTML); + kNameSpaceID_XHTML, + nsIDOMNode::ELEMENT_NODE); if (!titleInfo) return NS_OK; title = NS_NewHTMLTitleElement(titleInfo.forget()); @@ -6929,6 +6935,7 @@ nsDocument::CreateElem(const nsAString& aName, nsIAtom *aPrefix, PRInt32 aNamesp nsCOMPtr nodeInfo; mNodeInfoManager->GetNodeInfo(aName, aPrefix, aNamespaceID, + nsIDOMNode::ELEMENT_NODE, getter_AddRefs(nodeInfo)); NS_ENSURE_TRUE(nodeInfo, NS_ERROR_OUT_OF_MEMORY); diff --git a/content/base/src/nsDocumentFragment.cpp b/content/base/src/nsDocumentFragment.cpp index 466a201f17a5..21fcda1e4c18 100644 --- a/content/base/src/nsDocumentFragment.cpp +++ b/content/base/src/nsDocumentFragment.cpp @@ -142,7 +142,8 @@ NS_NewDocumentFragment(nsIDOMDocumentFragment** aInstancePtrResult, nsCOMPtr nodeInfo; nodeInfo = aNodeInfoManager->GetNodeInfo(nsGkAtoms::documentFragmentNodeName, - nsnull, kNameSpaceID_None); + nsnull, kNameSpaceID_None, + nsIDOMNode::DOCUMENT_FRAGMENT_NODE); NS_ENSURE_TRUE(nodeInfo, NS_ERROR_OUT_OF_MEMORY); nsDocumentFragment *it = new nsDocumentFragment(nodeInfo.forget()); diff --git a/content/base/src/nsGenericDOMDataNode.cpp b/content/base/src/nsGenericDOMDataNode.cpp index ec446b6686d0..8667e0922085 100644 --- a/content/base/src/nsGenericDOMDataNode.cpp +++ b/content/base/src/nsGenericDOMDataNode.cpp @@ -72,6 +72,13 @@ namespace css = mozilla::css; nsGenericDOMDataNode::nsGenericDOMDataNode(already_AddRefed aNodeInfo) : nsIContent(aNodeInfo) { + NS_ABORT_IF_FALSE(mNodeInfo->NodeType() == nsIDOMNode::TEXT_NODE || + mNodeInfo->NodeType() == nsIDOMNode::CDATA_SECTION_NODE || + mNodeInfo->NodeType() == nsIDOMNode::COMMENT_NODE || + mNodeInfo->NodeType() == + nsIDOMNode::PROCESSING_INSTRUCTION_NODE || + mNodeInfo->NodeType() == nsIDOMNode::DOCUMENT_TYPE_NODE, + "Bad NodeType in aNodeInfo"); } nsGenericDOMDataNode::~nsGenericDOMDataNode() diff --git a/content/base/src/nsGenericElement.cpp b/content/base/src/nsGenericElement.cpp index e521e8368223..7c2320e2ef1a 100644 --- a/content/base/src/nsGenericElement.cpp +++ b/content/base/src/nsGenericElement.cpp @@ -2223,6 +2223,13 @@ nsGenericElement::nsDOMSlots::~nsDOMSlots() nsGenericElement::nsGenericElement(already_AddRefed aNodeInfo) : Element(aNodeInfo) { + NS_ABORT_IF_FALSE(mNodeInfo->NodeType() == nsIDOMNode::ELEMENT_NODE || + (mNodeInfo->NodeType() == + nsIDOMNode::DOCUMENT_FRAGMENT_NODE && + mNodeInfo->Equals(nsGkAtoms::documentFragmentNodeName, + kNameSpaceID_None)), + "Bad NodeType in aNodeInfo"); + // Set the default scriptID to JS - but skip SetScriptTypeID as it // does extra work we know isn't necessary here... SetFlags((nsIProgrammingLanguage::JAVASCRIPT << NODE_SCRIPT_TYPE_OFFSET)); @@ -2579,6 +2586,7 @@ nsGenericElement::SetAttributeNS(const nsAString& aNamespaceURI, nsresult rv = nsContentUtils::GetNodeInfoFromQName(aNamespaceURI, aQualifiedName, mNodeInfo->NodeInfoManager(), + nsIDOMNode::ATTRIBUTE_NODE, getter_AddRefs(ni)); NS_ENSURE_SUCCESS(rv, rv); @@ -3455,8 +3463,9 @@ nsGenericElement::GetExistingAttrNameFromQName(const nsAString& aStr) const nsINodeInfo* nodeInfo; if (name->IsAtom()) { - nodeInfo = mNodeInfo->NodeInfoManager()->GetNodeInfo(name->Atom(), nsnull, - kNameSpaceID_None).get(); + nodeInfo = mNodeInfo->NodeInfoManager()-> + GetNodeInfo(name->Atom(), nsnull, kNameSpaceID_None, + nsIDOMNode::ATTRIBUTE_NODE).get(); } else { NS_ADDREF(nodeInfo = name->NodeInfo()); @@ -4695,7 +4704,8 @@ nsGenericElement::SetAttrAndNotify(PRInt32 aNamespaceID, else { nsCOMPtr ni; ni = mNodeInfo->NodeInfoManager()->GetNodeInfo(aName, aPrefix, - aNamespaceID); + aNamespaceID, + nsIDOMNode::ATTRIBUTE_NODE); NS_ENSURE_TRUE(ni, NS_ERROR_OUT_OF_MEMORY); rv = mAttrsAndChildren.SetAndTakeAttr(ni, aParsedValue); diff --git a/content/base/src/nsGkAtomList.h b/content/base/src/nsGkAtomList.h index 8697ca62c343..a2957ee06962 100644 --- a/content/base/src/nsGkAtomList.h +++ b/content/base/src/nsGkAtomList.h @@ -1089,6 +1089,7 @@ GK_ATOM(headerCSP, "x-content-security-policy") GK_ATOM(headerCSPReportOnly, "x-content-security-policy-report-only") GK_ATOM(headerXFO, "x-frame-options") GK_ATOM(xml, "xml") +GK_ATOM(xml_stylesheet, "xml-stylesheet") GK_ATOM(xmlns, "xmlns") GK_ATOM(xmp, "xmp") GK_ATOM(xulcontentsgenerated, "xulcontentsgenerated") diff --git a/content/base/src/nsNodeInfo.cpp b/content/base/src/nsNodeInfo.cpp index 911363322903..4246c1a8ecd2 100644 --- a/content/base/src/nsNodeInfo.cpp +++ b/content/base/src/nsNodeInfo.cpp @@ -69,6 +69,7 @@ nsFixedSizeAllocator* nsNodeInfo::sNodeInfoPool = nsnull; // static nsNodeInfo* nsNodeInfo::Create(nsIAtom *aName, nsIAtom *aPrefix, PRInt32 aNamespaceID, + PRUint16 aNodeType, nsIAtom *aExtraName, nsNodeInfoManager *aOwnerManager) { if (!sNodeInfoPool) { @@ -88,7 +89,8 @@ nsNodeInfo::Create(nsIAtom *aName, nsIAtom *aPrefix, PRInt32 aNamespaceID, // Create a new one void* place = sNodeInfoPool->Alloc(sizeof(nsNodeInfo)); return place ? - new (place) nsNodeInfo(aName, aPrefix, aNamespaceID, aOwnerManager) : + new (place) nsNodeInfo(aName, aPrefix, aNamespaceID, aNodeType, aExtraName, + aOwnerManager) : nsnull; } @@ -99,34 +101,33 @@ nsNodeInfo::~nsNodeInfo() NS_RELEASE(mInner.mName); NS_IF_RELEASE(mInner.mPrefix); + NS_IF_RELEASE(mInner.mExtraName); } nsNodeInfo::nsNodeInfo(nsIAtom *aName, nsIAtom *aPrefix, PRInt32 aNamespaceID, + PRUint16 aNodeType, nsIAtom* aExtraName, nsNodeInfoManager *aOwnerManager) { - NS_ABORT_IF_FALSE(aName, "Must have a name"); - NS_ABORT_IF_FALSE(aOwnerManager, "Must have an owner manager"); - - mInner.mName = aName; - NS_ADDREF(mInner.mName); - - mInner.mPrefix = aPrefix; - NS_IF_ADDREF(mInner.mPrefix); + CHECK_VALID_NODEINFO(aNodeType, aName, aNamespaceID, aExtraName); + NS_ABORT_IF_FALSE(aOwnerManager, "Invalid aOwnerManager"); + // Initialize mInner + NS_ADDREF(mInner.mName = aName); + NS_IF_ADDREF(mInner.mPrefix = aPrefix); mInner.mNamespaceID = aNamespaceID; - - mOwnerManager = aOwnerManager; - NS_ADDREF(mOwnerManager); + mInner.mNodeType = aNodeType; + NS_ADDREF(mOwnerManager = aOwnerManager); + NS_IF_ADDREF(mInner.mExtraName = aExtraName); // Now compute our cached members. // Qualified name. If we have no prefix, use ToString on // mInner.mName so that we get to share its buffer. if (aPrefix) { - aPrefix->ToString(mQualifiedName); - mQualifiedName.Append(PRUnichar(':')); - mQualifiedName.Append(nsDependentAtomString(mInner.mName)); + mQualifiedName = nsDependentAtomString(mInner.mPrefix) + + NS_LITERAL_STRING(":") + + nsDependentAtomString(mInner.mName); } else { mInner.mName->ToString(mQualifiedName); } @@ -138,6 +139,30 @@ nsNodeInfo::nsNodeInfo(nsIAtom *aName, nsIAtom *aPrefix, PRInt32 aNamespaceID, } else { mQualifiedNameCorrectedCase = mQualifiedName; } + + switch (aNodeType) { + case nsIDOMNode::ELEMENT_NODE: + case nsIDOMNode::ATTRIBUTE_NODE: + mNodeName = mQualifiedNameCorrectedCase; + mInner.mName->ToString(mLocalName); + break; + case nsIDOMNode::TEXT_NODE: + case nsIDOMNode::CDATA_SECTION_NODE: + case nsIDOMNode::COMMENT_NODE: + case nsIDOMNode::DOCUMENT_NODE: + case nsIDOMNode::DOCUMENT_FRAGMENT_NODE: + mInner.mName->ToString(mNodeName); + SetDOMStringToNull(mLocalName); + break; + case nsIDOMNode::PROCESSING_INSTRUCTION_NODE: + case nsIDOMNode::DOCUMENT_TYPE_NODE: + mInner.mExtraName->ToString(mNodeName); + SetDOMStringToNull(mLocalName); + break; + default: + NS_ABORT_IF_FALSE(aNodeType == PR_UINT16_MAX, + "Unknown node type"); + } } diff --git a/content/base/src/nsNodeInfo.h b/content/base/src/nsNodeInfo.h index cee6d8df9914..f9103e105d8a 100644 --- a/content/base/src/nsNodeInfo.h +++ b/content/base/src/nsNodeInfo.h @@ -69,12 +69,14 @@ public: * aName and aOwnerManager may not be null. */ static nsNodeInfo *Create(nsIAtom *aName, nsIAtom *aPrefix, - PRInt32 aNamespaceID, + PRInt32 aNamespaceID, PRUint16 aNodeType, + nsIAtom *aExtraName, nsNodeInfoManager *aOwnerManager); private: nsNodeInfo(); // Unimplemented nsNodeInfo(const nsNodeInfo& aOther); // Unimplemented nsNodeInfo(nsIAtom *aName, nsIAtom *aPrefix, PRInt32 aNamespaceID, + PRUint16 aNodeType, nsIAtom *aExtraName, nsNodeInfoManager *aOwnerManager); protected: virtual ~nsNodeInfo(); @@ -96,4 +98,42 @@ private: void LastRelease(); }; +#define CHECK_VALID_NODEINFO(_nodeType, _name, _namespaceID, _extraName) \ +NS_ABORT_IF_FALSE(_nodeType == nsIDOMNode::ELEMENT_NODE || \ + _nodeType == nsIDOMNode::ATTRIBUTE_NODE || \ + _nodeType == nsIDOMNode::TEXT_NODE || \ + _nodeType == nsIDOMNode::CDATA_SECTION_NODE || \ + _nodeType == nsIDOMNode::PROCESSING_INSTRUCTION_NODE || \ + _nodeType == nsIDOMNode::COMMENT_NODE || \ + _nodeType == nsIDOMNode::DOCUMENT_NODE || \ + _nodeType == nsIDOMNode::DOCUMENT_TYPE_NODE || \ + _nodeType == nsIDOMNode::DOCUMENT_FRAGMENT_NODE || \ + _nodeType == PR_UINT16_MAX, \ + "Invalid nodeType"); \ +NS_ABORT_IF_FALSE((_nodeType == nsIDOMNode::PROCESSING_INSTRUCTION_NODE || \ + _nodeType == nsIDOMNode::DOCUMENT_TYPE_NODE) == \ + (_extraName != nsnull), \ + "Supply aExtraName for and only for PIs and doctypes"); \ +NS_ABORT_IF_FALSE(_nodeType == nsIDOMNode::ELEMENT_NODE || \ + _nodeType == nsIDOMNode::ATTRIBUTE_NODE || \ + _nodeType == PR_UINT16_MAX || \ + aNamespaceID == kNameSpaceID_None, \ + "Only attributes and elements can be in a namespace"); \ +NS_ABORT_IF_FALSE(_name && _name != nsGkAtoms::_empty, "Invalid localName");\ +NS_ABORT_IF_FALSE(((_nodeType == nsIDOMNode::TEXT_NODE) == \ + (_name == nsGkAtoms::textTagName)) && \ + ((_nodeType == nsIDOMNode::CDATA_SECTION_NODE) == \ + (_name == nsGkAtoms::cdataTagName)) && \ + ((_nodeType == nsIDOMNode::COMMENT_NODE) == \ + (_name == nsGkAtoms::commentTagName)) && \ + ((_nodeType == nsIDOMNode::DOCUMENT_NODE) == \ + (_name == nsGkAtoms::documentNodeName)) && \ + ((_nodeType == nsIDOMNode::DOCUMENT_FRAGMENT_NODE) == \ + (_name == nsGkAtoms::documentFragmentNodeName)) && \ + ((_nodeType == nsIDOMNode::DOCUMENT_TYPE_NODE) == \ + (_name == nsGkAtoms::documentTypeNodeName)) && \ + ((_nodeType == nsIDOMNode::PROCESSING_INSTRUCTION_NODE) ==\ + (_name == nsGkAtoms::processingInstructionTagName)), \ + "Wrong localName for nodeType"); + #endif /* nsNodeInfo_h___ */ diff --git a/content/base/src/nsNodeInfoManager.cpp b/content/base/src/nsNodeInfoManager.cpp index 5b701e568868..c57556451454 100644 --- a/content/base/src/nsNodeInfoManager.cpp +++ b/content/base/src/nsNodeInfoManager.cpp @@ -91,7 +91,9 @@ nsNodeInfoManager::NodeInfoInnerKeyCompare(const void *key1, const void *key2) reinterpret_cast(key2); if (node1->mPrefix != node2->mPrefix || - node1->mNamespaceID != node2->mNamespaceID) { + node1->mNamespaceID != node2->mNamespaceID || + node1->mNodeType != node2->mNodeType || + node1->mExtraName != node2->mExtraName) { return 0; } @@ -205,13 +207,13 @@ nsNodeInfoManager::DropDocumentReference() already_AddRefed nsNodeInfoManager::GetNodeInfo(nsIAtom *aName, nsIAtom *aPrefix, - PRInt32 aNamespaceID) + PRInt32 aNamespaceID, PRUint16 aNodeType, + nsIAtom* aExtraName /* = nsnull */) { - NS_ENSURE_TRUE(aName, nsnull); - NS_ASSERTION(!aName->Equals(EmptyString()), - "Don't pass an empty string to GetNodeInfo, fix caller."); + CHECK_VALID_NODEINFO(aNodeType, aName, aNamespaceID, aExtraName); - nsINodeInfo::nsNodeInfoInner tmpKey(aName, aPrefix, aNamespaceID); + nsINodeInfo::nsNodeInfoInner tmpKey(aName, aPrefix, aNamespaceID, aNodeType, + aExtraName); void *node = PL_HashTableLookup(mNodeInfoHash, &tmpKey); @@ -224,7 +226,8 @@ nsNodeInfoManager::GetNodeInfo(nsIAtom *aName, nsIAtom *aPrefix, } nsRefPtr newNodeInfo = - nsNodeInfo::Create(aName, aPrefix, aNamespaceID, this); + nsNodeInfo::Create(aName, aPrefix, aNamespaceID, aNodeType, aExtraName, + this); NS_ENSURE_TRUE(newNodeInfo, nsnull); PLHashEntry *he; @@ -242,12 +245,17 @@ nsNodeInfoManager::GetNodeInfo(nsIAtom *aName, nsIAtom *aPrefix, nsresult nsNodeInfoManager::GetNodeInfo(const nsAString& aName, nsIAtom *aPrefix, - PRInt32 aNamespaceID, nsINodeInfo** aNodeInfo) + PRInt32 aNamespaceID, PRUint16 aNodeType, + nsINodeInfo** aNodeInfo) { - NS_ASSERTION(!aName.IsEmpty(), - "Don't pass an empty string to GetNodeInfo, fix caller."); +#ifdef DEBUG + { + nsCOMPtr nameAtom = do_GetAtom(aName); + CHECK_VALID_NODEINFO(aNodeType, nameAtom, aNamespaceID, nsnull); + } +#endif - nsINodeInfo::nsNodeInfoInner tmpKey(aName, aPrefix, aNamespaceID); + nsINodeInfo::nsNodeInfoInner tmpKey(aName, aPrefix, aNamespaceID, aNodeType); void *node = PL_HashTableLookup(mNodeInfoHash, &tmpKey); @@ -264,7 +272,8 @@ nsNodeInfoManager::GetNodeInfo(const nsAString& aName, nsIAtom *aPrefix, NS_ENSURE_TRUE(nameAtom, NS_ERROR_OUT_OF_MEMORY); nsRefPtr newNodeInfo = - nsNodeInfo::Create(nameAtom, aPrefix, aNamespaceID, this); + nsNodeInfo::Create(nameAtom, aPrefix, aNamespaceID, aNodeType, nsnull, + this); NS_ENSURE_TRUE(newNodeInfo, NS_ERROR_OUT_OF_MEMORY); PLHashEntry *he; @@ -280,11 +289,9 @@ nsNodeInfoManager::GetNodeInfo(const nsAString& aName, nsIAtom *aPrefix, nsresult nsNodeInfoManager::GetNodeInfo(const nsAString& aName, nsIAtom *aPrefix, const nsAString& aNamespaceURI, + PRUint16 aNodeType, nsINodeInfo** aNodeInfo) { - nsCOMPtr nameAtom = do_GetAtom(aName); - NS_ENSURE_TRUE(nameAtom, NS_ERROR_OUT_OF_MEMORY); - PRInt32 nsid = kNameSpaceID_None; if (!aNamespaceURI.IsEmpty()) { @@ -293,15 +300,16 @@ nsNodeInfoManager::GetNodeInfo(const nsAString& aName, nsIAtom *aPrefix, NS_ENSURE_SUCCESS(rv, rv); } - *aNodeInfo = GetNodeInfo(nameAtom, aPrefix, nsid).get(); - return *aNodeInfo ? NS_OK : NS_ERROR_OUT_OF_MEMORY; + return GetNodeInfo(aName, aPrefix, nsid, aNodeType, aNodeInfo); } already_AddRefed nsNodeInfoManager::GetTextNodeInfo() { if (!mTextNodeInfo) { - mTextNodeInfo = GetNodeInfo(nsGkAtoms::textTagName, nsnull, kNameSpaceID_None).get(); + mTextNodeInfo = GetNodeInfo(nsGkAtoms::textTagName, nsnull, + kNameSpaceID_None, + nsIDOMNode::TEXT_NODE, nsnull).get(); } else { NS_ADDREF(mTextNodeInfo); @@ -314,7 +322,9 @@ already_AddRefed nsNodeInfoManager::GetCommentNodeInfo() { if (!mCommentNodeInfo) { - mCommentNodeInfo = GetNodeInfo(nsGkAtoms::commentTagName, nsnull, kNameSpaceID_None).get(); + mCommentNodeInfo = GetNodeInfo(nsGkAtoms::commentTagName, nsnull, + kNameSpaceID_None, + nsIDOMNode::COMMENT_NODE, nsnull).get(); } else { NS_ADDREF(mCommentNodeInfo); @@ -327,7 +337,9 @@ already_AddRefed nsNodeInfoManager::GetDocumentNodeInfo() { if (!mDocumentNodeInfo) { - mDocumentNodeInfo = GetNodeInfo(nsGkAtoms::documentNodeName, nsnull, kNameSpaceID_None).get(); + mDocumentNodeInfo = GetNodeInfo(nsGkAtoms::documentNodeName, nsnull, + kNameSpaceID_None, + nsIDOMNode::DOCUMENT_NODE, nsnull).get(); } else { NS_ADDREF(mDocumentNodeInfo); diff --git a/content/base/src/nsNodeInfoManager.h b/content/base/src/nsNodeInfoManager.h index 2d7d8ca5211f..02a23d8dc57f 100644 --- a/content/base/src/nsNodeInfoManager.h +++ b/content/base/src/nsNodeInfoManager.h @@ -85,11 +85,14 @@ public: * Methods for creating nodeinfo's from atoms and/or strings. */ already_AddRefed GetNodeInfo(nsIAtom *aName, nsIAtom *aPrefix, - PRInt32 aNamespaceID); + PRInt32 aNamespaceID, + PRUint16 aNodeType, + nsIAtom* aExtraName = nsnull); nsresult GetNodeInfo(const nsAString& aName, nsIAtom *aPrefix, - PRInt32 aNamespaceID, nsINodeInfo** aNodeInfo); + PRInt32 aNamespaceID, PRUint16 aNodeType, + nsINodeInfo** aNodeInfo); nsresult GetNodeInfo(const nsAString& aName, nsIAtom *aPrefix, - const nsAString& aNamespaceURI, + const nsAString& aNamespaceURI, PRUint16 aNodeType, nsINodeInfo** aNodeInfo); /** diff --git a/content/base/src/nsNodeUtils.cpp b/content/base/src/nsNodeUtils.cpp index aaba6a7d229d..965e004e3c8b 100644 --- a/content/base/src/nsNodeUtils.cpp +++ b/content/base/src/nsNodeUtils.cpp @@ -502,7 +502,9 @@ nsNodeUtils::CloneAndAdopt(nsINode *aNode, PRBool aClone, PRBool aDeep, newNodeInfo = nodeInfoManager->GetNodeInfo(nodeInfo->NameAtom(), nodeInfo->GetPrefixAtom(), - nodeInfo->NamespaceID()); + nodeInfo->NamespaceID(), + nodeInfo->NodeType(), + nodeInfo->GetExtraName()); NS_ENSURE_TRUE(newNodeInfo, NS_ERROR_OUT_OF_MEMORY); nodeInfo = newNodeInfo; diff --git a/content/base/src/nsTextNode.cpp b/content/base/src/nsTextNode.cpp index 8b63b6bde027..0d5d22567238 100644 --- a/content/base/src/nsTextNode.cpp +++ b/content/base/src/nsTextNode.cpp @@ -143,6 +143,8 @@ NS_NewTextNode(nsIContent** aInstancePtrResult, nsTextNode::nsTextNode(already_AddRefed aNodeInfo) : nsGenericDOMDataNode(aNodeInfo) { + NS_ABORT_IF_FALSE(mNodeInfo->NodeType() == nsIDOMNode::TEXT_NODE, + "Bad NodeType in aNodeInfo"); } nsTextNode::~nsTextNode() diff --git a/content/html/content/src/nsHTMLAudioElement.cpp b/content/html/content/src/nsHTMLAudioElement.cpp index 470e715234d1..78b0104da0fc 100644 --- a/content/html/content/src/nsHTMLAudioElement.cpp +++ b/content/html/content/src/nsHTMLAudioElement.cpp @@ -84,7 +84,8 @@ NS_NewHTMLAudioElement(already_AddRefed aNodeInfo, NS_ENSURE_TRUE(doc, nsnull); nodeInfo = doc->NodeInfoManager()->GetNodeInfo(nsGkAtoms::audio, nsnull, - kNameSpaceID_XHTML); + kNameSpaceID_XHTML, + nsIDOMNode::ELEMENT_NODE); NS_ENSURE_TRUE(nodeInfo, nsnull); } diff --git a/content/html/content/src/nsHTMLImageElement.cpp b/content/html/content/src/nsHTMLImageElement.cpp index be7925be1acc..5b1dacd1463c 100644 --- a/content/html/content/src/nsHTMLImageElement.cpp +++ b/content/html/content/src/nsHTMLImageElement.cpp @@ -170,7 +170,8 @@ NS_NewHTMLImageElement(already_AddRefed aNodeInfo, NS_ENSURE_TRUE(doc, nsnull); nodeInfo = doc->NodeInfoManager()->GetNodeInfo(nsGkAtoms::img, nsnull, - kNameSpaceID_XHTML); + kNameSpaceID_XHTML, + nsIDOMNode::ELEMENT_NODE); NS_ENSURE_TRUE(nodeInfo, nsnull); } diff --git a/content/html/content/src/nsHTMLOptionElement.cpp b/content/html/content/src/nsHTMLOptionElement.cpp index c3aa360dde70..261d294ab9c9 100644 --- a/content/html/content/src/nsHTMLOptionElement.cpp +++ b/content/html/content/src/nsHTMLOptionElement.cpp @@ -107,7 +107,8 @@ NS_NewHTMLOptionElement(already_AddRefed aNodeInfo, NS_ENSURE_TRUE(doc, nsnull); nodeInfo = doc->NodeInfoManager()->GetNodeInfo(nsGkAtoms::option, nsnull, - kNameSpaceID_XHTML); + kNameSpaceID_XHTML, + nsIDOMNode::ELEMENT_NODE); NS_ENSURE_TRUE(nodeInfo, nsnull); } diff --git a/content/html/content/src/nsTextEditorState.cpp b/content/html/content/src/nsTextEditorState.cpp index aa282933fc9b..275902008898 100644 --- a/content/html/content/src/nsTextEditorState.cpp +++ b/content/html/content/src/nsTextEditorState.cpp @@ -1562,7 +1562,8 @@ nsTextEditorState::CreateRootNode() // Now create a DIV and add it to the anonymous content child list. nsCOMPtr nodeInfo; nodeInfo = doc->NodeInfoManager()->GetNodeInfo(nsGkAtoms::div, nsnull, - kNameSpaceID_XHTML); + kNameSpaceID_XHTML, + nsIDOMNode::ELEMENT_NODE); NS_ENSURE_TRUE(nodeInfo, NS_ERROR_OUT_OF_MEMORY); nsresult rv = NS_NewHTMLElement(getter_AddRefs(mRootNode), nodeInfo.forget(), @@ -1639,7 +1640,8 @@ be called if @placeholder is the empty string when trimmed from line breaks"); // and add it to the anonymous content child list nsCOMPtr nodeInfo; nodeInfo = pNodeInfoManager->GetNodeInfo(nsGkAtoms::div, nsnull, - kNameSpaceID_XHTML); + kNameSpaceID_XHTML, + nsIDOMNode::ELEMENT_NODE); NS_ENSURE_TRUE(nodeInfo, NS_ERROR_OUT_OF_MEMORY); rv = NS_NewHTMLElement(getter_AddRefs(mPlaceholderDiv), nodeInfo.forget(), diff --git a/content/html/document/src/ImageDocument.cpp b/content/html/document/src/ImageDocument.cpp index a98244448ed8..e75f24207db2 100644 --- a/content/html/document/src/ImageDocument.cpp +++ b/content/html/document/src/ImageDocument.cpp @@ -651,7 +651,8 @@ ImageDocument::CreateSyntheticDocument() nsCOMPtr nodeInfo; nodeInfo = mNodeInfoManager->GetNodeInfo(nsGkAtoms::img, nsnull, - kNameSpaceID_XHTML); + kNameSpaceID_XHTML, + nsIDOMNode::ELEMENT_NODE); NS_ENSURE_TRUE(nodeInfo, NS_ERROR_OUT_OF_MEMORY); mImageContent = NS_NewHTMLImageElement(nodeInfo.forget()); diff --git a/content/html/document/src/MediaDocument.cpp b/content/html/document/src/MediaDocument.cpp index c99db0b4eeeb..3e32f539bcc8 100644 --- a/content/html/document/src/MediaDocument.cpp +++ b/content/html/document/src/MediaDocument.cpp @@ -237,7 +237,8 @@ MediaDocument::CreateSyntheticDocument() nsCOMPtr nodeInfo; nodeInfo = mNodeInfoManager->GetNodeInfo(nsGkAtoms::html, nsnull, - kNameSpaceID_XHTML); + kNameSpaceID_XHTML, + nsIDOMNode::ELEMENT_NODE); NS_ENSURE_TRUE(nodeInfo, NS_ERROR_OUT_OF_MEMORY); nsRefPtr root = NS_NewHTMLHtmlElement(nodeInfo.forget()); @@ -250,7 +251,8 @@ MediaDocument::CreateSyntheticDocument() NS_ENSURE_SUCCESS(rv, rv); nodeInfo = mNodeInfoManager->GetNodeInfo(nsGkAtoms::head, nsnull, - kNameSpaceID_XHTML); + kNameSpaceID_XHTML, + nsIDOMNode::ELEMENT_NODE); NS_ENSURE_TRUE(nodeInfo, NS_ERROR_OUT_OF_MEMORY); // Create a so our title has somewhere to live @@ -262,7 +264,8 @@ MediaDocument::CreateSyntheticDocument() root->AppendChildTo(head, PR_FALSE); nodeInfo = mNodeInfoManager->GetNodeInfo(nsGkAtoms::body, nsnull, - kNameSpaceID_XHTML); + kNameSpaceID_XHTML, + nsIDOMNode::ELEMENT_NODE); NS_ENSURE_TRUE(nodeInfo, NS_ERROR_OUT_OF_MEMORY); nsRefPtr body = NS_NewHTMLBodyElement(nodeInfo.forget()); diff --git a/content/html/document/src/PluginDocument.cpp b/content/html/document/src/PluginDocument.cpp index 09e8e9192add..1e26d39f4c84 100644 --- a/content/html/document/src/PluginDocument.cpp +++ b/content/html/document/src/PluginDocument.cpp @@ -298,7 +298,8 @@ PluginDocument::CreateSyntheticPluginDocument() // make plugin content nsCOMPtr nodeInfo; nodeInfo = mNodeInfoManager->GetNodeInfo(nsGkAtoms::embed, nsnull, - kNameSpaceID_XHTML); + kNameSpaceID_XHTML, + nsIDOMNode::ELEMENT_NODE); NS_ENSURE_TRUE(nodeInfo, NS_ERROR_OUT_OF_MEMORY); rv = NS_NewHTMLElement(getter_AddRefs(mPluginContent), nodeInfo.forget(), NOT_FROM_PARSER); diff --git a/content/html/document/src/VideoDocument.cpp b/content/html/document/src/VideoDocument.cpp index 0550d1bba490..22c96424b0a3 100644 --- a/content/html/document/src/VideoDocument.cpp +++ b/content/html/document/src/VideoDocument.cpp @@ -112,7 +112,8 @@ VideoDocument::CreateSyntheticVideoDocument(nsIChannel* aChannel, // make content nsCOMPtr nodeInfo; nodeInfo = mNodeInfoManager->GetNodeInfo(nsGkAtoms::video, nsnull, - kNameSpaceID_XHTML); + kNameSpaceID_XHTML, + nsIDOMNode::ELEMENT_NODE); NS_ENSURE_TRUE(nodeInfo, NS_ERROR_FAILURE); nsRefPtr element = diff --git a/content/html/document/src/nsHTMLContentSink.cpp b/content/html/document/src/nsHTMLContentSink.cpp index b01ed8b00676..3c7a695e34df 100644 --- a/content/html/document/src/nsHTMLContentSink.cpp +++ b/content/html/document/src/nsHTMLContentSink.cpp @@ -534,7 +534,8 @@ HTMLContentSink::CreateContentObject(const nsIParserNode& aNode, nsAutoString lower; nsContentUtils::ASCIIToLower(aNode.GetText(), lower); nsCOMPtr name = do_GetAtom(lower); - nodeInfo = mNodeInfoManager->GetNodeInfo(name, nsnull, kNameSpaceID_XHTML); + nodeInfo = mNodeInfoManager->GetNodeInfo(name, nsnull, kNameSpaceID_XHTML, + nsIDOMNode::ELEMENT_NODE); } else if (mNodeInfoCache[aNodeType]) { nodeInfo = mNodeInfoCache[aNodeType]; @@ -547,7 +548,8 @@ HTMLContentSink::CreateContentObject(const nsIParserNode& aNode, nsIAtom *name = parserService->HTMLIdToAtomTag(aNodeType); NS_ASSERTION(name, "What? Reverse mapping of id to string broken!!!"); - nodeInfo = mNodeInfoManager->GetNodeInfo(name, nsnull, kNameSpaceID_XHTML); + nodeInfo = mNodeInfoManager->GetNodeInfo(name, nsnull, kNameSpaceID_XHTML, + nsIDOMNode::ELEMENT_NODE); NS_IF_ADDREF(mNodeInfoCache[aNodeType] = nodeInfo); } @@ -1602,7 +1604,8 @@ HTMLContentSink::Init(nsIDocument* aDoc, nsCOMPtr nodeInfo; nodeInfo = mNodeInfoManager->GetNodeInfo(nsGkAtoms::html, nsnull, - kNameSpaceID_XHTML); + kNameSpaceID_XHTML, + nsIDOMNode::ELEMENT_NODE); NS_ENSURE_TRUE(nodeInfo, NS_ERROR_OUT_OF_MEMORY); // Make root part @@ -1618,7 +1621,8 @@ HTMLContentSink::Init(nsIDocument* aDoc, // Make head part nodeInfo = mNodeInfoManager->GetNodeInfo(nsGkAtoms::head, - nsnull, kNameSpaceID_XHTML); + nsnull, kNameSpaceID_XHTML, + nsIDOMNode::ELEMENT_NODE); NS_ENSURE_TRUE(nodeInfo, NS_ERROR_OUT_OF_MEMORY); mHead = NS_NewHTMLHeadElement(nodeInfo.forget()); @@ -2595,7 +2599,9 @@ HTMLContentSink::ProcessLINKTag(const nsIParserNode& aNode) // Create content object nsCOMPtr element; nsCOMPtr nodeInfo; - nodeInfo = mNodeInfoManager->GetNodeInfo(nsGkAtoms::link, nsnull, kNameSpaceID_XHTML); + nodeInfo = mNodeInfoManager->GetNodeInfo(nsGkAtoms::link, nsnull, + kNameSpaceID_XHTML, + nsIDOMNode::ELEMENT_NODE); result = NS_NewHTMLElement(getter_AddRefs(element), nodeInfo.forget(), NOT_FROM_PARSER); diff --git a/content/html/document/src/nsHTMLFragmentContentSink.cpp b/content/html/document/src/nsHTMLFragmentContentSink.cpp index 235e3d4d1ee3..eccfb779323c 100644 --- a/content/html/document/src/nsHTMLFragmentContentSink.cpp +++ b/content/html/document/src/nsHTMLFragmentContentSink.cpp @@ -367,7 +367,8 @@ nsHTMLFragmentContentSink::OpenContainer(const nsIParserNode& aNode) nsCOMPtr name = do_GetAtom(lower); nodeInfo = mNodeInfoManager->GetNodeInfo(name, nsnull, - kNameSpaceID_XHTML); + kNameSpaceID_XHTML, + nsIDOMNode::ELEMENT_NODE); NS_ENSURE_TRUE(nodeInfo, NS_ERROR_OUT_OF_MEMORY); } else if (mNodeInfoCache[nodeType]) { @@ -383,7 +384,8 @@ nsHTMLFragmentContentSink::OpenContainer(const nsIParserNode& aNode) nodeInfo = mNodeInfoManager->GetNodeInfo(name, nsnull, - kNameSpaceID_XHTML); + kNameSpaceID_XHTML, + nsIDOMNode::ELEMENT_NODE); NS_ENSURE_TRUE(nodeInfo, NS_ERROR_OUT_OF_MEMORY); NS_ADDREF(mNodeInfoCache[nodeType] = nodeInfo); @@ -461,7 +463,8 @@ nsHTMLFragmentContentSink::AddLeaf(const nsIParserNode& aNode) nsContentUtils::ASCIIToLower(aNode.GetText(), lower); nsCOMPtr name = do_GetAtom(lower); nodeInfo = mNodeInfoManager->GetNodeInfo(name, nsnull, - kNameSpaceID_XHTML); + kNameSpaceID_XHTML, + nsIDOMNode::ELEMENT_NODE); NS_ENSURE_TRUE(nodeInfo, NS_ERROR_OUT_OF_MEMORY); } else if (mNodeInfoCache[nodeType]) { @@ -472,7 +475,8 @@ nsHTMLFragmentContentSink::AddLeaf(const nsIParserNode& aNode) NS_ASSERTION(name, "This should not happen!"); nodeInfo = mNodeInfoManager->GetNodeInfo(name, nsnull, - kNameSpaceID_XHTML); + kNameSpaceID_XHTML, + nsIDOMNode::ELEMENT_NODE); NS_ENSURE_TRUE(nodeInfo, NS_ERROR_OUT_OF_MEMORY); NS_ADDREF(mNodeInfoCache[nodeType] = nodeInfo); } @@ -944,13 +948,7 @@ nsHTMLParanoidFragmentSink::NameFromNode(const nsIParserNode& aNode, *aResult = nsnull; if (type == eHTMLTag_userdefined) { - nsCOMPtr nodeInfo; - rv = - mNodeInfoManager->GetNodeInfo(aNode.GetText(), nsnull, - kNameSpaceID_XHTML, - getter_AddRefs(nodeInfo)); - NS_ENSURE_SUCCESS(rv, rv); - NS_IF_ADDREF(*aResult = nodeInfo->NameAtom()); + *aResult = NS_NewAtom(aNode.GetText()); } else { rv = NameFromType(type, aResult); } diff --git a/content/svg/content/src/nsSVGElement.cpp b/content/svg/content/src/nsSVGElement.cpp index e885ef81906c..79696aab3239 100644 --- a/content/svg/content/src/nsSVGElement.cpp +++ b/content/svg/content/src/nsSVGElement.cpp @@ -1364,7 +1364,8 @@ nsSVGElement::AddMappedSVGValue(nsIAtom* aName, nsISupports* aValue, else { nsCOMPtr ni; ni = mNodeInfo->NodeInfoManager()->GetNodeInfo(aName, nsnull, - aNamespaceID); + aNamespaceID, + nsIDOMNode::ATTRIBUTE_NODE); NS_ENSURE_TRUE(ni, NS_ERROR_OUT_OF_MEMORY); rv = mMappedAttributes.SetAndTakeAttr(ni, attrVal); diff --git a/content/svg/content/src/nsSVGUseElement.cpp b/content/svg/content/src/nsSVGUseElement.cpp index 90602756b994..68b97539cb46 100644 --- a/content/svg/content/src/nsSVGUseElement.cpp +++ b/content/svg/content/src/nsSVGUseElement.cpp @@ -339,7 +339,9 @@ nsSVGUseElement::CreateAnonymousContent() return nsnull; nsCOMPtr nodeInfo; - nodeInfo = nodeInfoManager->GetNodeInfo(nsGkAtoms::svg, nsnull, kNameSpaceID_SVG); + nodeInfo = nodeInfoManager->GetNodeInfo(nsGkAtoms::svg, nsnull, + kNameSpaceID_SVG, + nsIDOMNode::ELEMENT_NODE); if (!nodeInfo) return nsnull; diff --git a/content/xbl/src/nsXBLContentSink.cpp b/content/xbl/src/nsXBLContentSink.cpp index 16d2a44a0174..e5fc73697bd2 100644 --- a/content/xbl/src/nsXBLContentSink.cpp +++ b/content/xbl/src/nsXBLContentSink.cpp @@ -954,7 +954,8 @@ nsXBLContentSink::AddAttributesToXULPrototype(const PRUnichar **aAtts, } else { nsCOMPtr ni; - ni = mNodeInfoManager->GetNodeInfo(localName, prefix, nameSpaceID); + ni = mNodeInfoManager->GetNodeInfo(localName, prefix, nameSpaceID, + nsIDOMNode::ATTRIBUTE_NODE); attrs[i].mName.SetTo(ni); } diff --git a/content/xml/content/src/nsXMLCDATASection.cpp b/content/xml/content/src/nsXMLCDATASection.cpp index 98075e171e92..c1f320d3358c 100644 --- a/content/xml/content/src/nsXMLCDATASection.cpp +++ b/content/xml/content/src/nsXMLCDATASection.cpp @@ -89,7 +89,8 @@ NS_NewXMLCDATASection(nsIContent** aInstancePtrResult, nsCOMPtr ni; ni = aNodeInfoManager->GetNodeInfo(nsGkAtoms::cdataTagName, - nsnull, kNameSpaceID_None); + nsnull, kNameSpaceID_None, + nsIDOMNode::CDATA_SECTION_NODE); NS_ENSURE_TRUE(ni, NS_ERROR_OUT_OF_MEMORY); nsXMLCDATASection *instance = new nsXMLCDATASection(ni.forget()); @@ -105,6 +106,8 @@ NS_NewXMLCDATASection(nsIContent** aInstancePtrResult, nsXMLCDATASection::nsXMLCDATASection(already_AddRefed aNodeInfo) : nsGenericDOMDataNode(aNodeInfo) { + NS_ABORT_IF_FALSE(mNodeInfo->NodeType() == nsIDOMNode::CDATA_SECTION_NODE, + "Bad NodeType in aNodeInfo"); } nsXMLCDATASection::~nsXMLCDATASection() diff --git a/content/xml/content/src/nsXMLProcessingInstruction.cpp b/content/xml/content/src/nsXMLProcessingInstruction.cpp index 515f77e12bf2..1155794ff967 100644 --- a/content/xml/content/src/nsXMLProcessingInstruction.cpp +++ b/content/xml/content/src/nsXMLProcessingInstruction.cpp @@ -50,7 +50,10 @@ NS_NewXMLProcessingInstruction(nsIContent** aInstancePtrResult, { NS_PRECONDITION(aNodeInfoManager, "Missing nodeinfo manager"); - if (aTarget.EqualsLiteral("xml-stylesheet")) { + nsCOMPtr target = do_GetAtom(aTarget); + NS_ENSURE_TRUE(target, NS_ERROR_OUT_OF_MEMORY); + + if (target == nsGkAtoms::xml_stylesheet) { return NS_NewXMLStylesheetProcessingInstruction(aInstancePtrResult, aNodeInfoManager, aData); } @@ -59,11 +62,13 @@ NS_NewXMLProcessingInstruction(nsIContent** aInstancePtrResult, nsCOMPtr ni; ni = aNodeInfoManager->GetNodeInfo(nsGkAtoms::processingInstructionTagName, - nsnull, kNameSpaceID_None); + nsnull, kNameSpaceID_None, + nsIDOMNode::PROCESSING_INSTRUCTION_NODE, + target); NS_ENSURE_TRUE(ni, NS_ERROR_OUT_OF_MEMORY); nsXMLProcessingInstruction *instance = - new nsXMLProcessingInstruction(ni.forget(), aTarget, aData); + new nsXMLProcessingInstruction(ni.forget(), aData); if (!instance) { return NS_ERROR_OUT_OF_MEMORY; } @@ -74,11 +79,13 @@ NS_NewXMLProcessingInstruction(nsIContent** aInstancePtrResult, } nsXMLProcessingInstruction::nsXMLProcessingInstruction(already_AddRefed aNodeInfo, - const nsAString& aTarget, const nsAString& aData) - : nsGenericDOMDataNode(aNodeInfo), - mTarget(aTarget) + : nsGenericDOMDataNode(aNodeInfo) { + NS_ABORT_IF_FALSE(mNodeInfo->NodeType() == + nsIDOMNode::PROCESSING_INSTRUCTION_NODE, + "Bad NodeType in aNodeInfo"); + SetTextInternal(0, mText.GetLength(), aData.BeginReading(), aData.Length(), PR_FALSE); // Don't notify (bug 420429). @@ -110,7 +117,7 @@ NS_IMPL_RELEASE_INHERITED(nsXMLProcessingInstruction, nsGenericDOMDataNode) NS_IMETHODIMP nsXMLProcessingInstruction::GetTarget(nsAString& aTarget) { - aTarget.Assign(mTarget); + NodeInfo()->GetExtraName()->ToString(aTarget); return NS_OK; } @@ -151,7 +158,7 @@ nsXMLProcessingInstruction::NodeType() void nsXMLProcessingInstruction::NodeName(nsAString& aNodeName) { - aNodeName.Assign(mTarget); + NodeInfo()->GetExtraName()->ToString(aNodeName); } nsGenericDOMDataNode* @@ -161,7 +168,7 @@ nsXMLProcessingInstruction::CloneDataNode(nsINodeInfo *aNodeInfo, nsAutoString data; nsGenericDOMDataNode::GetData(data); nsCOMPtr ni = aNodeInfo; - return new nsXMLProcessingInstruction(ni.forget(), mTarget, data); + return new nsXMLProcessingInstruction(ni.forget(), data); } #ifdef DEBUG @@ -175,7 +182,7 @@ nsXMLProcessingInstruction::List(FILE* out, PRInt32 aIndent) const nsAutoString tmp; ToCString(tmp, 0, mText.GetLength()); - tmp.Insert(mTarget.get(), 0); + tmp.Insert(nsDependentAtomString(NodeInfo()->GetExtraName()).get(), 0); fputs(NS_LossyConvertUTF16toASCII(tmp).get(), out); fputs(">\n", out); diff --git a/content/xml/content/src/nsXMLProcessingInstruction.h b/content/xml/content/src/nsXMLProcessingInstruction.h index 7e8acc3dda4f..429e3c1213cc 100644 --- a/content/xml/content/src/nsXMLProcessingInstruction.h +++ b/content/xml/content/src/nsXMLProcessingInstruction.h @@ -50,7 +50,6 @@ class nsXMLProcessingInstruction : public nsGenericDOMDataNode, { public: nsXMLProcessingInstruction(already_AddRefed aNodeInfo, - const nsAString& aTarget, const nsAString& aData); virtual ~nsXMLProcessingInstruction(); @@ -89,8 +88,6 @@ protected: * aAttribute. Empty if the attribute isn't present. */ PRBool GetAttrValue(nsIAtom *aName, nsAString& aValue); - - nsString mTarget; }; #endif //nsIXMLProcessingInstruction_h___ diff --git a/content/xml/content/src/nsXMLStylesheetPI.cpp b/content/xml/content/src/nsXMLStylesheetPI.cpp index 2f3524371c66..96e9e5c0e906 100644 --- a/content/xml/content/src/nsXMLStylesheetPI.cpp +++ b/content/xml/content/src/nsXMLStylesheetPI.cpp @@ -105,8 +105,7 @@ NS_IMPL_RELEASE_INHERITED(nsXMLStylesheetPI, nsXMLProcessingInstruction) nsXMLStylesheetPI::nsXMLStylesheetPI(already_AddRefed aNodeInfo, const nsAString& aData) - : nsXMLProcessingInstruction(aNodeInfo, NS_LITERAL_STRING("xml-stylesheet"), - aData) + : nsXMLProcessingInstruction(aNodeInfo, aData) { } @@ -266,7 +265,9 @@ NS_NewXMLStylesheetProcessingInstruction(nsIContent** aInstancePtrResult, nsCOMPtr ni; ni = aNodeInfoManager->GetNodeInfo(nsGkAtoms::processingInstructionTagName, - nsnull, kNameSpaceID_None); + nsnull, kNameSpaceID_None, + nsIDOMNode::PROCESSING_INSTRUCTION_NODE, + nsGkAtoms::xml_stylesheet); NS_ENSURE_TRUE(ni, NS_ERROR_OUT_OF_MEMORY); nsXMLStylesheetPI *instance = new nsXMLStylesheetPI(ni.forget(), aData); diff --git a/content/xml/document/src/nsXMLContentSink.cpp b/content/xml/document/src/nsXMLContentSink.cpp index 71c0e08205d8..a2c1c88daaf9 100644 --- a/content/xml/document/src/nsXMLContentSink.cpp +++ b/content/xml/document/src/nsXMLContentSink.cpp @@ -1012,7 +1012,8 @@ nsXMLContentSink::HandleStartElement(const PRUnichar *aName, } nsCOMPtr nodeInfo; - nodeInfo = mNodeInfoManager->GetNodeInfo(localName, prefix, nameSpaceID); + nodeInfo = mNodeInfoManager->GetNodeInfo(localName, prefix, nameSpaceID, + nsIDOMNode::ELEMENT_NODE); NS_ENSURE_TRUE(nodeInfo, NS_ERROR_OUT_OF_MEMORY); result = CreateElement(aAtts, aAttsCount, nodeInfo, aLineNumber, diff --git a/content/xml/document/src/nsXMLFragmentContentSink.cpp b/content/xml/document/src/nsXMLFragmentContentSink.cpp index fc27165c8a2b..715896458ac1 100644 --- a/content/xml/document/src/nsXMLFragmentContentSink.cpp +++ b/content/xml/document/src/nsXMLFragmentContentSink.cpp @@ -641,7 +641,6 @@ nsXHTMLParanoidFragmentSink::AddAttributes(const PRUnichar** aAtts, nsTArray allowedAttrs; PRInt32 nameSpaceID; nsCOMPtr prefix, localName; - nsCOMPtr nodeInfo; if (!mNullPrincipal) { mNullPrincipal = do_CreateInstance(NS_NULLPRINCIPAL_CONTRACTID, &rv); @@ -651,10 +650,8 @@ nsXHTMLParanoidFragmentSink::AddAttributes(const PRUnichar** aAtts, while (*aAtts) { nsContentUtils::SplitExpatName(aAtts[0], getter_AddRefs(prefix), getter_AddRefs(localName), &nameSpaceID); - nodeInfo = mNodeInfoManager->GetNodeInfo(localName, prefix, nameSpaceID); - NS_ENSURE_TRUE(nodeInfo, NS_ERROR_OUT_OF_MEMORY); // check the attributes we allow that contain URIs - if (IsAttrURI(nodeInfo->NameAtom())) { + if (IsAttrURI(localName)) { if (!aAtts[1]) rv = NS_ERROR_FAILURE; if (!baseURI) @@ -696,21 +693,16 @@ nsXHTMLParanoidFragmentSink::HandleStartElement(const PRUnichar *aName, if (nameSpaceID != kNameSpaceID_XHTML) return NS_OK; - nsCOMPtr nodeInfo; - nodeInfo = mNodeInfoManager->GetNodeInfo(localName, prefix, nameSpaceID); - NS_ENSURE_TRUE(nodeInfo, NS_ERROR_OUT_OF_MEMORY); - // bounce it if it's not on the whitelist or we're inside //