Wordpress/tests/qunit/editor/tinymce/dom/DomQuery.js

1033 lines
30 KiB
JavaScript

(function() {
var $elm;
module("tinymce.dom.DomQuery", {
teardown: function() {
if ($elm) {
$elm.off();
$elm = null;
}
document.getElementById('view').innerHTML = '';
}
});
function normalizeParentNode(parentNode) {
// IE 8 will return a document fragment as it's parent when nodes are removed
if (parentNode && parentNode.nodeType == 11) {
return null;
}
return parentNode;
}
function normalizeStyleValue(value) {
if (typeof value == 'string') {
return value.toLowerCase().replace(/\s+/g, ' ').replace(/;\s*$/, '');
}
return value;
}
function splitAtView(nodes) {
nodes.each(function(i) {
if (this.id == 'view') {
nodes = nodes.slice(0, i);
return false;
}
});
return nodes;
}
function addTests(prefix, $) {
test(prefix + 'Constructor HTML', function() {
var $html;
$html = $('<b>a</b><i>b</i>');
equal($html.length, 2);
equal($html[0].tagName, 'B');
equal($html[1].tagName, 'I');
});
test(prefix + 'Constructor HTML with attributes', function() {
var $html;
$html = $('<b>', {id: 'id', title: 'title'});
equal($html.length, 1);
equal($html[0].tagName, 'B');
equal($html[0].getAttribute('id'), 'id');
equal($html[0].getAttribute('title'), 'title');
});
test(prefix + 'Constructor selector', function() {
var $selector;
$selector = $('#view');
equal($selector.length, 1);
equal($selector.selector, '#view');
strictEqual($selector.context, document);
});
test(prefix + 'Constructor selector and context', function() {
var $selector;
$selector = $('#view', document);
equal($selector.length, 1);
equal($selector.selector, '#view');
strictEqual($selector.context, document);
});
test(prefix + 'Constructor selector and context', function() {
var $selector;
$('#view').html('<div><b>a</b></div><div><b>b</b></div>');
$('b', $('#view div')[0]).html('x');
equal($('#view').html().toLowerCase().replace(/[\r\n]/g, ''), '<div><b>x</b></div><div><b>b</b></div>');
});
test(prefix + 'Constructor array', function() {
var $html;
$html = $([document.getElementById('view'), document.body]);
equal($html.length, 2);
equal($html[0].tagName, 'DIV');
equal($html[1].tagName, 'BODY');
});
test(prefix + 'Constructor query instance', function() {
var $clone;
$clone = $($('#view'));
equal($clone.length, 1);
equal($clone[0].tagName, 'DIV');
});
test(prefix + 'Constructor window', function() {
var $win;
$win = $(window);
equal($win.length, 1);
strictEqual($win[0], window);
});
test(prefix + 'Constructor window', function() {
var $elm;
$elm = $(document.body);
equal($elm.length, 1);
strictEqual($elm[0], document.body);
});
test(prefix + 'static extend()', function() {
var data;
deepEqual($.extend({a: 1, b: 1}, {b: 2, c: 2}), {a: 1, b: 2, c: 2});
deepEqual($.extend({a: 1, b: 1}, {b: 2, c: 2}, {c: 3, d: 3}), {a: 1, b: 2, c: 3, d: 3});
data = {a: 1, b: 1};
ok(data === $.extend(data, {b: 2, c: 2}, {c: 3, d: 3}), {a: 1, b: 2, c: 3, d: 3});
});
test(prefix + 'static makeArray()', function() {
strictEqual($.makeArray(window)[0], window);
deepEqual($.makeArray({'0': 'a', '1': 'b', length: 2}), ['a', 'b']);
});
test(prefix + 'static inArray()', function() {
deepEqual($.inArray(1, [1, 2]), 0);
deepEqual($.inArray(2, [1, 2]), 1);
deepEqual($.inArray(3, [1, 2]), -1);
});
test(prefix + 'static grep()', function() {
deepEqual($.grep([1, 2, 3], function(v) {return v > 1;}), [2, 3]);
});
test(prefix + 'static isArray()', function() {
ok($.isArray([]));
ok(!$.isArray({}));
});
test(prefix + 'static each()', function() {
var data;
data = '';
$.each([1, 2, 3], function(key, value) {
data += '' + value + key;
});
equal(data, '102132');
data = '';
$.each({a: 1, b: 2, c: 3}, function(key, value) {
data += '' + value + key;
});
equal(data, '1a2b3c');
data = '';
$.each([1, 2, 3], function(key, value) {
data += '' + value + key;
if (value == 2) {
return false;
}
});
equal(data, '1021');
});
test(prefix + 'static trim()', function() {
equal($.trim(' a '), 'a');
equal($.trim('a '), 'a');
equal($.trim(' a'), 'a');
});
test(prefix + 'static unique()', function() {
var nodes;
nodes = $.unique([document.getElementById('view'), document.getElementById('view'), document.body]);
equal(nodes.length, 2);
equal(nodes[0].tagName, 'BODY');
equal(nodes[1].tagName, 'DIV');
});
test(prefix + 'toArray()', function() {
ok($.isArray($('#view').toArray()));
equal($('#view').toArray().length, 1);
});
test(prefix + 'add() single element', function() {
var $nodes = $('#view').add(document.body);
equal($nodes.length, 2);
equal($nodes[0].tagName, 'BODY');
equal($nodes[1].tagName, 'DIV');
});
test(prefix + 'add() multiple elements (duplicates)', function() {
var $nodes = $('#view,#view').add([document.body, document.body]);
equal($nodes.length, 2);
equal($nodes[0].tagName, 'BODY');
equal($nodes[1].tagName, 'DIV');
});
test(prefix + 'add() multiple elements (non duplicates)', function() {
var $nodes = $('#view').add([$('<b/>')[0], $('<i/>')[0]]);
equal($nodes.length, 3);
equal($nodes[0].tagName, 'DIV');
equal($nodes[1].tagName, 'B');
equal($nodes[2].tagName, 'I');
});
test(prefix + 'add() selector', function() {
var $nodes = $().add('#view');
equal($nodes.length, 1);
equal($nodes[0].tagName, 'DIV');
});
test(prefix + 'attr() set/get attr on element', function() {
var $elm;
$elm = $('<b/>').attr('id', 'x');
equal($elm.attr('id'), 'x');
equal(typeof $elm.attr('noattr'), 'undefined', 'Undefined attribute shouldn\'t have a value');
$elm = $('<b/>').attr('attr', null);
equal(typeof $elm.attr('attr'), 'undefined', 'Deleted attribute shouldn\'t have a value (1)');
$elm = $('<b/>').attr('id', 1);
strictEqual($elm.attr('id'), '1');
});
test(prefix + 'attr() set/get style attr on element (IE 7)', function() {
$elm = $('<b style="font-size: 10px" />').attr('style', 'font-size: 43px');
equal(normalizeStyleValue($elm.attr('style')), 'font-size: 43px');
});
test(prefix + 'attr() set/get checked attr on element (IE 7)', function() {
$elm = $('<input type="checkbox" />').attr('checked', 'checked');
equal($elm.attr('checked').toLowerCase(), 'checked');
});
test(prefix + 'attr() get special attrs on element (IE 7)', function() {
$elm = $('<input type="checkbox" />');
equal(typeof $elm.attr('maxlength'), 'undefined', 'Undefined maxlength');
equal(typeof $elm.attr('size'), 'undefined', 'Undefined size');
equal(typeof $elm.attr('checked'), 'undefined', 'Undefined checked');
equal(typeof $elm.attr('readonly'), 'undefined', 'Undefined readonly');
equal(typeof $elm.attr('disabled'), 'undefined', 'Undefined disabled');
$elm = $('<input type="text" />');
equal(typeof $elm.attr('maxlength'), 'undefined', 'Undefined maxlength');
equal(typeof $elm.attr('size'), 'undefined', 'Undefined size');
equal(typeof $elm.attr('checked'), 'undefined', 'Undefined checked');
equal(typeof $elm.attr('readonly'), 'undefined', 'Undefined readonly');
equal(typeof $elm.attr('disabled'), 'undefined', 'Undefined disabled');
$elm = $('<input type="text" size="11" maxlength="21" disabled="disabled" />');
equal($elm.attr('maxlength'), '21', 'maxlength');
equal($elm.attr('size'), '11', 'size');
equal($elm.attr('disabled'), 'disabled', 'disabled');
$elm = $('<textarea></textarea>');
equal(typeof $elm.attr('maxlength'), 'undefined', 'Undefined maxlength');
equal(typeof $elm.attr('size'), 'undefined', 'Undefined size');
equal(typeof $elm.attr('checked'), 'undefined', 'Undefined checked');
equal(typeof $elm.attr('readonly'), 'undefined', 'Undefined readonly');
equal(typeof $elm.attr('disabled'), 'undefined', 'Undefined disabled');
$elm = $('<textarea readonly="readonly"></textarea>');
equal($elm.attr('readonly'), 'readonly', 'readonly');
});
test(prefix + 'attr() set/get attrs on element', function() {
var $elm;
$elm = $('<b/>').attr({id: 'x', title: 'y'});
equal($elm.attr('id'), 'x');
equal($elm.attr('title'), 'y');
});
test(prefix + 'attr() set/get on non element', function() {
var $elm;
$elm = $([document.createTextNode('x')]).attr('id', 'x');
equal(typeof $elm.attr('id'), 'undefined');
});
test(prefix + 'removeAttr() on element', function() {
var $elm;
$elm = $('<b attr="a" />').removeAttr('AttR');
equal(typeof $elm.attr('attr'), 'undefined');
$elm = $([document.createTextNode('x')]).removeAttr('id');
equal(typeof $elm.attr('id'), 'undefined');
});
test(prefix + 'prop() set/get attr on element', function() {
var $elm;
$elm = $('<b/>').prop('id', 'x');
equal($elm.prop('id'), 'x');
equal(typeof $elm.prop('noprop'), 'undefined');
$elm = $('<b class="x"/>');
equal($elm.prop('class'), 'x');
equal($elm.prop('className'), 'x');
$elm = $('<label for="x"/>');
equal($elm.prop('for'), 'x');
equal($elm.prop('htmlFor'), 'x');
});
test(prefix + 'prop() set/get attrs on element', function() {
var $elm;
$elm = $('<b/>').prop({id: 'x', title: 'y'});
equal($elm.prop('id'), 'x');
equal($elm.prop('title'), 'y');
});
test(prefix + 'css() get/set single item on element', function() {
var $elm;
$elm = $('<b />').appendTo('#view').css('font-size', 42);
equal($elm.css('font-size'), '42px');
$elm = $('<b />').appendTo('#view').css('fontSize', 42);
equal($elm.css('fontSize'), '42px');
});
test(prefix + 'css() get/set items on element', function() {
var $elm;
$elm = $('<b>x</b>').appendTo('#view').css({'font-size': 42, 'text-indent': 42});
equal($elm.css('font-size'), '42px');
equal($elm.css('text-indent'), '42px');
});
test(prefix + 'css() set opacity', function() {
var styles = new tinymce.html.Styles();
if (tinymce.Env.ie && tinymce.Env.ie < 9) {
// jQuery has a slightly different output but basically the same
deepEqual(styles.parse($('<b></b>').css('opacity', 0.5).attr('style')), {filter: 'alpha(opacity=50)', 'zoom': '1'});
strictEqual(typeof $('<b></b>').css('opacity', null).attr('style'), 'undefined');
} else {
strictEqual(normalizeStyleValue($('<b></b>').css('opacity', 0.5).attr('style')), 'opacity: 0.5');
ok(!$('<b></b>').css('opacity', null).attr('style'));
ok(!$('<b></b>').css('opacity', '').attr('style'));
}
});
test(prefix + 'css() set float', function() {
strictEqual(normalizeStyleValue($('<b></b>').css('float', 'right').attr('style')), 'float: right');
ok(!$('<b style="float: left"></b>').css('float', '').attr('style'));
ok(!$('<b></b>').css('float', null).attr('style'));
});
test(prefix + 'remove() single element', function() {
var $elm;
$elm = $('<b>x</b>').appendTo('#view').remove();
strictEqual(normalizeParentNode($elm[0].parentNode), null);
});
test(prefix + 'remove() multiple elements', function() {
var $elm;
$elm = $('<b>x</b><em>x</em>').appendTo('#view').remove();
strictEqual(normalizeParentNode($elm[0].parentNode), null);
strictEqual(normalizeParentNode($elm[1].parentNode), null);
});
test(prefix + 'remove() unappended element', function() {
var $elm;
$elm = $('<b>x</b>').remove();
strictEqual(normalizeParentNode($elm[0].parentNode), null);
});
test(prefix + 'empty() single element', function() {
var $elm;
$elm = $('<b><i>x<i>y</b>').empty();
strictEqual($elm[0].firstChild, null);
});
test(prefix + 'html() set on single element', function() {
var $elm;
$elm = $('<b></b>').html('<i>x</i>');
strictEqual($elm[0].firstChild.tagName, 'I');
});
test(prefix + 'html() get on element/elements', function() {
strictEqual($('<b><i>x</i></b>').html().toLowerCase(), '<i>x</i>');
strictEqual($('<b><i>x</i></b><i>a</i>').html().toLowerCase(), '<i>x</i>');
});
/*
test(prefix + 'html() set comment as first child (IE)', function() {
$('#view').html('<!-- x -->y');
strictEqual($('#view').html(), '<!-- x -->y');
});
*/
test(prefix + 'html() set DIV as child of P (IE 8)', function() {
$('<p></p>').appendTo('#view');
$('#view p').html('<div>x</div>');
strictEqual($('#view').html().toLowerCase().replace(/[\r\n]/g, ''), '<p><div>x</div></p>');
});
test(prefix + 'text() set on single element', function() {
var $elm;
$elm = $('<b></b>').text('<i>x</i>');
strictEqual($elm[0].firstChild.data, '<i>x</i>');
});
test(prefix + 'text() get on element', function() {
strictEqual($('<b><i>x</i>y</b>').text().toLowerCase(), 'xy');
});
test(prefix + 'append() to element', function() {
var $elm;
$elm = $('<b>a</b>');
$elm.append($('<i>b</i>'));
strictEqual($elm.html().toLowerCase(), 'a<i>b</i>');
$elm = $('<b>a</b>');
$elm.append('<i>b</i>');
strictEqual($elm.html().toLowerCase(), 'a<i>b</i>');
$elm = $('<b>a</b>');
$elm.append('b');
strictEqual($elm.html().toLowerCase(), 'ab');
$elm = $('<b>a</b>');
$elm.append($('<i>b</i><b>c</b>'));
strictEqual($elm.html().toLowerCase(), 'a<i>b</i><b>c</b>');
$elm = $('<b></b>');
$elm.append($('<i>b</i>'));
strictEqual($elm.html().toLowerCase(), '<i>b</i>');
});
test(prefix + 'prepend() to element', function() {
var $elm;
$elm = $('<b>a</b>');
$elm.prepend($('<i>b</i>'));
strictEqual($elm.html().toLowerCase(), '<i>b</i>a');
$elm = $('<b>a</b>');
$elm.prepend($('<i>b</i><b>c</b>'));
strictEqual($elm.html().toLowerCase(), '<i>b</i><b>c</b>a');
$elm = $('<b></b>');
$elm.prepend($('<i>b</i>'));
strictEqual($elm.html().toLowerCase(), '<i>b</i>');
});
test(prefix + 'before() element', function() {
var $elm;
$elm = $('<b><i>a</i></b>');
$elm.children().before($('<i>b</i>'));
strictEqual($elm.html().toLowerCase(), '<i>b</i><i>a</i>');
$elm = $('<b><i>a</i></b>');
$elm.children().before($('<i>b</i><i>c</i>'));
strictEqual($elm.html().toLowerCase(), '<i>b</i><i>c</i><i>a</i>');
});
test(prefix + 'after() element', function() {
var $elm;
$elm = $('<b><i>a</i></b>');
$elm.children().after($('<i>b</i>'));
strictEqual($elm.html().toLowerCase(), '<i>a</i><i>b</i>');
$elm = $('<b><i>a</i></b>');
$elm.children().after($('<i>b</i><i>c</i>'));
strictEqual($elm.html().toLowerCase(), '<i>a</i><i>b</i><i>c</i>');
});
test(prefix + 'appendTo() to element', function() {
var $elm;
$elm = $('<b>a</b>');
$('<i>b</i>').appendTo($elm);
strictEqual($elm.html().toLowerCase(), 'a<i>b</i>');
$elm = $('<b>a</b>');
$('<i>b</i><b>c</b>').appendTo($elm);
strictEqual($elm.html().toLowerCase(), 'a<i>b</i><b>c</b>');
$elm = $('<b></b>');
$('<i>b</i>').appendTo($elm);
strictEqual($elm.html().toLowerCase(), '<i>b</i>');
});
test(prefix + 'prependTo() to element', function() {
var $elm;
$elm = $('<b>a</b>');
$('<i>b</i>').prependTo($elm);
strictEqual($elm.html().toLowerCase(), '<i>b</i>a');
$elm = $('<b>a</b>');
$('<i>b</i><b>c</b>').prependTo($elm);
strictEqual($elm.html().toLowerCase(), '<i>b</i><b>c</b>a');
$elm = $('<b></b>');
$('<i>b</i>').prependTo($elm);
strictEqual($elm.html().toLowerCase(), '<i>b</i>');
});
test(prefix + 'addClass() to element', function() {
var $elm;
$elm = $('<b></b>').addClass('a');
strictEqual($elm.attr('class'), 'a');
$elm = $('<b class="a"></b>').addClass('b');
strictEqual($elm.attr('class'), 'a b');
});
test(prefix + 'removeClass() from element', function() {
var $elm;
$elm = $('<b class="x"></b>').removeClass('a');
strictEqual($elm.attr('class'), 'x');
$elm = $('<b class="a b"></b>').removeClass('b');
strictEqual($elm.attr('class'), 'a');
$elm = $('<b class="a"></b>').removeClass('a');
strictEqual($elm.attr('class'), '');
});
test(prefix + 'toggleClass() on element', function() {
var $elm;
$elm = $('<b class="x"></b>').toggleClass('a');
strictEqual($elm.attr('class'), 'x a');
$elm = $('<b class="a b"></b>').toggleClass('b');
strictEqual($elm.attr('class'), 'a');
$elm = $('<b class="a"></b>').toggleClass('a', true);
strictEqual($elm.attr('class'), 'a');
$elm = $('<b class="a b"></b>').toggleClass('a', false);
strictEqual($elm.attr('class'), 'b');
});
test(prefix + 'toggleClass() on element', function() {
strictEqual($('<b class="a"></b>').hasClass('a'), true);
strictEqual($('<b class="a"></b>').hasClass('b'), false);
strictEqual($('<b class="a b"></b>').hasClass('b'), true);
strictEqual($('<b class="a b"></b>').hasClass('a'), true);
});
test(prefix + 'filter()', function() {
strictEqual($('<b></b><i></i><u></u>').filter('b,i').length, 2);
strictEqual($('<b></b><i></i><u></u>').filter(function(i, elm) {
return elm.tagName != 'U';
}).length, 2);
strictEqual($('<b></b><i></i><u></u>').filter(function(i, elm) {
return i != 2;
}).length, 2);
strictEqual($([document, window, document.createTextNode('x')]).filter('*').length, 0);
strictEqual($.filter('*', [document, window, document.createTextNode('x')]).length, 0);
});
test(prefix + 'each() collection', function() {
var $html = $('<b>a</b><i>b</i>'), data;
data = '';
$html.each(function(index, elm) {
data += index + elm.innerHTML + this.innerHTML;
});
strictEqual(data, '0aa1bb');
data = '';
$html.each(function(index, elm) {
data += index + elm.innerHTML + this.innerHTML;
if (index === 0) {
return false;
}
});
strictEqual(data, '0aa');
});
test(prefix + 'on()/off()/trigger()', function() {
var lastArgs1, lastArgs2;
$elm = $('<b />')
// Single listener
$elm.on('click', function(e) {
lastArgs1 = e;
});
$elm.trigger('click');
strictEqual(lastArgs1.type, 'click');
// Single listener trigger object
$elm.off().on('click', function(e) {
lastArgs1 = e;
});
$elm.trigger({type: 'click', custom: 'x'});
strictEqual(lastArgs1.type, 'click');
strictEqual(lastArgs1.custom, 'x');
// Unbind listeners
lastArgs1 = null;
$elm.off('click');
$elm.trigger('click');
strictEqual(lastArgs1, null);
// Bind two listeners
$elm.on('click', function(e) {
lastArgs1 = e;
});
$elm.on('click', function(e) {
lastArgs2 = e;
});
$elm.trigger('click');
strictEqual(lastArgs1.type, 'click');
strictEqual(lastArgs2.type, 'click');
// Bind two listeners and stop propagation
lastArgs1 = lastArgs2 = null;
$elm.off('click');
$elm.on('click', function(e) {
lastArgs1 = e;
e.stopImmediatePropagation();
});
$elm.on('click', function(e) {
lastArgs2 = e;
});
$elm.trigger('click');
strictEqual(lastArgs1.type, 'click');
strictEqual(lastArgs2, null);
});
test(prefix + 'show()/hide() element', function() {
equal(normalizeStyleValue($('<b></b>').hide().attr('style')), 'display: none');
ok(!$('<b></b>').show().attr('style'));
});
test(prefix + 'slice/eq/first/last() on collection', function() {
var $html = $('<b>1</b><i>2</i><em>3</em>');
strictEqual($html.slice(1).length, 2);
strictEqual($html.slice(1)[0].tagName, 'I');
strictEqual($html.slice(1)[1].tagName, 'EM');
strictEqual($html.slice(1, 2).length, 1);
strictEqual($html.slice(1, 2)[0].tagName, 'I');
strictEqual($html.slice(-2, -1).length, 1);
strictEqual($html.slice(-2, -1)[0].tagName, 'I');
strictEqual($html.eq(1).length, 1);
strictEqual($html.eq(1)[0].tagName, 'I');
strictEqual($html.eq(-1).length, 1);
strictEqual($html.eq(-1)[0].tagName, 'EM');
strictEqual($html.eq(1).length, 1);
strictEqual($html.eq(1)[0].tagName, 'I');
strictEqual($html.first().length, 1);
strictEqual($html.first()[0].tagName, 'B');
strictEqual($html.last().length, 1);
strictEqual($html.last()[0].tagName, 'EM');
});
test(prefix + 'replaceWith() on single element with single element', function() {
var $result;
$('<b>1</b>').appendTo('#view');
$result = $('#view b').replaceWith('<i>2</i>');
strictEqual($('#view').html().toLowerCase(), '<i>2</i>');
strictEqual($result.length, 1);
strictEqual($result[0].tagName, 'B');
});
test(prefix + 'replaceWith() on single element with multiple elements', function() {
var $result;
$('<b>1</b>').appendTo('#view');
$result = $('#view b').replaceWith('<i>2</i><i>3</i>');
strictEqual($('#view').html().toLowerCase(), '<i>2</i><i>3</i>');
strictEqual($result.length, 1);
strictEqual($result[0].tagName, 'B');
});
/*
test(prefix + 'replaceWith() on multiple elements with multiple elements', function() {
var $result;
$('<b>1</b><i>2</i>').appendTo('#view');
$result = $('#view b, #view i').replaceWith('<i>3</i><i>4</i>');
strictEqual($('#view').html().toLowerCase(), '<i>3</i><i>4</i>');
strictEqual($result.length, 2);
strictEqual($result[0].tagName, 'B');
strictEqual($result[1].tagName, 'I');
});
*/
test(prefix + 'wrap() single element', function() {
$('<b>1</b>').appendTo('#view').wrap('<i>');
strictEqual($('#view').html().toLowerCase(), '<i><b>1</b></i>');
});
test(prefix + 'wrap() multiple element', function() {
$('<b>1</b><b>2</b>').appendTo('#view').wrap('<i>');
strictEqual($('#view').html().toLowerCase(), '<i><b>1</b></i><i><b>2</b></i>');
});
test(prefix + 'wrapAll() multiple element', function() {
$('<b>1</b><b>2</b>').appendTo('#view').wrapAll('<i>');
strictEqual($('#view').html().toLowerCase(), '<i><b>1</b><b>2</b></i>');
});
test(prefix + 'wrapInner() multiple element', function() {
$('<b>1<i>a</i></b><b>2<i>b</i></b>').appendTo('#view').wrapInner('<i>');
strictEqual($('#view').html().toLowerCase(), '<b><i>1<i>a</i></i></b><b><i>2<i>b</i></i></b>');
});
test(prefix + 'unwrap() single element with no siblings', function() {
$('#view').html('<b><i>1</i></b>');
$('#view i').unwrap();
strictEqual($('#view').html().toLowerCase(), '<i>1</i>');
});
test(prefix + 'unwrap() single element with siblings', function() {
$('#view').html('<b><i>1</i><i>2</i></b>');
$('#view i').unwrap();
strictEqual($('#view').html().toLowerCase(), '<i>1</i><i>2</i>');
});
test(prefix + 'clone() single element', function() {
$('<b>1</b>').appendTo('#view').clone().appendTo('#view');
strictEqual($('#view').html().toLowerCase(), '<b>1</b><b>1</b>');
});
test(prefix + 'find()', function() {
var $result;
$('#view').append('<em><i>1</i></em><strong><b>2</b></strong>');
$result = $('#view').find('*');
strictEqual($result.length, 4);
$result = $('#view em').find('*');
strictEqual($result.length, 1);
strictEqual($result[0].tagName, 'I');
$result = $('#view em, #view strong').find('*');
strictEqual($result.length, 2);
strictEqual($result[0].tagName, 'I');
strictEqual($result[1].tagName, 'B');
});
test(prefix + 'parent()', function() {
var $result;
$('#view').append('<em><i>1</i></em><strong><b>2</b></strong>');
$result = $('#view i, #view b').parent();
strictEqual($result.length, 2);
strictEqual($result[0].tagName, 'EM');
strictEqual($result[1].tagName, 'STRONG');
$result = $('#view i, #view b').parent('em');
strictEqual($result.length, 1);
strictEqual($result[0].tagName, 'EM');
$result = $('#view i, #view b').parent('div');
strictEqual($result.length, 0);
});
test(prefix + 'parents()', function() {
var $result, html;
html = $('<div><em><i>1</i></em><strong><b>2</b></strong></div>').appendTo('#view');
$result = splitAtView($('#view i, #view b').parents());
strictEqual($result.length, 3);
strictEqual($result[0].tagName, 'STRONG');
strictEqual($result[1].tagName, 'EM');
strictEqual($result[2].tagName, 'DIV');
$result = splitAtView($('#view i, #view b').parents('em'));
strictEqual($result.length, 1);
strictEqual($result[0].tagName, 'EM');
$result = splitAtView($('#view i, #view b').parents('p'));
strictEqual($result.length, 0);
});
test(prefix + 'parentsUntil(selector)', function() {
var $result, html;
html = $('<div><em><i>1</i></em><strong><b>2</b></strong></div>').appendTo('#view');
$result = $('#view i, #view b').parentsUntil('#view');
strictEqual($result.length, 3);
strictEqual($result[0].tagName, 'STRONG');
strictEqual($result[1].tagName, 'EM');
strictEqual($result[2].tagName, 'DIV');
$result = $('#view i, #view b').parentsUntil('#view', 'div');
strictEqual($result.length, 1);
strictEqual($result[0].tagName, 'DIV');
});
test(prefix + 'parentsUntil(element)', function() {
var $result, html;
html = $('<div><em><i>1</i></em><strong><b>2</b></strong></div>').appendTo('#view');
$result = $('#view i, #view b').parentsUntil(document.getElementById('view'));
strictEqual($result.length, 3);
strictEqual($result[0].tagName, 'STRONG');
strictEqual($result[1].tagName, 'EM');
strictEqual($result[2].tagName, 'DIV');
$result = $('#view i, #view b').parentsUntil(document.getElementById('view'), 'div');
strictEqual($result.length, 1);
strictEqual($result[0].tagName, 'DIV');
});
test(prefix + 'parentsUntil(query)', function() {
var $result, html;
html = $('<div><em><i>1</i></em><strong><b>2</b></strong></div>').appendTo('#view');
$result = $('#view i, #view b').parentsUntil($('#view'));
strictEqual($result.length, 3);
strictEqual($result[0].tagName, 'STRONG');
strictEqual($result[1].tagName, 'EM');
strictEqual($result[2].tagName, 'DIV');
$result = $('#view i, #view b').parentsUntil($('#view'), 'div');
strictEqual($result.length, 1);
strictEqual($result[0].tagName, 'DIV');
});
test(prefix + 'next()', function() {
var $result, html;
html = $('<b>1</b>2<i>3</i>');
$result = html.next();
strictEqual($result.length, 1);
strictEqual($result[0].tagName, 'I');
});
test(prefix + 'prev()', function() {
var $result, html;
html = $('<b>1</b>2<i>3</i>');
$result = $(html).prev();
strictEqual($result.length, 1);
strictEqual($result[0].tagName, 'B');
});
test(prefix + 'nextUntil(selector)', function() {
var $result, html;
html = $('<b>1</b><i>2</i><em>3</em><span>3</span>');
$result = html.first().nextUntil('span');
strictEqual($result.length, 2);
strictEqual($result[0].tagName, 'I');
strictEqual($result[1].tagName, 'EM');
$result = html.first().nextUntil('span', 'i');
strictEqual($result.length, 1);
strictEqual($result[0].tagName, 'I');
});
test(prefix + 'nextUntil(element)', function() {
var $result, html;
html = $('<b>1</b><i>2</i><em>3</em><span>3</span>');
$result = html.first().nextUntil(html.last()[0]);
strictEqual($result.length, 2);
strictEqual($result[0].tagName, 'I');
strictEqual($result[1].tagName, 'EM');
$result = html.first().nextUntil(html.last()[0], 'i');
strictEqual($result.length, 1);
strictEqual($result[0].tagName, 'I');
});
test(prefix + 'nextUntil(query)', function() {
var $result, html;
html = $('<b>1</b><i>2</i><em>3</em><span>3</span>');
$result = html.first().nextUntil(html.last());
strictEqual($result.length, 2);
strictEqual($result[0].tagName, 'I');
strictEqual($result[1].tagName, 'EM');
$result = html.first().nextUntil(html.last(), 'i');
strictEqual($result.length, 1);
strictEqual($result[0].tagName, 'I');
});
test(prefix + 'prevUntil(selector)', function() {
var $result, html;
html = $('<b>1</b><i>2</i><em>3</em><span>3</span>');
$result = html.last().prevUntil('b');
strictEqual($result.length, 2);
strictEqual($result[0].tagName, 'EM');
strictEqual($result[1].tagName, 'I');
$result = html.last().prevUntil('b', 'i');
strictEqual($result.length, 1);
strictEqual($result[0].tagName, 'I');
});
test(prefix + 'prevUntil(element)', function() {
var $result, html;
html = $('<b>1</b><i>2</i><em>3</em><span>3</span>');
$result = html.last().prevUntil(html.first()[0]);
strictEqual($result.length, 2);
strictEqual($result[0].tagName, 'EM');
strictEqual($result[1].tagName, 'I');
$result = html.last().prevUntil(html.first()[0], 'i');
strictEqual($result.length, 1);
strictEqual($result[0].tagName, 'I');
});
test(prefix + 'prevUntil(query)', function() {
var $result, html;
html = $('<b>1</b><i>2</i><em>3</em><span>3</span>');
$result = html.last().prevUntil(html.first());
strictEqual($result.length, 2);
strictEqual($result[0].tagName, 'EM');
strictEqual($result[1].tagName, 'I');
$result = html.last().prevUntil(html.first(), 'i');
strictEqual($result.length, 1);
strictEqual($result[0].tagName, 'I');
});
test(prefix + 'children()', function() {
var $result, html;
html = $('<b>1<i>2</i><b>3</b></b>');
$result = html.children();
strictEqual($result.length, 2);
strictEqual($result[0].tagName, 'I');
strictEqual($result[1].tagName, 'B');
});
test(prefix + 'contents()', function() {
var $result, html;
html = $('<b>1<i>2</i><b>3</b></b>');
$result = html.contents();
strictEqual($result.length, 3);
strictEqual($result[0].nodeName, '#text');
strictEqual($result[1].tagName, 'I');
strictEqual($result[2].tagName, 'B');
});
test(prefix + 'closest(selector/element/query)', function() {
var innerMost, html;
html = $('<b><i><em><b>x</b></em></i></b>');
innerMost = $(html[0].firstChild.firstChild.firstChild);
strictEqual(innerMost.closest(null).length, 0);
strictEqual(innerMost.closest('b').html(), 'x');
strictEqual(innerMost.closest(innerMost[0]).html(), 'x');
strictEqual(innerMost.closest('b i').html().toLowerCase(), '<em><b>x</b></em>');
strictEqual(innerMost.closest($(html[0].firstChild.firstChild)).html().toLowerCase(), '<b>x</b>');
strictEqual(innerMost.closest($(html[0].firstChild.firstChild)[0]).html().toLowerCase(), '<b>x</b>');
});
test(prefix + 'offset()', function() {
var testElm = $('<b></b>').offset({top: 10, left: 20});
strictEqual(testElm[0].style.top, '10px');
strictEqual(testElm[0].style.left, '20px');
var viewOffset = $('#view').offset();
var testElmOffset = $('<b></b>').css({position: 'absolute', top: 10, left: 20}).prependTo('#view').offset();
testElmOffset.left -= viewOffset.left;
testElmOffset.top -= viewOffset.top;
deepEqual(testElmOffset, {top: 10, left: 20});
});
}
// Run tests against jQuery/DomQuery so we know that we are compatible
addTests('DomQuery: ', tinymce.dom.DomQuery);
addTests('jQuery: ', jQuery);
})();