Author: amassari
Date: Fri Sep  4 14:40:20 2009
New Revision: 811428

URL: http://svn.apache.org/viewvc?rev=811428&view=rev
Log:
When releasing an element, remove and release also its attributes (XERCESC-646)

Modified:
    xerces/c/trunk/src/xercesc/dom/impl/DOMElementImpl.cpp
    xerces/c/trunk/tests/src/DOM/DOMTest/DTest.cpp

Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMElementImpl.cpp
URL: 
http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMElementImpl.cpp?rev=811428&r1=811427&r2=811428&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/dom/impl/DOMElementImpl.cpp (original)
+++ xerces/c/trunk/src/xercesc/dom/impl/DOMElementImpl.cpp Fri Sep  4 14:40:20 
2009
@@ -477,7 +477,17 @@
     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 {

Modified: xerces/c/trunk/tests/src/DOM/DOMTest/DTest.cpp
URL: 
http://svn.apache.org/viewvc/xerces/c/trunk/tests/src/DOM/DOMTest/DTest.cpp?rev=811428&r1=811427&r2=811428&view=diff
==============================================================================
--- xerces/c/trunk/tests/src/DOM/DOMTest/DTest.cpp (original)
+++ xerces/c/trunk/tests/src/DOM/DOMTest/DTest.cpp Fri Sep  4 14:40:20 2009
@@ -916,6 +916,33 @@
          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);



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to