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]