summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/html/resources/common.js
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/html/resources/common.js')
-rw-r--r--testing/web-platform/tests/html/resources/common.js201
1 files changed, 201 insertions, 0 deletions
diff --git a/testing/web-platform/tests/html/resources/common.js b/testing/web-platform/tests/html/resources/common.js
new file mode 100644
index 0000000000..4f9ec54dde
--- /dev/null
+++ b/testing/web-platform/tests/html/resources/common.js
@@ -0,0 +1,201 @@
+"use strict";
+
+const HTML5_ELEMENTS = [
+ 'a', 'abbr', 'address', 'area', 'article', 'aside',
+ 'audio', 'b', 'base', 'bdi', 'bdo', 'blockquote',
+ 'body', 'br', 'button', 'canvas', 'caption', 'cite',
+ 'code', 'col', 'colgroup', 'data', 'datalist', 'dd',
+ 'del', 'details', 'dfn', 'dialog', 'div', 'dl',
+ 'dt', 'em', 'embed', 'fieldset', 'figcaption', 'figure',
+ 'footer', 'form', 'h1', 'h2', 'h3', 'h4',
+ 'h5', 'h6', 'head', 'header', 'hr', 'html',
+ 'i', 'iframe', 'img', 'input', 'ins', 'kbd',
+ 'label', 'legend', 'li', 'link', 'main', 'map',
+ 'mark', 'menu', 'meta', 'meter', 'nav', 'noscript',
+ 'object', 'ol', 'optgroup', 'option', 'output', 'p',
+ 'param', 'pre', 'progress', 'q', 'rp', 'rt',
+ 'ruby', 's', 'samp', 'script', 'section', 'select',
+ 'slot', 'small', 'source', 'span', 'strong', 'style',
+ 'sub', 'sup', 'summary', 'table', 'tbody', 'td',
+ 'template', 'textarea', 'tfoot', 'th', 'thead', 'time',
+ 'title', 'tr', 'track', 'u', 'ul', 'var',
+ 'video', 'wbr'
+];
+
+// only void (without end tag) HTML5 elements
+var HTML5_VOID_ELEMENTS = [
+ 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta',
+ 'param', 'source', 'track', 'wbr'
+];
+
+// https://html.spec.whatwg.org/multipage/multipage/forms.html#form-associated-element
+var HTML5_FORM_ASSOCIATED_ELEMENTS = [ 'button', 'fieldset', 'input',
+ 'object', 'output', 'select', 'textarea' ];
+
+const HTML5_SHADOW_ALLOWED_ELEMENTS = [
+ 'article', 'aside', 'blockquote', 'body', 'div', 'footer', 'h1', 'h2', 'h3',
+ 'h4', 'h5', 'h6', 'header', 'main', 'nav', 'p', 'section', 'span'
+];
+
+const HTML5_SHADOW_DISALLOWED_ELEMENTS =
+ HTML5_ELEMENTS.filter(el => !HTML5_SHADOW_ALLOWED_ELEMENTS.includes(el));
+
+// These are *deprecated/removed* HTML5 element names.
+const HTML5_DEPRECATED_ELEMENTS = [
+ 'acronym', 'applet', 'basefont', 'bgsound', 'big', 'blink',
+ 'center', 'command', 'content', 'dir', 'font', 'frame',
+ 'frameset', 'hgroup', 'image', 'isindex', 'keygen', 'marquee',
+ 'menuitem', 'nobr', 'noembed', 'noframes', 'plaintext', 'rb',
+ 'rtc', 'shadow', 'spacer', 'strike', 'tt', 'xmp'
+];
+
+function newDocument() {
+ var d = document.implementation.createDocument();
+ return d;
+}
+
+function newHTMLDocument() {
+ var d = document.implementation.createHTMLDocument('Test Document');
+ return d;
+}
+
+function newXHTMLDocument() {
+ var doctype = document.implementation.createDocumentType('html',
+ '-//W3C//DTD XHTML 1.0 Transitional//EN',
+ 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd');
+
+ var d = document.implementation.createDocument(
+ 'http://www.w3.org/1999/xhtml', 'html', doctype);
+ return d;
+}
+
+function newIFrame(context, src) {
+ if (typeof (context) === 'undefined'
+ || typeof (context.iframes) !== 'object') {
+ assert_unreached('Illegal context object in newIFrame');
+ }
+
+ var iframe = document.createElement('iframe');
+
+ if (typeof (src) != 'undefined') {
+ iframe.src = src;
+ }
+ document.body.appendChild(iframe);
+ context.iframes.push(iframe);
+
+ assert_true(typeof (iframe.contentWindow) != 'undefined'
+ && typeof (iframe.contentWindow.document) != 'undefined'
+ && iframe.contentWindow.document != document,
+ 'Failed to create new rendered document');
+ return iframe;
+}
+
+function newRenderedHTMLDocument(context) {
+ var frame = newIFrame(context);
+ var d = frame.contentWindow.document;
+ return d;
+}
+
+function newContext() {
+ return {
+ iframes : []
+ };
+}
+
+function cleanContext(context) {
+ context.iframes.forEach(function(e) {
+ e.parentNode.removeChild(e);
+ });
+}
+
+// run given test function in context
+// the context is cleaned up after test completes.
+function inContext(f) {
+ return function() {
+ var context = newContext();
+ try {
+ f(context);
+ } finally {
+ cleanContext(context);
+ }
+ };
+}
+
+// new context and iframe are created and url (if supplied) is asigned to
+// iframe.src
+// function f is bound to the iframe onload event or executed directly after
+// iframe creation
+// the context is passed to function as argument
+function testInIFrame(url, f, testName, testProps) {
+ if (url) {
+ var t = async_test(testName);
+ t.step(function() {
+ var context = newContext();
+ var iframe = newIFrame(context, url);
+ iframe.onload = t.step_func(function() {
+ try {
+ f(context);
+ t.done();
+ } finally {
+ cleanContext(context);
+ }
+ });
+ });
+ } else {
+ test(inContext(function(context) {
+ newRenderedHTMLDocument(context);
+ f(context);
+ }), testName);
+ }
+}
+
+function assert_nodelist_contents_equal_noorder(actual, expected, message) {
+ assert_equals(actual.length, expected.length, message);
+ var used = [];
+ for ( var i = 0; i < expected.length; i++) {
+ used.push(false);
+ }
+ for (i = 0; i < expected.length; i++) {
+ var found = false;
+ for ( var j = 0; j < actual.length; j++) {
+ if (used[j] == false && expected[i] == actual[j]) {
+ used[j] = true;
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ assert_unreached(message + ". Fail reason: element not found: "
+ + expected[i]);
+ }
+ }
+}
+
+function isVoidElement(elementName) {
+ return HTML5_VOID_ELEMENTS.indexOf(elementName) >= 0;
+}
+
+function checkTemplateContent(d, obj, html, id, nodeName) {
+
+ obj.innerHTML = '<template id="tmpl">' + html + '</template>';
+
+ var t = d.querySelector('#tmpl');
+
+ if (id != null) {
+ assert_equals(t.content.childNodes.length, 1, 'Element ' + nodeName
+ + ' should present among template nodes');
+ assert_equals(t.content.firstChild.id, id, 'Wrong element ID');
+ }
+ if (nodeName != null) {
+ assert_equals(t.content.firstChild.nodeName, nodeName.toUpperCase(),
+ 'Wrong node name');
+ }
+}
+
+function checkBodyTemplateContent(d, html, id, nodeName) {
+ checkTemplateContent(d, d.body, html, id, nodeName);
+}
+
+function checkHeadTemplateContent(d, html, id, nodeName) {
+ checkTemplateContent(d, d.head, html, id, nodeName);
+}