Groups > Browsers > Opera page authoring > Re: Range and selection objects both wrongly return start of document instead of cursor location in opera only*




Range and selection objects both wrongly return start of
document instead of cursor location in opera only*

Range and selection objects both wrongly return start of document instead of cursor location in opera only*
Tue, 24 Jul 2007 18:55:18 +020
hi, looks like there is a bug in opera's range object and selection objects. 
Below i am including a simple test case.
Problem :
when in designmode(rich text editing) recently being supported by opera, I 
am unable to insert elements at the cursor location, if the cursor is 
located in an empty area, like in linebreaks.
As a matter of fact, the midas demo miserably fails, and deletes all content 
from the document when trying to insert tables, images etc. here i'm 
including a test case, and you can clearly see that the selection object's 
focusNode and anchorNode properties return a reference to the wrong nodes. 
More over the ranges startContainer and endContainer respectively return the 
wrong elements. The only time it all works is when i have a selection. if 
the selection is empty, then i get the wrong locations, more specifically 
the location returned is the first element in the document.

included here is a simple test, please note that the same test on safari and 
firefox works flawlessly and is the expected behaviour. I am also unable to 
find a workaround to this issue. Right now i am defaulting back to downlevel 
behaviour for opera which is something i do not want to do. I really need to 
get this working in opera as well.

Thanks,
Alessandro zifiglio
http://zifiglio.blogspot.com


test case :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<body>
    #1 click in the empty space below this line
<br />
<br />
    #2 click in the empty space below this line
<br />
<br />
<span>#3 click in the empty space below this line</span>
<br />
<br />
<div>#4 click in the empty space below this line</div>
<br />
<br />
 #5 click in the empty space above this line
<div id="testresult" style="border:1px dashed
red;color:red;"><span 
style="text-decoration:underline">Test results</span><br
/><br /></div>
</body>
<script type="text/javascript">
    document.designMode = 'on';
    // to test in firefox comment above line and uncomment below
    //document.body.designMode = 'on';
    window.onload = init;
    function init()
    {
        document.onmouseup = function(e){
            var sel = window.getSelection();
            var range = sel.getRangeAt(0);
            range.insertNode(document.createTextNode('This text is inserted 
in the location i clicked. works perfectly in safari and firefox'));
            var testResult = document.getElementById('testresult');
            testResult.innerHTML += '<br />' + 'sel.anchorNode.nodeName: '
+ 
sel.anchorNode.nodeName;
            testResult.innerHTML += '<br />' + 'sel.anchorNode content: '
+ 
getContents(sel.anchorNode);
            testResult.innerHTML += '<br />' + 'sel.focusNode.nodeName: '
+ 
sel.focusNode.nodeName;
            testResult.innerHTML += '<br />' + 'sel.focusNode content: ' +

getContents(sel.focusNode);
            testResult.innerHTML += '<br />' + 
'range.startContainer.nodeName: ' + range.startContainer.nodeName;
            testResult.innerHTML += '<br />' + 'range.startOffset: ' + 
range.startOffset;
            testResult.innerHTML += '<br />' + 'range.startContainer 
content: ' + getContents(range.startContainer);
            testResult.innerHTML += '<br />' +
'range.endContainer.nodeName: 
' + range.endContainer.nodeName;
            testResult.innerHTML += '<br />' + 'range.endOffset: ' + 
range.endOffset;
            testResult.innerHTML += '<br />' + 'range.endContainer
content: 
' + getContents(range.endContainer);
            testResult.innerHTML += '<br />' + 
'range.commonAncestorContainer: ' + 
getContents(range.commonAncestorContainer);
            testResult.innerHTML += '<br />' + 
'document.body.childNodes[range.startOffset]:' + 
document.body.childNodes[range.startOffset];
            testResult.innerHTML += '<br />' + 
'document.body.childNodes[range.endOffset]:' + 
getContents(document.body.childNodes[range.endOffset]);
            testResult.innerHTML += '<hr />';
        }
    }
    function getContents(node)
    {
        var nodeName = node.nodeName.toLowerCase();
        var flag1 =  (nodeName == 'html' || nodeName == 'body');
        if (node.nodeType == 1 && !flag1)// element node
            return node.innerHTML;
        else if (node.nodeType == 3 && !flag1)// textnode
            return node.nodeValue;
        else if (flag1)
            return nodeName + ' - content too large, truncated';
    }
</script>
</html>

Post Reply
Re: Range and selection objects both wrongly return start of document instead of cursor location in opera only*
Tue, 31 Jul 2007 12:28:43 -040
On Tue, 24 Jul 2007 18:55:18 +0200, "Alessandro Zifiglio"
<AlessandroZifiglio@hotmail.com> wrote:

>hi, looks like there is a bug in opera's range object and selection objects.

>Below i am including a simple test case.
>Problem :
>when in designmode(rich text editing) recently being supported by opera, I 
>am unable to insert elements at the cursor location, if the cursor is 
>located in an empty area, like in linebreaks.
>As a matter of fact, the midas demo miserably fails, and deletes all content

>from the document when trying to insert tables, images etc. here i'm 
>including a test case, and you can clearly see that the selection object's 
>focusNode and anchorNode properties return a reference to the wrong nodes. 
>More over the ranges startContainer and endContainer respectively return the

>wrong elements. The only time it all works is when i have a selection. if 
>the selection is empty, then i get the wrong locations, more specifically 
>the location returned is the first element in the document.
>
>included here is a simple test, please note that the same test on safari and

>firefox works flawlessly and is the expected behaviour. I am also unable to

>find a workaround to this issue. Right now i am defaulting back to downlevel

>behaviour for opera which is something i do not want to do. I really need to

>get this working in opera as well.

This problem is fixed in Kestrel[1].

[1] http://en.wikipedia.org/wiki/Opera_(Internet_suite)#Kestrel

-- 
Tim Altman
Desktop QA
Opera Software
Post Reply
about | contact