dojo
Version:
Dojo core is a powerful, lightweight library that makes common tasks quicker and easier. Animate elements, manipulate the DOM, and query with easy CSS syntax, all without sacrificing performance.
266 lines (217 loc) • 7.32 kB
JavaScript
define([
'intern!object',
'intern/chai!assert',
'sinon',
'../../html',
'../../parser',
'../../_base/kernel',
'dojo/_base/declare',
'dojo/Deferred',
'dojo/dom-construct',
'dojo/query',
'dojo/_base/array',
'dojo/text!./support/html.template.html'
], function (registerSuite, assert, sinon, html, parser, dojo, declare, Deferred, domConstruct, query,
arrayUtil, template) {
/* globals ifrs, id00, id01 */
function ieTrimSpaceBetweenTags (str){
return str.replace(/(<[a-z]*[^>]*>)\s*/ig, '$1');
}
function deleteGlobal(name) {
window[name] = undefined;
try {
delete window[name];
} catch(e) { /* ie is special */ }
}
registerSuite(function () {
var container;
function testHtmlSet(node, markup) {
if(typeof node === 'string') {
node = query(node, container)[0];
}
html.set(node, markup);
assert.strictEqual(ieTrimSpaceBetweenTags(node.innerHTML), markup);
return node;
}
return {
name: 'dojo/html',
'before': function () {
declare('SimpleThing', null, {
constructor: function(params, node) {
node.setAttribute('test', 'ok');
}
});
},
beforeEach: function () {
container = domConstruct.place(template, document.body);
},
afterEach: function () {
document.body.removeChild(container);
container = null;
deleteGlobal('ifrs');
deleteGlobal('id00');
deleteGlobal('id01');
},
'after': function () {
deleteGlobal('SimpleThing');
},
'.set': {
'basic usage': function () {
var markup = 'expected';
testHtmlSet(container, markup);
},
'numeric value': function () {
var markup = 1.618;
html.set(container, markup);
assert.strictEqual(container.innerHTML, markup.toString());
},
'attach onEnd handler': function () {
var msg = 'expected';
var handler = sinon.stub();
html.set(container, msg, { onEnd: handler });
assert.isTrue(handler.calledOnce);
},
'parseContent: true': function () {
var dfd = new Deferred();
/* jshint maxlen: 130 */ // splitting this line doesn't make it more readable
var content = '<div data-' + dojo._scopeName + '-type="SimpleThing" data-' + dojo._scopeName + '-id="ifrs" data="{}"></div>';
var options = {
parseContent: true,
postscript: function () {
this.set();
assert.isDefined(ifrs);
assert.strictEqual(ifrs.declaredClass, 'SimpleThing');
assert.lengthOf(this.parseResults, 1);
dfd.resolve();
}
};
html.set(container, content, options);
return dfd;
},
'change content of tr in thead': function () {
var query = '#tableTest > thead > tr';
var markup = '<td><div>This</div>Should<u>Work</u></td>';
testHtmlSet(query, markup);
},
'change content of th in thead': function () {
var query = '#tableTest > thead';
var markup = '<tr><td><div>This</div>Should<u>Work</u></td></tr>';
testHtmlSet(query, markup);
},
'change content of tr in tbody': function () {
var query = '#tableTest > tbody > tr';
var markup = '<td><div>This</div>Should<u>Work</u></td>';
testHtmlSet(query, markup);
},
'change content of tbody': function () {
var query = '#tableTest > tbody';
var markup = '<tr><td><div>This</div>Should<u>Work</u></td></tr>';
testHtmlSet(query, markup);
},
'change content of table': function () {
var query = '#tableTest';
var markup = '<tbody><tr><td><div>This</div>Should<u>Work</u></td></tr></tbody>';
testHtmlSet(query, markup);
},
'basic NodeList': function () {
var tmpUL = domConstruct.create('ul');
domConstruct.create('li', { innerHTML: 'item 1' }, tmpUL);
domConstruct.create('li', { innerHTML: 'item 2' }, tmpUL);
html.set(container, tmpUL.childNodes);
assert.lengthOf(query('li', container), 2);
},
'mixed content': function () {
var markup = '<h4>See Jane</h4>Look at her <span>Run</span>!';
testHtmlSet(container, markup);
},
'extractContent: true': function () {
var markup = '' +
'<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">' +
'<html> ' +
' <head> ' +
' <title> ' +
' the title ' +
' </title> ' +
' </head> ' +
' <body> ' +
' <p> ' +
' This is the <b>Good Stuff</b><br> ' +
' </p> ' +
' </body> ' +
'</html> ';
html.set(container, markup, { extractContent: true });
assert.strictEqual(container.innerHTML.indexOf('title'), -1);
assert.lengthOf(query('*', container), 3);
},
'inheritance': (function() {
var parseSpy;
function runTest(options) {
/* jshint maxlen: 130 */ // splitting this line doesn't make it more readable
var markup = '<div data-dojo-testing-type="SimpleThing" data-dojo-testing-id="ifrs" data="{}"></div>';
html.set(container, markup, options);
return parseSpy.lastCall.args[0].inherited;
}
return {
'beforeEach': function () {
parseSpy = sinon.spy(parser, 'parse');
},
'afterEach': function () {
parseSpy.restore();
delete window.ifrs;
},
'dir, lang, textDir are not specified': function () {
var options = { parseContent: true };
var inherited = runTest(options);
assert.isTrue(parseSpy.called);
assert.isUndefined(inherited.dir, 'dir should not exist');
assert.isUndefined(inherited.lang, 'lang should not exist');
assert.isUndefined(inherited.textDir, 'textDir should not exist');
},
'dir, lang, textDir are specified': function () {
var options = {
parseContent: true,
dir: 'expectedDir',
lang: 'expectedLang',
textDir: 'expectedTextDir'
};
var inherited = runTest(options);
assert.isTrue(parseSpy.called);
assert.strictEqual(inherited.dir, options.dir);
assert.strictEqual(inherited.lang, options.lang);
assert.strictEqual(inherited.textDir, options.textDir);
}
};
}()),
'_emptyNode': function () {
container.innerHTML = '<div><span>just</span>some test<br/></div>text';
html._emptyNode(container);
assert.lengthOf(container.childNodes, 0);
assert.strictEqual(container.innerHTML, '');
},
'_ContentSetter': function () {
/* jshint maxlen: 130 */ // splitting these lines doesn't make it more readable
var args = [
[ 'simple' ],
[
'<div data-' + dojo._scopeName + '-type="SimpleThing" data-' + dojo._scopeName + '-id="id00">parsed content</div>',
{ parseContent: true }
],
[
'<div data-' + dojo._scopeName + '-type="SimpleThing" data-' + dojo._scopeName + '-id="id01">parsed content</div>',
{ parseContent: true }
]
];
var setter = new html._ContentSetter({ node: container });
arrayUtil.forEach(args, function (applyArgs) {
setter.node = container;
setter.set.apply(setter, applyArgs);
setter.tearDown();
});
assert.isDefined(id00);
assert.isDefined(id01);
assert.isUndefined(setter.parseResults);
}
}
};
});
});