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

Ludger Bünger updated XERCESJ-1400:
-----------------------------------

    Attachment: Xerces-Range-Maintenance-Patch.txt

Patch fixing above issues in RangeImpl.

These fixes have been in productive use within our application since over two 
years, originally with xerces 2.7.2.

> 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
>         Attachments: Xerces-Range-Maintenance-Patch.txt
>
>
> 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]

Reply via email to