UNPKG

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.

357 lines (293 loc) 12.8 kB
define([ 'intern!object', 'intern/chai!assert', 'sinon', '../../dom', '../../sniff', '../../dom-construct', '../../Deferred' ], function (registerSuite, assert, sinon, dom, has, domConstruct, Deferred) { var baseId = "dojo_dom", uniqueId = 0; function getId() { return baseId + uniqueId++; } registerSuite({ name: 'dojo/dom', "byId()": (function () { var container, iframe, node, nodeId, iframeChild, iframeChildId; return { setup: function () { container = document.createElement("div"); iframe = document.createElement("iframe"); node = document.createElement("span"); nodeId = getId(); document.body.appendChild(container); container.appendChild(iframe); container.appendChild(node); iframeChild = iframe.contentDocument.createElement("div"); iframeChildId = getId(); //make async because FF seems to need a bit to setup the iframe's contentDocument after adding to the page var dfd = new Deferred(); function placeContent() { if (iframe.contentDocument && iframe.contentDocument.body) { iframe.contentDocument.body.appendChild(iframeChild); node.id = nodeId; iframeChild.id = iframeChildId; dfd.resolve(); } else { setTimeout(placeContent, 0); } } setTimeout(placeContent, 0); return dfd.promise; }, teardown: function () { document.body.removeChild(container); }, "node": function () { //arrange //act var result = dom.byId(node); //assert assert.equal(result, node); }, "string": function () { //arrange //act var result = dom.byId(nodeId); //assert assert.equal(result, node); }, "string + document": function () { //arrange //act var result = dom.byId(iframeChildId, iframe.contentDocument); //assert assert.equal(result, iframeChild); }, "non-existent node returns null": function () { //arrange //act var result = dom.byId(getId()); //assert assert.isNull(result); } } })(), "isDescendant()": (function () { var container, node, containerId, nodeId; return { setup: function () { container = document.createElement("div"); node = document.createElement("div"); document.body.appendChild(container); container.appendChild(node); containerId = getId(); nodeId = getId(); container.id = containerId; node.id = nodeId; }, teardown: function () { document.body.removeChild(container); }, "node + parent-node": function () { //arrange //act var result = dom.isDescendant(node, container); //assert assert.isTrue(result); }, "node + parent-node-id": function () { //arrange //act var result = dom.isDescendant(node, containerId); //assert assert.isTrue(result); }, "string + parent-node": function () { //arrange //act var result = dom.isDescendant(nodeId, container); //assert assert.isTrue(result); }, "node + not-ancestor": function () { //arrange //act var result = dom.isDescendant(container, node); //assert assert.isFalse(result); }, "node + grandparent-node": function () { //arrange //act var result = dom.isDescendant(node, container.parentNode); //assert assert.isTrue(result); } } })(), "setSelectable()": (function () { var container, node, child, nodeId; return { setup: function () { nodeId = getId(); container = document.createElement("input"); node = document.createElement("input"); child = document.createElement("input"); node.id = nodeId; document.body.appendChild(container); container.appendChild(node); node.appendChild(child); }, teardown: function () { document.body.removeChild(container); }, "node + true": function () { //arrange var cssUserSelect = has("css-user-select"); if (cssUserSelect) { node.style[cssUserSelect] = "none"; } else { node.removeAttribute("unselectable"); } //act dom.setSelectable(node, true); //assert if (cssUserSelect) { assert.equal(node.style[cssUserSelect], ""); } else { assert.isFalse(node.hasAttribute("unselectable")); } }, "string + true": function () { //arrange var cssUserSelect = has("css-user-select"); if (cssUserSelect) { node.style[cssUserSelect] = "none"; } else { node.removeAttribute("unselectable"); } //act dom.setSelectable(nodeId, true); //assert if (cssUserSelect) { assert.equal(node.style[cssUserSelect], ""); } else { assert.isFalse(node.hasAttribute("unselectable")); } }, "node + false": function () { //arrange var cssUserSelect = has("css-user-select"); if (cssUserSelect) { node.style[cssUserSelect] = ""; } else { node.setAttribute("unselectable"); } //act dom.setSelectable(nodeId, false); //assert if (cssUserSelect) { assert.equal(node.style[cssUserSelect], "none"); } else { assert.isTrue(node.hasAttribute("unselectable")); } }, "validation tests": (function () { var container, node, child, nodeId, iframeId, iframe, iframeChildId; function getIframeDocument(/*DOMNode*/iframeNode) { //summary: Returns the document object associated with the iframe DOM Node argument. var doc = iframeNode.contentDocument || // W3 ( (iframeNode.contentWindow) && (iframeNode.contentWindow.document) ) || // IE ( (iframeNode.name) && (document.frames[iframeNode.name]) && (documendoh.frames[iframeNode.name].document) ) || null; return doc; } return { setup: function () { container = document.createElement("div"); iframe = document.createElement("iframe"); node = document.createElement("div"); child = document.createElement("div"); iframeId = getId(); iframe.id = iframeId; iframe.name = iframeId; nodeId = getId(); node.id = nodeId; iframeChildId = getId(); var iframeContent = domConstruct.toDom("<div id='" + iframeChildId +"'></div>"); document.body.appendChild(container); container.appendChild(iframe); container.appendChild(node); node.appendChild(child); //make async because FF seems to need a bit to setup the iframe's contentDocument after adding to the page var dfd = new Deferred(); function placeContent() { if (iframe.contentDocument && iframe.contentDocument.body) { domConstruct.place(iframeContent, iframe.contentDocument.body); dfd.resolve(); } else { setTimeout(placeContent, 0); } } setTimeout(placeContent, 0); return dfd.promise; }, teardown: function () { document.body.removeChild(container); }, "nonExistentId": function () { assert.isNull(dom.byId('nonExistentId')); }, "null": function () { assert.isNull(dom.byId(null)); }, "empty string": function () { assert.isNull(dom.byId("")); }, "undefined": function () { assert.isNull(dom.byId(undefined)); }, "isDescendant": function () { assert.isTrue(dom.isDescendant(nodeId, document.body)); assert.isTrue(dom.isDescendant(nodeId, document)); assert.isTrue(dom.isDescendant(nodeId, nodeId)); assert.isTrue(dom.isDescendant(dom.byId(nodeId), nodeId)); assert.isFalse(dom.isDescendant(nodeId, dom.byId(nodeId).firstChild)); assert.isTrue(dom.isDescendant(dom.byId(nodeId).firstChild, nodeId)); }, "isDescendantIframe": function () { var subDiv = getIframeDocument(iframe).getElementById(iframeChildId); assert.isTrue(dom.isDescendant(subDiv, subDiv)); assert.isTrue(dom.isDescendant(subDiv, subDiv.parentNode)); assert.isFalse(dom.isDescendant(subDiv.parentNode, subDiv)); } } })() } })() }); });