Range implementation: several bugs (see detailed Description) and code
Maintenance
----------------------------------------------------------------------------------
Key: XERCESJ-1400
URL: https://issues.apache.org/jira/browse/XERCESJ-1400
Project: Xerces2-J
Issue Type: Bug
Components: DOM (Level 2 Traversal & Range)
Affects Versions: 2.9.1
Reporter: Ludger Bünger
Ok, there are a couple of issues (bugs, non-standard-compliant behaviour and
maintenance) in Xerces Range implementation I created fixes for which I like to
provide to the community.
These Fixes are already in use in our application depending heavily upon
Ranges and deployed at customers over two years ago.
Bug 1:
Quite a lot of Range methods are not aware of character type Nodes other than
Text.
Described more in detail in [1], the Ranges spec differentiate between two
type of Nodes.
a) Nodes of type CharacterData (these include Text), Comment or
ProcessingInstruction which are treated the same in respect to the Ranges spec.
b) other Nodes.
The inital implementation of Ranges only considered the case of Text nodes
ignoring the other character containing node types.
With the Fixes for Bug #1228 and #1229 this has been improved for specific
cases but not in general.
The following methods of RangeImpl are not aware of all above mentioned
character containing nodes:
* RangeImpl.insertNode
* RangeImpl.surroundContent
* RangeImpl.selectNodeContent
* RangeImpl.toString
* RangeImpl.receiveSplitData
* RangeImpl.traverseNode
* RangeImpl.getSelectedNode
The following methods are correctly aware of them and have already been fixed
by Michael:
* RangeImpl.checkindex
* RangeImpl.receiveDeletedText
* RangeImpl.receiveInsertedText
* RangeImpl.receiveSplitData
* RangeImpl.traverseSameContainer
Bug 1:
selectNodeContents does not surround character containing nodes.
consider following code snippet.
Text text = doc.createNode();
text.setData("String"); // length of string: 6
range.selectNodeContent(text);
received result: (text, 0, text, 0);
correct result: (text, 0, text, 6);
Bug 3:
surroundContent(newParent) does remove children of newParent as sepcified in
[2].
"If the node newParent has any children, those children are removed before its
insertion. Also, if the node newParent already has a parent, it is removed from
the original parent's childNodes list."
Bug 4:
Text.textSplit does not update Ranges at all.
Solution: notify document using document.splitData after text split to cause
range update.
Bug 5:
After calling insertNode Ranges containing the same affected node are not
updated correctly.
Suggested Solution: use textSplit instead of doing a manual text split inside
RangeImpl and set content of this range afterwards.
This does work now due to Bug 4 being fixed.
However textSplit is only defined upon Nodes of type Text, while ranges might
split any character data containing nodes.
Thus I suggest to extract the text split operation to an internal method that
is implemented upon CharacterDataImpl used by both Text.textSplit and
Range.insertNode.
Maintenance 6:
Obsolete methods.
The following methods are never used and thus obsolete:
* deleteData
* insertData
* removeChild
* signalSplitData
Maintenance 7:
Obsolete fields.
After removing methods from Maintenance issue 6, the following fields are never
written and thus obsolete:
* fDeleteNode
* fInsertedFromRange
* fRemoveChild
* fSplitNode
I suggest removing.
Range update works perfectly well without these.
[1]
http://www.w3.org/TR/2000/REC-DOM-Level-2-Traversal-Range-20001113/ranges.html#Level-2-Range-Position
[2]
http://www.w3.org/TR/2000/REC-DOM-Level-2-Traversal-Range-20001113/ranges.html#Level-2-Range-Surrounding
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]