Jacob Kjome created XERCESJ-1597:
------------------------------------

             Summary: document.cloneNode() copies identifiers map but fails to 
apply IDness to relevant attribute nodes
                 Key: XERCESJ-1597
                 URL: https://issues.apache.org/jira/browse/XERCESJ-1597
             Project: Xerces2-J
          Issue Type: Bug
          Components: DOM (Level 3 Core)
    Affects Versions: 2.11.0
         Environment: Java in any environment
            Reporter: Jacob Kjome


What the latest Xerces2 DOM does with attribute ID'ness upon cloning a document 
is to copy over the map of identifiers.  This allows 
document.getElementById(String) [1] to work.  But the attribute node(s) in 
question will still return 'false' in response to attr.isId() [2].  What it 
fails to do is call element.setIdAttributeNode(Attr,boolean) [3].

This leads to quirky behavior in the cloned document when removing an attribute 
from an element that has a corresponding entry in the identifiers map, because 
removeAttribute(String) does an internal check for ID'ness to see if it should 
clean up the identifiers map.  But because the attribute node reports itself as 
NOT of type "ID", this cleanup is skipped, causing 
document.getElementById(String) [3] to continue returning the element [from the 
identifiers map] even after attribute removal.

I've actually modified the Xerces2 CoreDocumentImpl class to correct this 
behavior in a way that actually cleans up quite a bit of code.  Patch coming up 
shortly.  I'd appreciate if someone could review it.

For users working with cloned documents and are running into this issue, there 
is a workaround.  Prior to removing an attribute (let's say "id" in the HTML 
DOM) which currently provides an element upon 
document.getElementById("myIdName"), perform the following call...

    element.setIdAttribute("id", true);

With that set, the check check for IDness within the call to 
element.removeAttribute("id") will succeed and, therefore, clean up the 
corresponding entry in the identifiers map.  Now further calls to 
document.getElementById("myIdName") will produce "null", as expected.  This 
workaround will also continue to work after the patch is applied, though it 
will no longer be necessary.


[1] 
http://xerces.apache.org/xerces2-j/javadocs/api/org/w3c/dom/Document.html#getElementById(java.lang.String)
[2] http://xerces.apache.org/xerces2-j/javadocs/api/org/w3c/dom/Attr.html#isId()
[3] 
http://xerces.apache.org/xerces2-j/javadocs/api/org/w3c/dom/Element.html#setIdAttributeNode(org.w3c.dom.Attr,%20boolean)

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

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

Reply via email to