[ 
https://issues.apache.org/jira/browse/XERCESJ-1597?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Michael Glavassevich reassigned XERCESJ-1597:
---------------------------------------------

    Assignee: Michael Glavassevich
    
> 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
>            Assignee: Michael Glavassevich
>              Labels: patch
>         Attachments: CoreDocumentImpl.java_CloningDoc_IDness.patch
>
>   Original Estimate: 0h
>  Remaining Estimate: 0h
>
> 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