/*
* Copyright 2017 Jacek Caban for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
var tests = [];
sync_test("input_selection", function() {
var input = document.createElement("input");
input.type = "text";
input.value = "test";
document.body.appendChild(input);
function test_range(start, end) {
ok(input.selectionStart === start, "input.selectionStart = " + input.selectionStart + " expected " + start);
ok(input.selectionEnd === end, "input.selectionEnd = " + input.selectionEnd + " expected " + end);
}
test_range(0, 0);
input.selectionStart = 2;
test_range(2, 2);
input.selectionStart = -1;
test_range(0, 2);
input.selectionStart = 10;
test_range(4, 4);
input.selectionEnd = 2;
test_range(2, 2);
input.selectionEnd = -1;
test_range(0, 0);
input.selectionEnd = 10;
test_range(0, 4);
input.setSelectionRange(2, 3);
test_range(2, 3);
input.setSelectionRange(-1, 10);
test_range(0, 4);
input.setSelectionRange(3, 3);
test_range(3, 3);
});
sync_test("textContent", function() {
var text = document.createTextNode("test");
ok(text.textContent === "test", "text.textContent = " + text.textContent);
var div = document.createElement("div");
document.body.appendChild(div);
div.innerHTML = "abc
text
";
ok(div.textContent === "abc/* */text", "div.textContent = " + div.textContent);
div.textContent = "test";
ok(div.textContent === "test", "div.textContent = " + div.textContent);
ok(div.childNodes.length === 1, "div.childNodes.length = " + div.childNodes.length);
ok(div.firstChild.textContent === "test", "div.firstChild.textContent = " + div.firstChild.textContent);
div.textContent = "";
ok(div.textContent === "", "div.textContent = " + div.textContent);
ok(div.childNodes.length === 0, "div.childNodes.length = " + div.childNodes.length);
div.textContent = null;
ok(div.textContent === "", "div.textContent = " + div.textContent);
div.textContent = 11;
ok(div.textContent === "11", "div.textContent = " + div.textContent);
div.textContent = 10.5;
ok(div.textContent === "10.5", "div.textContent = " + div.textContent);
ok(document.textContent === null, "document.textContent = " + document.textContent);
});
sync_test("ElementTraversal", function() {
var div = document.createElement("div");
div.innerHTML = "abcbold ';
elems = document.getElementsByClassName("class1");
ok(elems.length === 3, "elems.length = " + elems.length);
ok(elems[0].tagName === "DIV", "elems[0].tagName = " + elems[0].tagName);
ok(elems[1].tagName === "DIV", "elems[1].tagName = " + elems[1].tagName);
ok(elems[2].tagName === "SCRIPT", "elems[2].tagName = " + elems[2].tagName);
elems = document.getElementsByClassName("class2");
ok(elems.length === 1, "elems.length = " + elems.length);
ok(elems[0].tagName === "A", "elems[0].tagName = " + elems[0].tagName);
elems = document.getElementsByClassName("classnotfound");
ok(elems.length == 0, "elems.length = " + elems.length);
});
sync_test("createElementNS", function() {
var svg_ns = "http://www.w3.org/2000/svg";
var elem;
elem = document.createElementNS(null, "test");
ok(elem.tagName === "test", "elem.tagName = " + elem.tagName);
ok(elem.namespaceURI === null, "elem.namespaceURI = " + elem.namespaceURI);
elem = document.createElementNS(svg_ns, "test");
ok(elem.tagName === "test", "elem.tagName = " + elem.tagName);
ok(elem.namespaceURI === svg_ns, "elem.namespaceURI = " + elem.namespaceURI);
elem = document.createElementNS(svg_ns, "svg");
ok(elem.tagName === "svg", "elem.tagName = " + elem.tagName);
ok(elem.namespaceURI === svg_ns, "elem.namespaceURI = " + elem.namespaceURI);
elem = document.createElementNS("test", "svg");
ok(elem.tagName === "svg", "elem.tagName = " + elem.tagName);
ok(elem.namespaceURI === "test", "elem.namespaceURI = " + elem.namespaceURI);
});
sync_test("query_selector", function() {
document.body.innerHTML = ''
+ '';
var e = document.querySelector("nomatch");
ok(e === null, "e = " + e);
e = document.body.querySelector("nomatch");
ok(e === null, "e = " + e);
e = document.querySelector(".class1");
ok(e.tagName === "DIV", "e.tagName = " + e.tagName);
e = document.body.querySelector(".class1");
ok(e.tagName === "DIV", "e.tagName = " + e.tagName);
ok(e.msMatchesSelector(".class1") === true, "msMatchesSelector returned " + e.msMatchesSelector(".class1"));
ok(e.msMatchesSelector(".class2") === false, "msMatchesSelector returned " + e.msMatchesSelector(".class2"));
e = document.querySelector("a");
ok(e.tagName === "A", "e.tagName = " + e.tagName);
e = document.body.querySelector("a");
ok(e.tagName === "A", "e.tagName = " + e.tagName);
});
sync_test("compare_position", function() {
document.body.innerHTML = '';
var parent = document.body.firstChild;
var child1 = parent.firstChild;
var child2 = child1.nextSibling;
var elem = document.createElement("div");
function compare_position(node1, node2, expected_result, ignore_mask) {
var cmp = node1.compareDocumentPosition(node2);
ok((cmp & ~ignore_mask) == expected_result,
"compareDocumentPosition returned " + cmp + " expected " + expected_result);
}
compare_position(child1, child2, 4);
compare_position(child2, child1, 2);
compare_position(parent, child1, 0x14);
compare_position(parent, child2, 0x14);
compare_position(parent, elem, 0x21, 6);
compare_position(elem, parent, 0x21, 6);
});
sync_test("rects", function() {
document.body.innerHTML = 'test
';
var elem = document.body.firstChild;
var rects = elem.getClientRects();
var rect = elem.getBoundingClientRect();
ok(rects.length === 1, "rect.length = " + rects.length);
ok(rects[0].top === rect.top, "rects[0].top = " + rects[0].top + " rect.top = " + rect.top);
ok(rects[0].bottom === rect.bottom, "rects[0].bottom = " + rects[0].bottom + " rect.bottom = " + rect.bottom);
elem = document.createElement("style");
rects = elem.getClientRects();
ok(rects.length === 0, "rect.length = " + rects.length);
});
sync_test("document_owner", function() {
var node;
ok(document.ownerDocument === null, "ownerDocument = " + document.ownerDocument);
ok(document.body.ownerDocument === document,
"body.ownerDocument = " + document.body.ownerDocument);
ok(document.documentElement.ownerDocument === document,
"documentElement.ownerDocument = " + document.documentElement.ownerDocument);
node = document.createElement("test");
ok(node.ownerDocument === document, "element.ownerDocument = " + node.ownerDocument);
node = document.createDocumentFragment();
ok(node.ownerDocument === document, "fragment.ownerDocument = " + node.ownerDocument);
node = document.createTextNode("test");
ok(node.ownerDocument === document, "text.ownerDocument = " + node.ownerDocument);
});
sync_test("style_properties", function() {
document.body.innerHTML = 'test
';
var elem = document.body.firstChild;
var style = elem.style;
var current_style = elem.currentStyle;
var computed_style = window.getComputedStyle(elem);
var val;
style.cssFloat = "left";
ok(style.cssFloat === "left", "cssFloat = " + style.cssFloat);
ok(style.getPropertyValue("float") === "left",
'style.getPropertyValue("float") = ' + style.getPropertyValue("float"));
ok(style.getPropertyValue("cssFloat") === "",
'style.getPropertyValue("cssFloat") = ' + style.getPropertyValue("cssFloat"));
val = style.removeProperty("float");
ok(val === "left", "removeProperty() returned " + val);
ok(style.cssFloat === "", "cssFloat = " + style.cssFloat);
style.cssFloat = "left";
val = style.removeProperty("FloaT");
ok(val === "left", "removeProperty() returned " + val);
ok(style.cssFloat === "", "cssFloat = " + style.cssFloat);
style.cssFloat = "left";
val = style.removeProperty("cssFloat");
ok(val === "", "removeProperty() returned " + val);
ok(style.cssFloat === "left", "cssFloat = " + style.cssFloat);
ok(style["float"] === "left", "float = " + style["float"]);
style.testVal = "test";
val = style.removeProperty("testVal");
ok(val === "", "removeProperty() returned " + val);
ok(style.testVal === "test", "testVal = " + style.testVal);
style["z-index"] = 1;
ok(style.zIndex === 1, "zIndex = " + style.zIndex);
ok(style["z-index"] === 1, "z-index = " + style["z-index"]);
ok(style.getPropertyValue("z-index") === "1",
'style.getPropertyValue("x-index") = ' + style.getPropertyValue("z-index"));
ok(style.getPropertyValue("zIndex") === "",
'style.getPropertyValue("xIndex") = ' + style.getPropertyValue("zIndex"));
style.setProperty("border-width", "5px");
ok(style.borderWidth === "5px", "style.borderWidth = " + style.borderWidth);
try {
style.setProperty("border-width", 6);
ok(style.borderWidth === "5px", "style.borderWidth = " + style.borderWidth);
}catch(e) {
win_skip("skipping setProperty tests on too old IE version");
return;
}
style.setProperty("border-width", "7px", "test");
ok(style.borderWidth === "5px", "style.borderWidth = " + style.borderWidth);
style.setProperty("border-width", "6px", "");
ok(style.borderWidth === "6px", "style.borderWidth = " + style.borderWidth);
style.setProperty("border-width", "7px", "important");
ok(style.borderWidth === "7px", "style.borderWidth = " + style.borderWidth);
style.setProperty("border-width", "8px", undefined);
ok(style.borderWidth === "7px", "style.borderWidth = " + style.borderWidth);
style.clip = "rect(1px 1px 10px 10px)";
ok(style.clip === "rect(1px, 1px, 10px, 10px)", "style.clip = " + style.clip);
ok(current_style.clip === "rect(1px, 1px, 10px, 10px)",
"current_style.clip = " + current_style.clip);
ok(computed_style.clip === "rect(1px, 1px, 10px, 10px)",
"computed_style.clip = " + current_style.clip);
style.zIndex = 2;
ok(current_style.zIndex === 2, "current_style.zIndex = " + current_style.zIndex);
ok(computed_style.zIndex === 2, "computed_style.zIndex = " + computed_style.zIndex);
try {
current_style.zIndex = 1;
ok(false, "expected exception");
}catch(e) {}
try {
computed_style.zIndex = 1;
ok(false, "expected exception");
}catch(e) {}
elem = elem.nextSibling;
computed_style = window.getComputedStyle(elem);
elem.style.zIndex = 4;
ok(computed_style.zIndex === 4, "computed_style.zIndex = " + computed_style.zIndex);
window.getComputedStyle(elem, null);
});
sync_test("stylesheets", function() {
document.body.innerHTML = '';
var elem = document.body.firstChild;
ok(document.styleSheets.length === 1, "document.styleSheets.length = " + document.styleSheets.length);
var stylesheet = document.styleSheets.item(0);
ok(stylesheet.rules.length === 1, "stylesheet.rules.length = " + stylesheet.rules.length);
ok(typeof(stylesheet.rules.item(0)) === "object",
"typeof(stylesheet.rules.item(0)) = " + typeof(stylesheet.rules.item(0)));
try {
stylesheet.rules.item(1);
ok(false, "expected exception");
}catch(e) {}
ok(stylesheet.href === null, "stylesheet.href = " + stylesheet.href);
var id = stylesheet.insertRule(".input { margin-left: 1px; }", 0);
ok(id === 0, "id = " + id);
ok(document.styleSheets.length === 1, "document.styleSheets.length = " + document.styleSheets.length);
try {
stylesheet.insertRule(".input { margin-left: 1px; }", 3);
ok(false, "expected exception");
}catch(e) {}
});
sync_test("storage", function() {
ok(typeof(window.sessionStorage) === "object",
"typeof(window.sessionStorage) = " + typeof(window.sessionStorage));
ok(typeof(window.localStorage) === "object" || typeof(window.localStorage) === "unknown",
"typeof(window.localStorage) = " + typeof(window.localStorage));
var item = sessionStorage.getItem("nonexisting");
ok(item === null, "item = " + item);
});
async_test("animation", function() {
document.body.innerHTML =
"";
var div = document.createElement("div");
div.addEventListener("animationstart", function() {
div.addEventListener("animationend", next_test);
});
document.body.appendChild(div);
div.className = "testAnimation";
});
sync_test("navigator", function() {
ok(typeof(window.navigator) === "object",
"typeof(window.navigator) = " + typeof(window.navigator));
var v = window.navigator;
ok(v === window.navigator, "v != window.navigator");
v.testProp = true;
ok(window.navigator.testProp, "window.navigator.testProp = " + window.navigator.testProp);
});
sync_test("elem_props", function() {
var elem = document.body;
ok(elem.accessKey === "", "accessKey = " + elem.accessKey);
elem.accessKey = "q";
ok(elem.accessKey === "q", "accessKey = " + elem.accessKey + " expected q");
});
async_test("animation_frame", function() {
var id = requestAnimationFrame(function(x) {
ok(this === window, "this != window");
ok(typeof(x) === "number", "x = " + x);
ok(arguments.length === 1, "arguments.length = " + arguments.length);
next_test();
});
ok(typeof(id) === "number", "id = " + id);
});
sync_test("title", function() {
var elem = document.createElement("div");
ok(elem.title === "", "div.title = " + elem.title);
ok(elem.getAttribute("title") === null, "title attribute = " + elem.getAttribute("title"));
elem.title = "test";
ok(elem.title === "test", "div.title = " + elem.title);
ok(elem.getAttribute("title") === "test", "title attribute = " + elem.getAttribute("title"));
});
sync_test("disabled", function() {
var elem = document.createElement("div");
document.body.appendChild(elem);
ok(elem.disabled === false, "div.disabled = " + elem.disabled);
ok(elem.getAttribute("disabled") === null, "disabled attribute = " + elem.getAttribute("disabled") + " expected null");
elem.disabled = true;
ok(elem.disabled === true, "div.disabled = " + elem.disabled);
ok(elem.getAttribute("disabled") === "", "disabled attribute = " + elem.getAttribute("disabled") + " expected \"\"");
elem.disabled = false;
ok(elem.disabled === false, "div.disabled = " + elem.disabled);
ok(elem.getAttribute("disabled") === null, "disabled attribute = " + elem.getAttribute("disabled") + " expected null");
elem.setAttribute("disabled", "false");
ok(elem.disabled === true, "div.disabled = " + elem.disabled);
ok(elem.getAttribute("disabled") === "false", "disabled attribute = " + elem.getAttribute("disabled"));
elem.removeAttribute("disabled");
ok(elem.disabled === false, "div.disabled = " + elem.disabled);
ok(elem.getAttribute("disabled") === null, "disabled attribute = " + elem.getAttribute("disabled") + " expected null");
});
sync_test("hasAttribute", function() {
document.body.innerHTML = '
';
var elem = document.body.firstChild, r;
r = elem.hasAttribute("attr");
ok(r === true, "hasAttribute(attr) returned " + r);
r = elem.hasAttribute("attr2");
ok(r === false, "hasAttribute(attr2) returned " + r);
elem.setAttribute("attr2", "abc");
r = elem.hasAttribute("attr2");
ok(r === true, "hasAttribute(attr2) returned " + r);
elem.removeAttribute("attr");
r = elem.hasAttribute("attr");
ok(r === false, "hasAttribute(attr) returned " + r);
});
sync_test("classList", function() {
var elem = document.createElement("div");
var classList = elem.classList;
classList.add("a");
ok(elem.className === "a", "Expected className 'a', got " + elem.className);
classList.add("b");
ok(elem.className === "a b", "Expected className 'a b', got " + elem.className);
classList.add("c");
ok(elem.className === "a b c", "Expected className 'a b c', got " + elem.className);
classList.add(4);
ok(elem.className === "a b c 4", "Expected className 'a b c 4', got " + elem.className);
classList.add("c");
ok(elem.className === "a b c 4", "(2) Expected className 'a b c 4', got " + elem.className);
var exception = false
try
{
classList.add();
}
catch(e)
{
exception = true;
}
ok(exception && elem.className === "a b c 4", "Expected exception, className 'a b c 4', got exception "
+ exception + ", className" + elem.className);
exception = false
try
{
classList.add("");
}
catch(e)
{
exception = true;
}
ok(exception, "Expected exception for classList.add(\"\")");
exception = false
try
{
classList.add("e f");
}
catch(e)
{
exception = true;
}
ok(exception, "Expected exception for classList.add(\"e f\")");
classList.remove("e");
ok(elem.className === "a b c 4", "remove: expected className 'a b c 4', got " + elem.className);
exception = false
try
{
classList.remove("e f");
}
catch(e)
{
exception = true;
}
ok(exception, "remove: expected exception for classList.remove(\"e f\")");
exception = false
try
{
classList.remove("");
}
catch(e)
{
exception = true;
}
ok(exception, "remove: expected exception for classList.remove(\"\")");
classList.remove("d");
ok(elem.className === "a b c 4", "remove: expected className 'a b c 4', got " + elem.className);
classList.remove("c");
ok(elem.className === "a b 4", "remove: expected className 'a b 4', got " + elem.className);
classList.remove(4);
ok(elem.className === "a b", "remove: expected className 'a b', got " + elem.className);
classList.remove('a');
ok(elem.className === "b", "remove: expected className 'b', got " + elem.className);
classList.remove("a");
ok(elem.className === "b", "remove (2): expected className 'b', got " + elem.className);
classList.remove("b");
ok(elem.className === "", "remove: expected className '', got " + elem.className);
});