(function(has, addtest, cssprop){
if(!has("dom")){ return; }
addtest("dom-quirks", function(g, d, el){
var supported;
if(typeof d.compatMode == "string"){
supported = (d.compatMode == "BackCompat");
}else{
el.style.width = "1";
supported = (e.style.width == "1px");
el.style.cssText = "";
}
return supported;
});
addtest("dom-dataset", function(g, d, el){
el.setAttribute("data-a-b", "c");
return has.isHostType(el, "dataset") && el.dataset.aB == "c";
});
// works in all but IE < 9
addtest("dom-addeventlistener", function(g, d){
return has.isHostType(d, "addEventListener");
});
// works in all but IE
addtest("dom-createelementns", function(g, d){
return has.isHostType(d, "createElementNS");
});
// should fail in webkit, as they dont support it.
addtest("dom-attrmodified", function(g, d, el){
var supported = false,
listener = function(){ supported = true; };
if(has("dom-addeventlistener")){
supported = false;
el.addEventListener("DOMAttrModified", listener, false);
el.setAttribute("___TEST___", true);
el.removeAttribute("___TEST___", true);
el.removeEventListener("DOMAttrModified", listener, false);
}
return supported;
});
addtest("dom-subtreemodified", function(g, d, el){
var supported = false,
listener = function(){ supported = true; };
if(has("dom-addeventlistener")){
supported = false;
el.appendChild(d.createElement("div"));
el.addEventListener("DOMSubtreeModified", listener, false);
has.clearElement(el);
el.removeEventListener("DOMSubtreeModified", listener, false);
}
return supported;
});
// FROM cft.js
addtest("dom-children", function(g, d, el){
var supported = false;
if(has.isHostType(el, "children")){
var div = el.appendChild(d.createElement("div")),
children = el.children;
// Safari 2.x returns ALL children including text nodes
el.appendChild(d.createTextNode("x"));
div.appendChild(div.cloneNode(false));
supported = !!children && children.length == 1 && children[0] == div;
has.clearElement(el);
}
return supported;
});
// true for html, xhtml and unknown elements are case
// sensitive to how they are written in the markup
addtest("dom-tagname-uppercase", function(g, d, el){
return el.nodeName == "DIV";
});
addtest("dom-html5-elements", function(g, d, el){
el.innerHTML = "";
return el.childNodes.length == 1;
});
// true for IE < 9
// http://msdn.microsoft.com/en-us/library/ms536389(VS.85).aspx vs
// http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-2141741547
addtest("dom-create-attr", function(g, d){
var input,
supported = false;
try{
input = d.createElement("");
supported = input.type == "hidden" && input.name == "hasjs";
}catch(e){}
return supported;
});
// TODO: this test is really testing if expando's become attributes (IE)
// true for IE
addtest("dom-selectable", function(g, d, el){
var supported = false;
try{
el.unselectable = "on";
supported = typeof el.attributes.unselectable != "undefined" &&
el.attributes.unselectable.value == "on";
el.unselectable = "off";
}catch(e){}
return supported;
});
// true for all modern browsers, including IE 9+
addtest("dom-computed-style", function(g, d){
return has.isHostType(d, "defaultView") && has.isHostType(d.defaultView, "getComputedStyle");
});
// true for IE
addtest("dom-current-style", function(g, d){
return !has("dom-computed-style") && has.isHostType(d.documentElement, "currentStyle");
});
// true for IE
addtest("dom-element-do-scroll", function(g, d){
return has.isHostType(d.documentElement, "doScroll");
});
// test for dynamic-updating base tag support (allows us to avoid href & src attr rewriting)
// false for Firefox < 4 and IE < 8
addtest("dom-dynamic-base", function (g, d, el){
var attempt,
backup,
base,
attempts = [[d.createElement("a"), "href"], [d.createElement("q"), "cite"]],
head = d.getElementsByTagName("head")[0],
href = location.href,
fake = false,
supported = null,
token = location.search || location.hash;
if(head){
base = d.getElementsByTagName("base")[0] || (function(){
fake = true;
return head.insertBefore(d.createElement("base"), head.firstChild);
})();
backup = base.href || href.slice(0, token ? href.indexOf(token) : href.length).replace(/[^\/]*$/, "");
base.href = location.protocol + "//x";
// check support on more than one element to be thorough
while(attempt = attempts.pop()){
if(supported != false){
attempt[0][attempt[1]] = "y";
supported = attempt[0][attempt[1]].indexOf("x/y") > -1;
}
}
// reset href before removal, otherwise href persists in Opera
base.href = backup;
if(fake){
head.removeChild(base);
}
}
return supported;
});
addtest("dom-nodelist-sliceable", function(g, d, el){
var supported = false,
de = d.documentElement,
id = de.id;
// Opera 9.25 bug
de.id = "length";
// older Safari will return an empty array
try{
supported = !![].slice.call(d.childNodes, 0)[0];
}catch(e){}
de.id = id;
return supported;
});
})(has, has.add, has.cssprop);