bounding-client-rect
Version:
Cross-browser `getBoundingClientRect()` for all Node types
70 lines (51 loc) • 2.08 kB
JavaScript
var assert = require('assert');
var getBoundingClientRect = require('../');
describe('getBoundingClientRect', function () {
var div = document.createElement('div');
div.innerHTML = '<p>hello</p>';
div.setAttribute('contenteditable', 'true');
document.body.appendChild(div);
after(function () {
document.body.removeChild(div);
});
function assertIsTextRectangle (rect) {
// see:
// https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsIDOMClientRect
assert.equal('number', typeof rect.bottom);
assert.equal('number', typeof rect.height);
assert.equal('number', typeof rect.left);
assert.equal('number', typeof rect.right);
assert.equal('number', typeof rect.top);
assert.equal('number', typeof rect.width);
}
it('should return a client rect for a P HTMLElement', function () {
var p = div.firstChild;
assert.equal(1 /*Node.ELEMENT_NODE*/, p.nodeType);
assert.equal('P', p.nodeName);
var rect = getBoundingClientRect(p);
assertIsTextRectangle(rect);
});
it('should return a client rect for a collapsed Range', function () {
var range = document.createRange();
range.setStart(div.firstChild.firstChild, 1);
range.setEnd(div.firstChild.firstChild, 1);
assert(range.collapsed);
var rect = getBoundingClientRect(range);
assertIsTextRectangle(rect);
});
it('should return a client rect for a non-collapsed Range', function () {
var range = document.createRange();
range.setStart(div.firstChild.firstChild, 1);
range.setEnd(div.firstChild.firstChild, 4);
assert(!range.collapsed);
var rect = getBoundingClientRect(range);
assertIsTextRectangle(rect);
});
it('should return a client rect for a TextNode', function () {
var textNode = div.firstChild.firstChild;
assert.equal(3 /*Node.TEXT_NODE*/, textNode.nodeType);
assert.equal('hello', textNode.nodeValue);
var rect = getBoundingClientRect(textNode);
assertIsTextRectangle(rect);
});
});