2016-07-05 22:47:56 +02:00
|
|
|
/*
|
|
|
|
* Copyright 2016 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
|
|
|
|
*/
|
|
|
|
|
2017-05-09 17:32:58 +02:00
|
|
|
var compat_version;
|
|
|
|
|
2016-07-07 12:50:18 +02:00
|
|
|
function test_elem_props() {
|
|
|
|
var elem = document.documentElement;
|
|
|
|
|
|
|
|
function test_exposed(prop, expect) {
|
|
|
|
if(expect)
|
|
|
|
ok(prop in elem, prop + " not found in element.");
|
|
|
|
else
|
|
|
|
ok(!(prop in elem), prop + " found in element.");
|
|
|
|
}
|
|
|
|
|
|
|
|
var v = document.documentMode;
|
|
|
|
|
2017-05-09 17:32:33 +02:00
|
|
|
test_exposed("doScroll", v < 11);
|
2016-07-07 12:50:18 +02:00
|
|
|
test_exposed("querySelectorAll", v >= 8);
|
2017-07-19 20:32:55 +02:00
|
|
|
test_exposed("textContent", v >= 9);
|
|
|
|
test_exposed("prefix", v >= 9);
|
2017-07-25 17:57:13 +02:00
|
|
|
test_exposed("firstElementChild", v >= 9);
|
2017-09-13 12:52:40 +02:00
|
|
|
test_exposed("onsubmit", v >= 9);
|
|
|
|
test_exposed("getElementsByClassName", v >= 9);
|
|
|
|
test_exposed("removeAttributeNS", v >= 9);
|
2017-11-01 16:44:02 +01:00
|
|
|
test_exposed("addEventListener", v >= 9);
|
|
|
|
test_exposed("removeEventListener", v >= 9);
|
|
|
|
test_exposed("dispatchEvent", v >= 9);
|
2016-07-07 12:50:18 +02:00
|
|
|
|
|
|
|
next_test();
|
|
|
|
}
|
|
|
|
|
2017-08-21 21:35:57 +02:00
|
|
|
function test_doc_props() {
|
|
|
|
function test_exposed(prop, expect) {
|
|
|
|
if(expect)
|
|
|
|
ok(prop in document, prop + " not found in document.");
|
|
|
|
else
|
|
|
|
ok(!(prop in document), prop + " found in document.");
|
|
|
|
}
|
|
|
|
|
|
|
|
var v = document.documentMode;
|
|
|
|
|
|
|
|
test_exposed("textContent", v >= 9);
|
|
|
|
test_exposed("prefix", v >= 9);
|
2017-09-12 13:15:23 +02:00
|
|
|
test_exposed("defaultView", v >= 9);
|
|
|
|
test_exposed("head", v >= 9);
|
2017-11-01 16:44:02 +01:00
|
|
|
test_exposed("addEventListener", v >= 9);
|
|
|
|
test_exposed("removeEventListener", v >= 9);
|
|
|
|
test_exposed("dispatchEvent", v >= 9);
|
2017-12-04 18:02:11 +01:00
|
|
|
test_exposed("createEvent", v >= 9);
|
2017-09-12 13:15:23 +02:00
|
|
|
|
|
|
|
test_exposed("parentWindow", true);
|
|
|
|
if(v >= 9) ok(document.defaultView === document.parentWindow, "defaultView != parentWindow");
|
2017-08-21 21:35:57 +02:00
|
|
|
|
|
|
|
next_test();
|
|
|
|
}
|
|
|
|
|
2018-05-30 19:49:51 +02:00
|
|
|
function test_docfrag_props() {
|
|
|
|
var docfrag = document.createDocumentFragment();
|
|
|
|
|
|
|
|
function test_exposed(prop, expect) {
|
|
|
|
if(expect)
|
|
|
|
ok(prop in docfrag, prop + " not found in document fragent.");
|
|
|
|
else
|
|
|
|
ok(!(prop in docfrag), prop + " found in document fragent.");
|
|
|
|
}
|
|
|
|
|
|
|
|
var v = document.documentMode;
|
|
|
|
|
|
|
|
test_exposed("compareDocumentPosition", v >= 9);
|
|
|
|
|
|
|
|
next_test();
|
|
|
|
}
|
|
|
|
|
2017-11-01 16:44:02 +01:00
|
|
|
function test_window_props() {
|
|
|
|
function test_exposed(prop, expect) {
|
|
|
|
if(expect)
|
|
|
|
ok(prop in window, prop + " not found in window.");
|
|
|
|
else
|
|
|
|
ok(!(prop in window), prop + " found in window.");
|
|
|
|
}
|
|
|
|
|
|
|
|
var v = document.documentMode;
|
|
|
|
|
2018-04-11 19:36:25 +02:00
|
|
|
test_exposed("postMessage", true);
|
2019-03-26 17:27:16 +01:00
|
|
|
test_exposed("sessionStorage", true);
|
|
|
|
test_exposed("localStorage", true);
|
2017-11-01 16:44:02 +01:00
|
|
|
test_exposed("addEventListener", v >= 9);
|
|
|
|
test_exposed("removeEventListener", v >= 9);
|
|
|
|
test_exposed("dispatchEvent", v >= 9);
|
2018-05-18 13:53:54 +02:00
|
|
|
test_exposed("getSelection", v >= 9);
|
|
|
|
test_exposed("onfocusout", v >= 9);
|
2019-03-27 18:52:27 +01:00
|
|
|
test_exposed("getComputedStyle", v >= 9);
|
2018-07-11 21:38:05 +02:00
|
|
|
if(v >= 9) /* FIXME: native exposes it in all compat modes */
|
|
|
|
test_exposed("performance", true);
|
2017-11-01 16:44:02 +01:00
|
|
|
|
|
|
|
next_test();
|
|
|
|
}
|
|
|
|
|
|
|
|
function test_xhr_props() {
|
|
|
|
var xhr = new XMLHttpRequest();
|
|
|
|
|
|
|
|
function test_exposed(prop, expect) {
|
|
|
|
if(expect)
|
|
|
|
ok(prop in xhr, prop + " not found in XMLHttpRequest.");
|
|
|
|
else
|
|
|
|
ok(!(prop in xhr), prop + " found in XMLHttpRequest.");
|
|
|
|
}
|
|
|
|
|
|
|
|
var v = document.documentMode;
|
|
|
|
|
|
|
|
test_exposed("addEventListener", v >= 9);
|
|
|
|
test_exposed("removeEventListener", v >= 9);
|
|
|
|
test_exposed("dispatchEvent", v >= 9);
|
|
|
|
|
|
|
|
next_test();
|
|
|
|
}
|
|
|
|
|
2018-09-12 21:15:53 +02:00
|
|
|
function test_style_props() {
|
|
|
|
var style = document.body.style;
|
|
|
|
|
|
|
|
function test_exposed(prop, expect) {
|
|
|
|
if(expect)
|
|
|
|
ok(prop in style, prop + " not found in style object.");
|
|
|
|
else
|
|
|
|
ok(!(prop in style), prop + " found in style object.");
|
|
|
|
}
|
|
|
|
|
|
|
|
var v = document.documentMode;
|
|
|
|
|
|
|
|
test_exposed("removeAttribute", true);
|
|
|
|
test_exposed("zIndex", true);
|
|
|
|
test_exposed("z-index", true);
|
|
|
|
test_exposed("filter", true);
|
|
|
|
test_exposed("pixelTop", true);
|
|
|
|
test_exposed("float", true);
|
|
|
|
test_exposed("css-float", false);
|
|
|
|
test_exposed("style-float", false);
|
|
|
|
test_exposed("setProperty", v >= 9);
|
|
|
|
test_exposed("removeProperty", v >= 9);
|
2018-09-12 21:16:04 +02:00
|
|
|
test_exposed("background-clip", v >= 9);
|
2018-09-12 21:15:53 +02:00
|
|
|
|
2019-03-26 17:27:16 +01:00
|
|
|
style = document.body.currentStyle;
|
|
|
|
|
|
|
|
test_exposed("zIndex", true);
|
|
|
|
test_exposed("z-index", true);
|
|
|
|
test_exposed("filter", true);
|
|
|
|
test_exposed("pixelTop", false);
|
|
|
|
test_exposed("float", true);
|
|
|
|
test_exposed("css-float", false);
|
|
|
|
test_exposed("style-float", false);
|
|
|
|
test_exposed("setProperty", v >= 9);
|
|
|
|
test_exposed("removeProperty", v >= 9);
|
|
|
|
test_exposed("background-clip", v >= 9);
|
|
|
|
|
2019-03-27 18:52:27 +01:00
|
|
|
if(window.getComputedStyle) {
|
|
|
|
style = window.getComputedStyle(document.body);
|
|
|
|
|
|
|
|
test_exposed("removeAttribute", false);
|
|
|
|
test_exposed("zIndex", true);
|
|
|
|
test_exposed("z-index", true);
|
|
|
|
test_exposed("pixelTop", false);
|
|
|
|
test_exposed("float", true);
|
|
|
|
test_exposed("css-float", false);
|
|
|
|
test_exposed("style-float", false);
|
|
|
|
test_exposed("setProperty", v >= 9);
|
|
|
|
test_exposed("removeProperty", v >= 9);
|
|
|
|
test_exposed("background-clip", v >= 9);
|
|
|
|
}
|
|
|
|
|
2018-09-12 21:15:53 +02:00
|
|
|
next_test();
|
|
|
|
}
|
|
|
|
|
2018-03-01 19:18:10 +01:00
|
|
|
function test_javascript() {
|
|
|
|
var g = window;
|
|
|
|
|
|
|
|
function test_exposed(func, obj, expect) {
|
|
|
|
if(expect)
|
|
|
|
ok(func in obj, func + " not found in " + obj);
|
|
|
|
else
|
|
|
|
ok(!(func in obj), func + " found in " + obj);
|
|
|
|
}
|
|
|
|
|
2018-04-04 21:43:19 +02:00
|
|
|
function test_parses(code, expect) {
|
|
|
|
var success;
|
|
|
|
try {
|
|
|
|
eval(code);
|
|
|
|
success = true;
|
|
|
|
}catch(e) {
|
|
|
|
success = false;
|
|
|
|
}
|
|
|
|
if(expect)
|
|
|
|
ok(success === true, code + " did not parse");
|
|
|
|
else
|
|
|
|
ok(success === false, code + " parsed");
|
|
|
|
}
|
|
|
|
|
2018-03-01 19:18:10 +01:00
|
|
|
var v = document.documentMode;
|
|
|
|
|
|
|
|
test_exposed("ScriptEngineMajorVersion", g, true);
|
|
|
|
|
|
|
|
test_exposed("JSON", g, v >= 8);
|
2018-03-01 19:18:49 +01:00
|
|
|
test_exposed("now", Date, true);
|
2018-04-11 19:36:25 +02:00
|
|
|
test_exposed("toISOString", Date.prototype, v >= 9);
|
2018-03-01 19:19:01 +01:00
|
|
|
test_exposed("isArray", Array, v >= 9);
|
2018-12-05 20:42:27 +01:00
|
|
|
test_exposed("forEach", Array.prototype, v >= 9);
|
2018-03-01 23:58:55 +01:00
|
|
|
test_exposed("indexOf", Array.prototype, v >= 9);
|
2018-05-25 15:31:44 +02:00
|
|
|
test_exposed("trim", String.prototype, v >= 9);
|
2019-03-14 14:30:57 +01:00
|
|
|
test_exposed("map", Array.prototype, v >= 9);
|
2018-05-25 15:31:44 +02:00
|
|
|
|
2018-05-10 19:19:56 +02:00
|
|
|
/* FIXME: IE8 implements weird semi-functional property descriptors. */
|
|
|
|
if(v != 8) {
|
|
|
|
test_exposed("getOwnPropertyDescriptor", Object, v >= 8);
|
2018-05-11 14:43:20 +02:00
|
|
|
test_exposed("defineProperty", Object, v >= 8);
|
2018-05-14 13:34:13 +02:00
|
|
|
test_exposed("defineProperties", Object, v >= 8);
|
2018-05-10 19:19:56 +02:00
|
|
|
}
|
2018-03-01 19:18:10 +01:00
|
|
|
|
2019-03-11 14:39:27 +01:00
|
|
|
test_exposed("getPrototypeOf", Object, v >= 9);
|
|
|
|
|
2018-04-04 21:43:19 +02:00
|
|
|
test_parses("if(false) { o.default; }", v >= 9);
|
|
|
|
test_parses("if(false) { o.with; }", v >= 9);
|
|
|
|
test_parses("if(false) { o.if; }", v >= 9);
|
|
|
|
|
2018-03-01 19:18:10 +01:00
|
|
|
next_test();
|
|
|
|
}
|
|
|
|
|
2017-08-24 12:29:17 +02:00
|
|
|
function test_elem_by_id() {
|
|
|
|
document.body.innerHTML = '<form id="testid" name="testname"></form>';
|
|
|
|
|
|
|
|
var id_elem = document.getElementById("testid");
|
|
|
|
ok(id_elem.tagName === "FORM", "id_elem.tagName = " + id_elem.tagName);
|
|
|
|
|
|
|
|
var name_elem = document.getElementById("testname");
|
|
|
|
if(document.documentMode < 8)
|
|
|
|
ok(id_elem === name_elem, "id_elem != id_elem");
|
|
|
|
else
|
|
|
|
ok(name_elem === null, "name_elem != null");
|
|
|
|
|
|
|
|
next_test();
|
|
|
|
}
|
|
|
|
|
2016-07-05 22:47:56 +02:00
|
|
|
function test_doc_mode() {
|
2017-05-09 17:32:58 +02:00
|
|
|
compat_version = parseInt(document.location.search.substring(1));
|
2016-07-05 22:47:56 +02:00
|
|
|
|
2017-05-09 17:32:58 +02:00
|
|
|
trace("Testing compatibility mode " + compat_version);
|
2016-07-05 22:47:56 +02:00
|
|
|
|
2017-05-09 17:32:58 +02:00
|
|
|
if(compat_version > 6 && compat_version > document.documentMode) {
|
|
|
|
win_skip("Document mode not supported (expected " + compat_version + " got " + document.documentMode + ")");
|
2016-07-05 22:47:56 +02:00
|
|
|
reportSuccess();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2017-05-09 17:32:58 +02:00
|
|
|
ok(Math.max(compat_version, 5) === document.documentMode, "documentMode = " + document.documentMode);
|
2016-07-05 22:47:56 +02:00
|
|
|
|
2016-07-05 22:48:04 +02:00
|
|
|
if(document.documentMode > 5)
|
|
|
|
ok(document.compatMode === "CSS1Compat", "document.compatMode = " + document.compatMode);
|
|
|
|
else
|
|
|
|
ok(document.compatMode === "BackCompat", "document.compatMode = " + document.compatMode);
|
|
|
|
|
2016-07-05 22:47:56 +02:00
|
|
|
next_test();
|
|
|
|
}
|
|
|
|
|
2017-09-29 17:14:36 +02:00
|
|
|
function test_iframe_doc_mode() {
|
|
|
|
var iframe = document.createElement("iframe");
|
|
|
|
|
|
|
|
iframe.onload = function() {
|
|
|
|
var iframe_mode = iframe.contentWindow.document.documentMode;
|
|
|
|
if(document.documentMode < 9)
|
|
|
|
ok(iframe_mode === 5, "iframe_mode = " + iframe_mode);
|
|
|
|
else
|
|
|
|
ok(iframe_mode === document.documentMode, "iframe_mode = " + iframe_mode);
|
|
|
|
next_test();
|
|
|
|
}
|
|
|
|
|
|
|
|
iframe.src = "about:blank";
|
|
|
|
document.body.appendChild(iframe);
|
|
|
|
}
|
|
|
|
|
2017-05-09 17:32:58 +02:00
|
|
|
function test_conditional_comments() {
|
|
|
|
var div = document.createElement("div");
|
|
|
|
document.body.appendChild(div);
|
|
|
|
|
|
|
|
function test_version(v) {
|
|
|
|
var version = compat_version ? compat_version : 7;
|
|
|
|
|
|
|
|
div.innerHTML = "<!--[if lte IE " + v + "]>true<![endif]-->";
|
|
|
|
ok(div.innerText === (version <= v ? "true" : ""),
|
|
|
|
"div.innerText = " + div.innerText + " for version (<=) " + v);
|
|
|
|
|
|
|
|
div.innerHTML = "<!--[if lt IE " + v + "]>true<![endif]-->";
|
|
|
|
ok(div.innerText === (version < v ? "true" : ""),
|
|
|
|
"div.innerText = " + div.innerText + " for version (<) " + v);
|
|
|
|
|
|
|
|
div.innerHTML = "<!--[if gte IE " + v + "]>true<![endif]-->";
|
2018-02-22 19:48:03 +01:00
|
|
|
ok(div.innerText === (version >= v && version < 10 ? "true" : ""),
|
2017-05-09 17:32:58 +02:00
|
|
|
"div.innerText = " + div.innerText + " for version (>=) " + v);
|
|
|
|
|
|
|
|
div.innerHTML = "<!--[if gt IE " + v + "]>true<![endif]-->";
|
2018-02-22 19:48:03 +01:00
|
|
|
ok(div.innerText === (version > v && version < 10 ? "true" : ""),
|
2017-05-09 17:32:58 +02:00
|
|
|
"div.innerText = " + div.innerText + " for version (>) " + v);
|
|
|
|
}
|
|
|
|
|
|
|
|
test_version(5);
|
|
|
|
test_version(6);
|
|
|
|
test_version(7);
|
|
|
|
test_version(8);
|
|
|
|
|
|
|
|
next_test();
|
|
|
|
}
|
|
|
|
|
2016-07-05 22:47:56 +02:00
|
|
|
var tests = [
|
2016-07-07 12:50:18 +02:00
|
|
|
test_doc_mode,
|
2017-09-29 17:14:36 +02:00
|
|
|
test_iframe_doc_mode,
|
2017-05-09 17:32:58 +02:00
|
|
|
test_elem_props,
|
2017-08-21 21:35:57 +02:00
|
|
|
test_doc_props,
|
2018-05-30 19:49:51 +02:00
|
|
|
test_docfrag_props,
|
2017-11-01 16:44:02 +01:00
|
|
|
test_window_props,
|
2018-03-01 19:18:10 +01:00
|
|
|
test_javascript,
|
2017-11-01 16:44:02 +01:00
|
|
|
test_xhr_props,
|
2018-09-12 21:15:53 +02:00
|
|
|
test_style_props,
|
2017-08-24 12:29:17 +02:00
|
|
|
test_elem_by_id,
|
2017-05-09 17:32:58 +02:00
|
|
|
test_conditional_comments
|
2016-07-05 22:47:56 +02:00
|
|
|
];
|