mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-14 05:45:37 +00:00
Bug 1129356 - Traverse the placeholder's parent for abs.pos. frames when determining the used value for 'user-select'. r=roc
This commit is contained in:
parent
6db8817415
commit
ceb106d8e4
@ -14,6 +14,8 @@
|
|||||||
body { font-family: Ahem; font-size: 20px; }
|
body { font-family: Ahem; font-size: 20px; }
|
||||||
s { -moz-user-select: none; }
|
s { -moz-user-select: none; }
|
||||||
n { display: none; }
|
n { display: none; }
|
||||||
|
a { position:absolute; bottom: 0; right:0; }
|
||||||
|
.text { -moz-user-select: text; }
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
@ -31,6 +33,7 @@ n { display: none; }
|
|||||||
<div id="testA">aaaaaaa<n>bbb<s>bbbbb</s></n>ccccccc</div>
|
<div id="testA">aaaaaaa<n>bbb<s>bbbbb</s></n>ccccccc</div>
|
||||||
<div id="testB"><n><s>aaaa</s>aaa</n>bbbbbbbbccccccc</div>
|
<div id="testB"><n><s>aaaa</s>aaa</n>bbbbbbbbccccccc</div>
|
||||||
<div id="testC">aaaaaaabbbbbbbb<n>cc<s>c</s>cccc</n></div>
|
<div id="testC">aaaaaaabbbbbbbb<n>cc<s>c</s>cccc</n></div>
|
||||||
|
<div id="testE">aaa<s id="testEc1">aaaa<a class="text">bbbb</a>dd<a>cccc</a>ddddddd</s>eeee</div>
|
||||||
|
|
||||||
<iframe id="testD" src="data:text/html,<body>aaaa<span style='-moz-user-select:none'>bbbb</span>cccc"></iframe>
|
<iframe id="testD" src="data:text/html,<body>aaaa<span style='-moz-user-select:none'>bbbb</span>cccc"></iframe>
|
||||||
|
|
||||||
@ -44,6 +47,14 @@ function test()
|
|||||||
var sel = (w ? w : window).getSelection();
|
var sel = (w ? w : window).getSelection();
|
||||||
sel.removeAllRanges();
|
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)
|
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)
|
function checkText(text, e)
|
||||||
{
|
{
|
||||||
var sel = window.getSelection();
|
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)
|
function checkRangeText(text, index)
|
||||||
{
|
{
|
||||||
var r = window.getSelection().getRangeAt(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)
|
function node(e, index)
|
||||||
@ -92,17 +105,27 @@ function test()
|
|||||||
return index == -1 ? e : e.childNodes[index];
|
return index == -1 ? e : e.childNodes[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
function checkRanges(arr, e)
|
function checkRangeCount(n, e)
|
||||||
{
|
{
|
||||||
var sel = window.getSelection();
|
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) {
|
for (i = 0; i < arr.length; ++i) {
|
||||||
var expected = arr[i];
|
var expected = arr[i];
|
||||||
var r = sel.getRangeAt(i);
|
checkRange(i, expected, e);
|
||||||
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");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -119,6 +142,7 @@ function test()
|
|||||||
dragSelect(e, 20, 260, 120);
|
dragSelect(e, 20, 260, 120);
|
||||||
checkText('aaaaa', e);
|
checkText('aaaaa', e);
|
||||||
checkRanges([[0,1,0,6]], e);
|
checkRanges([[0,1,0,6]], e);
|
||||||
|
doneTest(e);
|
||||||
|
|
||||||
clear();
|
clear();
|
||||||
e = document.getElementById('test2');
|
e = document.getElementById('test2');
|
||||||
@ -130,48 +154,56 @@ function test()
|
|||||||
dragSelect(e, 340, 20, 140);
|
dragSelect(e, 340, 20, 140);
|
||||||
checkText('bbbbbbbbcc', e);
|
checkText('bbbbbbbbcc', e);
|
||||||
checkRanges([[1,0,1,10]], e);
|
checkRanges([[1,0,1,10]], e);
|
||||||
|
// #test2 is used again below
|
||||||
|
|
||||||
clear();
|
clear();
|
||||||
e = document.getElementById('test3');
|
e = document.getElementById('test3');
|
||||||
dragSelect(e, 20, 340, 295);
|
dragSelect(e, 20, 340, 295);
|
||||||
checkText('aaaaaabbbbbbbb', e);
|
checkText('aaaaaabbbbbbbb', e);
|
||||||
checkRanges([[0,1,0,15]], e);
|
checkRanges([[0,1,0,15]], e);
|
||||||
|
// #test3 is used again below
|
||||||
|
|
||||||
clear();
|
clear();
|
||||||
e = document.getElementById('test4');
|
e = document.getElementById('test4');
|
||||||
dragSelect(e, 20, 340);
|
dragSelect(e, 20, 340);
|
||||||
checkText('aaaaaacc', e);
|
checkText('aaaaaacc', e);
|
||||||
checkRanges([[0,1,1,0], [2,0,2,2]], e);
|
checkRanges([[0,1,1,0], [2,0,2,2]], e);
|
||||||
|
doneTest(e);
|
||||||
|
|
||||||
clear();
|
clear();
|
||||||
e = document.getElementById('test5');
|
e = document.getElementById('test5');
|
||||||
dragSelect(e, 340, 20, 140);
|
dragSelect(e, 340, 20, 140);
|
||||||
checkText('bbbbbbbbcc', e);
|
checkText('bbbbbbbbcc', e);
|
||||||
checkRanges([[1,0,1,10]], e);
|
checkRanges([[1,0,1,10]], e);
|
||||||
|
doneTest(e);
|
||||||
|
|
||||||
clear();
|
clear();
|
||||||
e = document.getElementById('test6');
|
e = document.getElementById('test6');
|
||||||
dragSelect(e, 20, 340, 295);
|
dragSelect(e, 20, 340, 295);
|
||||||
checkText('aaaaaabbbbbbbb', e);
|
checkText('aaaaaabbbbbbbb', e);
|
||||||
checkRanges([[0,1,0,15]], e);
|
checkRanges([[0,1,0,15]], e);
|
||||||
|
doneTest(e);
|
||||||
|
|
||||||
clear();
|
clear();
|
||||||
e = document.getElementById('test7');
|
e = document.getElementById('test7');
|
||||||
dragSelect(e, 20, 340);
|
dragSelect(e, 20, 340);
|
||||||
checkText('aaaaaacccccc', e);
|
checkText('aaaaaacccccc', e);
|
||||||
checkRanges([[0,1,1,0], [2,0,2,6]], e);
|
checkRanges([[0,1,1,0], [2,0,2,6]], e);
|
||||||
|
doneTest(e);
|
||||||
|
|
||||||
clear();
|
clear();
|
||||||
e = document.getElementById('test8');
|
e = document.getElementById('test8');
|
||||||
dragSelect(e, 340, 20, 140);
|
dragSelect(e, 340, 20, 140);
|
||||||
checkText('bbbbbccccc', e);
|
checkText('bbbbbccccc', e);
|
||||||
checkRanges([[1,3,1,13]], e);
|
checkRanges([[1,3,1,13]], e);
|
||||||
|
doneTest(e);
|
||||||
|
|
||||||
clear();
|
clear();
|
||||||
e = document.getElementById('test9');
|
e = document.getElementById('test9');
|
||||||
dragSelect(e, 20, 340, 295);
|
dragSelect(e, 20, 340, 295);
|
||||||
checkText('aaaaaabbbbbbbb', e);
|
checkText('aaaaaabbbbbbbb', e);
|
||||||
checkRanges([[0,1,0,15]], e);
|
checkRanges([[0,1,0,15]], e);
|
||||||
|
doneTest(e);
|
||||||
|
|
||||||
clear();
|
clear();
|
||||||
e = document.getElementById('testA');
|
e = document.getElementById('testA');
|
||||||
@ -179,18 +211,24 @@ function test()
|
|||||||
checkText('aaaaaaccccccc', e);
|
checkText('aaaaaaccccccc', e);
|
||||||
checkRanges([[0,1,2,7]], e);
|
checkRanges([[0,1,2,7]], e);
|
||||||
checkRangeText('aaaaaabbbbbbbbccccccc', 0);
|
checkRangeText('aaaaaabbbbbbbbccccccc', 0);
|
||||||
|
doneTest(e);
|
||||||
|
|
||||||
clear();
|
clear();
|
||||||
e = document.getElementById('testB');
|
e = document.getElementById('testB');
|
||||||
dragSelect(e, 340, 20, 140);
|
dragSelect(e, 340, 20, 140);
|
||||||
checkText('bbbbbbbccccccc', e);
|
checkText('bbbbbbbccccccc', e);
|
||||||
checkRanges([[1,1,1,15]], e);
|
checkRanges([[1,1,1,15]], e);
|
||||||
|
doneTest(e);
|
||||||
|
|
||||||
clear();
|
clear();
|
||||||
e = document.getElementById('test9');
|
e = document.getElementById('testE');
|
||||||
dragSelect(e, 20, 340, 295);
|
dragSelect(e, 20, 360, 295);
|
||||||
checkText('aaaaaabbbbbbbb', e);
|
checkText('aa\nbbbb\nee', e);
|
||||||
checkRanges([[0,1,0,15]], 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 =================
|
// ================== shift+click tests =================
|
||||||
@ -206,6 +244,7 @@ function test()
|
|||||||
checkRangeText('bbbbbbbbcc', 0);
|
checkRangeText('bbbbbbbbcc', 0);
|
||||||
checkText('bbbbbbbbcc', e);
|
checkText('bbbbbbbbcc', e);
|
||||||
checkRanges([[-1,1,1,10]], e);
|
checkRanges([[-1,1,1,10]], e);
|
||||||
|
doneTest(e);
|
||||||
|
|
||||||
// test extending a selection that end in a -moz-user-select:none node
|
// test extending a selection that end in a -moz-user-select:none node
|
||||||
clear();
|
clear();
|
||||||
@ -217,6 +256,7 @@ function test()
|
|||||||
checkRangeText('aaaaaabbbbbbbb', 0);
|
checkRangeText('aaaaaabbbbbbbb', 0);
|
||||||
checkText('aaaaaabbbbbbbb', e);
|
checkText('aaaaaabbbbbbbb', e);
|
||||||
checkRanges([[0,1,-1,1]], e);
|
checkRanges([[0,1,-1,1]], e);
|
||||||
|
doneTest(e);
|
||||||
|
|
||||||
// ======================================================
|
// ======================================================
|
||||||
// ==================== Script tests ====================
|
// ==================== Script tests ====================
|
||||||
@ -247,6 +287,7 @@ function test()
|
|||||||
is(sel.rangeCount, 2, "testD: kbd selection is filtered");
|
is(sel.rangeCount, 2, "testD: kbd selection is filtered");
|
||||||
is(sel.getRangeAt(0).toString(), 'aaaa', "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");
|
is(sel.getRangeAt(1).toString(), 'cccc', "testD: kbd selection is filtered");
|
||||||
|
doneTest(e);
|
||||||
|
|
||||||
clear();
|
clear();
|
||||||
SimpleTest.finish();
|
SimpleTest.finish();
|
||||||
|
@ -2736,7 +2736,7 @@ nsFrame::IsSelectable(bool* aSelectable, uint8_t* aSelectStyle) const
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
frame = frame->GetParent();
|
frame = nsLayoutUtils::GetParentOrPlaceholderFor(frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
// convert internal values to standard values
|
// convert internal values to standard values
|
||||||
|
Loading…
Reference in New Issue
Block a user