diff --git a/dom/base/test/test_user_select.html b/dom/base/test/test_user_select.html index e31526418695..274e523a5cfd 100644 --- a/dom/base/test/test_user_select.html +++ b/dom/base/test/test_user_select.html @@ -14,6 +14,8 @@ body { font-family: Ahem; font-size: 20px; } s { -moz-user-select: none; } n { display: none; } +a { position:absolute; bottom: 0; right:0; } +.text { -moz-user-select: text; } @@ -31,6 +33,7 @@ n { display: none; }
aaaaaaabbbbbbbbccccccc
aaaaaaabbbbbbbbccccccc
aaaaaaabbbbbbbbccccccc
+
aaaaaaabbbbddccccdddddddeeee
@@ -44,6 +47,14 @@ function test() var sel = (w ? w : window).getSelection(); sel.removeAllRanges(); } + function doneTest(e) + { + // We hide the elements we're done with so that later tests + // are inside the rather narrow iframe mochitest gives us. + // It matters for synthesizeMouse event tests. + e.style.display = 'none'; + e.offsetHeight; + } function dragSelect(e, x1, x2, x3) { @@ -75,16 +86,18 @@ function test() } } + function NL(s) { return s.replace(/(\r\n|\n\r|\r)/g, '\n'); } + function checkText(text, e) { var sel = window.getSelection(); - is(sel.toString(), text, e.id + ": selected text") + is(NL(sel.toString()), text, e.id + ": selected text") } function checkRangeText(text, index) { var r = window.getSelection().getRangeAt(index); - is(r.toString(), text, e.id + ": range["+index+"].toString()") + is(NL(r.toString()), text, e.id + ": range["+index+"].toString()") } function node(e, index) @@ -92,17 +105,27 @@ function test() return index == -1 ? e : e.childNodes[index]; } - function checkRanges(arr, e) + function checkRangeCount(n, e) { var sel = window.getSelection(); - is(sel.rangeCount, arr.length, e.id + ": Selection range count"); + is(sel.rangeCount, n, e.id + ": Selection range count"); + } + + function checkRange(i, expected, e) { + var sel = window.getSelection(); + var r = sel.getRangeAt(i); + is(r.startContainer, node(e, expected[0]), e.id + ": range["+i+"].startContainer"); + is(r.startOffset, expected[1], e.id + ": range["+i+"].startOffset"); + is(r.endContainer, node(e, expected[2]), e.id + ": range["+i+"].endContainer"); + is(r.endOffset, expected[3], e.id + ": range["+i+"].endOffset"); + } + + function checkRanges(arr, e) + { + checkRangeCount(arr.length, e); for (i = 0; i < arr.length; ++i) { var expected = arr[i]; - var r = sel.getRangeAt(i); - is(r.startContainer, node(e, expected[0]), e.id + ": range["+i+"].startContainer"); - is(r.startOffset, expected[1], e.id + ": range["+i+"].startOffset"); - is(r.endContainer, node(e, expected[2]), e.id + ": range["+i+"].endContainer"); - is(r.endOffset, expected[3], e.id + ": range["+i+"].endOffset"); + checkRange(i, expected, e); } } @@ -119,6 +142,7 @@ function test() dragSelect(e, 20, 260, 120); checkText('aaaaa', e); checkRanges([[0,1,0,6]], e); + doneTest(e); clear(); e = document.getElementById('test2'); @@ -130,48 +154,56 @@ function test() dragSelect(e, 340, 20, 140); checkText('bbbbbbbbcc', e); checkRanges([[1,0,1,10]], e); + // #test2 is used again below clear(); e = document.getElementById('test3'); dragSelect(e, 20, 340, 295); checkText('aaaaaabbbbbbbb', e); checkRanges([[0,1,0,15]], e); + // #test3 is used again below clear(); e = document.getElementById('test4'); dragSelect(e, 20, 340); checkText('aaaaaacc', e); checkRanges([[0,1,1,0], [2,0,2,2]], e); + doneTest(e); clear(); e = document.getElementById('test5'); dragSelect(e, 340, 20, 140); checkText('bbbbbbbbcc', e); checkRanges([[1,0,1,10]], e); + doneTest(e); clear(); e = document.getElementById('test6'); dragSelect(e, 20, 340, 295); checkText('aaaaaabbbbbbbb', e); checkRanges([[0,1,0,15]], e); + doneTest(e); clear(); e = document.getElementById('test7'); dragSelect(e, 20, 340); checkText('aaaaaacccccc', e); checkRanges([[0,1,1,0], [2,0,2,6]], e); + doneTest(e); clear(); e = document.getElementById('test8'); dragSelect(e, 340, 20, 140); checkText('bbbbbccccc', e); checkRanges([[1,3,1,13]], e); + doneTest(e); clear(); e = document.getElementById('test9'); dragSelect(e, 20, 340, 295); checkText('aaaaaabbbbbbbb', e); checkRanges([[0,1,0,15]], e); + doneTest(e); clear(); e = document.getElementById('testA'); @@ -179,18 +211,24 @@ function test() checkText('aaaaaaccccccc', e); checkRanges([[0,1,2,7]], e); checkRangeText('aaaaaabbbbbbbbccccccc', 0); + doneTest(e); clear(); e = document.getElementById('testB'); dragSelect(e, 340, 20, 140); checkText('bbbbbbbccccccc', e); checkRanges([[1,1,1,15]], e); + doneTest(e); clear(); - e = document.getElementById('test9'); - dragSelect(e, 20, 340, 295); - checkText('aaaaaabbbbbbbb', e); - checkRanges([[0,1,0,15]], e); + e = document.getElementById('testE'); + dragSelect(e, 20, 360, 295); + checkText('aa\nbbbb\nee', e); + checkRangeCount(3, e); + checkRange(0, [0,1,-1,1], e); + checkRange(1, [1,0,-1,2], e.children[0]); + checkRange(2, [2,0,2,2], e); + doneTest(e); // ====================================================== // ================== shift+click tests ================= @@ -206,6 +244,7 @@ function test() checkRangeText('bbbbbbbbcc', 0); checkText('bbbbbbbbcc', e); checkRanges([[-1,1,1,10]], e); + doneTest(e); // test extending a selection that end in a -moz-user-select:none node clear(); @@ -217,6 +256,7 @@ function test() checkRangeText('aaaaaabbbbbbbb', 0); checkText('aaaaaabbbbbbbb', e); checkRanges([[0,1,-1,1]], e); + doneTest(e); // ====================================================== // ==================== Script tests ==================== @@ -247,6 +287,7 @@ function test() is(sel.rangeCount, 2, "testD: kbd selection is filtered"); is(sel.getRangeAt(0).toString(), 'aaaa', "testD: kbd selection is filtered"); is(sel.getRangeAt(1).toString(), 'cccc', "testD: kbd selection is filtered"); + doneTest(e); clear(); SimpleTest.finish(); diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp index 785dfe7bed02..3aa83c90acdb 100644 --- a/layout/generic/nsFrame.cpp +++ b/layout/generic/nsFrame.cpp @@ -2736,7 +2736,7 @@ nsFrame::IsSelectable(bool* aSelectable, uint8_t* aSelectStyle) const } break; } - frame = frame->GetParent(); + frame = nsLayoutUtils::GetParentOrPlaceholderFor(frame); } // convert internal values to standard values