From 7ef736ea62502505b24e2c47020209a93e5159af Mon Sep 17 00:00:00 2001 From: Alberto Massari <amassari@apache.org> Date: Fri, 4 Sep 2009 14:40:20 +0000 Subject: [PATCH] When releasing an element, remove and release also its attributes (XERCESC-646) git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@811428 13f79535-47bb-0310-9956-ffa450edef68 --- src/xercesc/dom/impl/DOMElementImpl.cpp | 10 +++++++++ tests/src/DOM/DOMTest/DTest.cpp | 27 +++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/src/xercesc/dom/impl/DOMElementImpl.cpp b/src/xercesc/dom/impl/DOMElementImpl.cpp index 2d9894c1a..715cc6487 100644 --- a/src/xercesc/dom/impl/DOMElementImpl.cpp +++ b/src/xercesc/dom/impl/DOMElementImpl.cpp @@ -477,7 +477,17 @@ void DOMElementImpl::release() DOMDocumentImpl* doc = (DOMDocumentImpl*) fParent.fOwnerDocument; if (doc) { fNode.callUserDataHandlers(DOMUserDataHandler::NODE_DELETED, 0, 0); + // release children fParent.release(); + // release attributes + fAttributes->hasDefaults(false); + XMLSize_t count; + while((count = fAttributes->getLength()) != 0) + { + DOMNode* attr = fAttributes->removeNamedItemAt(count-1); + attr->release(); + } + doc->release(this, DOMMemoryManager::ELEMENT_OBJECT); } else { diff --git a/tests/src/DOM/DOMTest/DTest.cpp b/tests/src/DOM/DOMTest/DTest.cpp index c99aa1204..85ab26edb 100644 --- a/tests/src/DOM/DOMTest/DTest.cpp +++ b/tests/src/DOM/DOMTest/DTest.cpp @@ -916,6 +916,33 @@ int main(int /*argc*/, char ** /*argv*/) DOMTest::testDocumentFragmentNode = 0; DOMTest::testNotationNode = 0; + // test release of attributes + DOMElement* elt = d->createElement(tempStr3); + elt->setAttribute(tempStr3, tempStr3); + elt->release(); + + elt = d->createElement(tempStr3); + DOMAttr *attr = d->createAttribute(tempStr3); + attr->setValue(tempStr3); + elt->setAttributeNode(attr); + elt->setIdAttributeNode(attr, true); + + DOMElement *eleTest = d->getElementById(tempStr3); + if(eleTest==NULL) + { + fprintf(stderr, "getElementById test failed at line %i\n", __LINE__); + OK = false; + } + + //all good until here + elt->release(); + eleTest = d->getElementById(tempStr3); + if(eleTest!=NULL) + { + fprintf(stderr, "getElementById test failed at line %i\n", __LINE__); + OK = false; + } + // we couldn't really test the user data handler call as the userhandler is already // deleted when the release() is done, but still set it to test the code internally d->setUserData(tempStr, (void*) tempStr, &userhandler); -- GitLab