<!DOCTTYPE html>
<style>
body { font-family: monospace; }
#margin:before { content: "MARGIN"; color: red; margin-left: -60px; }
#margin { margin-left: 60px; }
#noMargin:before { content: "BEFORE"; color: red; }
</style>
<script src="../../../../resources/js-test.js"></script>
<script>
// Since, CSSOM View introduces document.caretPositionFromPoint to replace
// document.caretRangeFromPoint. We make a polyfill to make this script works
// with Firefox.
if (!document.caretPositionFromPoint) {
document.caretPositionFromPoint = function(x, y) {
var range = document.caretRangeFromPoint(x, y);
if (range === null)
return null;
return {offset: range.startOffset, offsetNode: range.startContainer};
}
}
function testIt(id, charIndex) {
var sample = document.getElementById(id).firstChild;
var charWidth = sample.offsetWidth / sample.textContent.length;
var x = sample.offsetLeft + charWidth * charIndex + 1;
var y = sample.offsetTop + sample.offsetHeight / 2;
var position = document.caretPositionFromPoint(x, y);
if (!position)
return 'null';
if (position.offsetNode.nodeType != Node.TEXT_NODE)
return 'not text';
return position.offsetNode.textContent[position.offset];
}
onload = function() {
description('caretRangeFromPoint() should work with :before style');
shouldBeEqualToString('testIt("margin", -2)', 'a');
shouldBeEqualToString('testIt("margin", -1)', 'a');
shouldBeEqualToString('testIt("margin", 0)', 'a');
shouldBeEqualToString('testIt("margin", 1)', 'b');
debug('');
shouldBeEqualToString('testIt("noMargin", -2)', 'a');
shouldBeEqualToString('testIt("noMargin", -1)', 'a');
shouldBeEqualToString('testIt("noMargin", 0)', 'a');
shouldBeEqualToString('testIt("noMargin", 1)', 'b');
if (window.testRunner)
document.getElementById('container').textContent = '';
};
</script>
<div id="container">
<p id="description"></p>
<p id="margin"><span>abcde</span></p>
<p id="noMargin"><span>abcde</span></p>
</div>