2020/functional/domelementTest.js (236 lines of code) (raw):

/** * @license * Copyright 2018 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ 'use strict'; /** * HTML DOM Element Test Suite. * @class */ var DomelementTest = function () { var testVersion = 'Current Editor\'s Draft'; var tests = []; var info = 'Spec Version: ' + testVersion + ' | Default Timeout: ' + TestBase.timeout + 'ms'; var fields = ['passes', 'failures', 'timeouts']; var createElementTest = function ( testId, name, category = 'Element', mandatory = true, title = '', passingCriteria = 'HTML element created is not HTMLUnknownElement', instruction = '' ) { var t = createTest(name, category, mandatory, testId, "HTML DOM Element Tests", title, passingCriteria, instruction); t.prototype.index = tests.length; tests.push(t); return t; }; var createTemplateElementTest = function ( testId, name, category, title, evaluate, mandatory, passingCriteria, instruction) { var test = createElementTest(testId, name, category, mandatory, title, passingCriteria, instruction); test.prototype.start = function () { try { if (evaluate()) { this.runner.succeed(); } else { throw name + 'failed'; } } catch (e) { this.runner.fail(e); } } }; var createCommonElementTest = function ( testId, name, value, mandatory = true, evaluate = function () { return !( document.createElement(value) instanceof window.HTMLUnknownElement); }, title = 'Test ' + name + ' by create ' + value + ' Element.', passingCriteria = '', instruction = '') { createTemplateElementTest(testId, name + ' Element', 'Element', title, evaluate, mandatory, passingCriteria, instruction); }; createCommonElementTest('16.1.1.1', 'Unknown', null, true, function () { return document.createElement('UNKNOWN') instanceof window.HTMLUnknownElement; }, 'Test creating unknown element.'); createCommonElementTest('16.1.2.1', 'Anchor', 'a'); createCommonElementTest('16.1.3.1', 'Audio', 'audio', false, function () { return document.createElement('audio') != '[object HTMLUnknownElement]' && Modernizr.audio; }, 'Test creation of audio element by Modernizr.'); createCommonElementTest('16.1.4.1', 'Area', 'area', false); createCommonElementTest('16.1.5.1', 'Base', 'base', false); createCommonElementTest('16.1.6.1', 'BaseFont', 'basefont', false); createCommonElementTest('16.1.7.1', 'Blockquote', 'blockquote', false); createCommonElementTest('16.1.8.1', 'Body', 'body'); createCommonElementTest('16.1.9.1', 'BR', 'br'); createCommonElementTest('16.1.10.1', 'Button', 'button', false); createCommonElementTest('16.1.12.1', 'Deleted', 'del', false); createCommonElementTest('16.1.13.1', 'Directory', 'dir', false); createCommonElementTest('16.1.14.1', 'Div', 'div'); createCommonElementTest('16.1.15.1', 'DList', 'dl', false); createCommonElementTest('16.1.16.1', 'FieldSet', 'fieldset', false); createCommonElementTest('16.1.17.1', 'Font', 'font', false); createCommonElementTest('16.1.18.1', 'Form', 'form', false); createCommonElementTest('16.1.19.1', 'Frame', 'frame', false); createCommonElementTest('16.1.20.1', 'FrameSet', 'frameset', false); createCommonElementTest('16.1.21.1', 'Head', 'head'); createCommonElementTest('16.1.22.1', 'Heading 1', 'h1'); createCommonElementTest('16.1.23.1', 'Heading 2', 'h2'); createCommonElementTest('16.1.24.1', 'Heading 3', 'h3'); createCommonElementTest('16.1.25.1', 'HR', 'hr', false); createCommonElementTest('16.1.26.1', 'HTML', 'html'); createCommonElementTest('16.1.27.1', 'HTMLCollection', 'src', false); createCommonElementTest('16.1.28.1', 'Iframe', 'iframe', false); createCommonElementTest('16.1.29.1', 'Image', 'img', false); createCommonElementTest('16.1.30.1', 'Input', 'input', false); createCommonElementTest('16.1.31.1', 'Inserted', 'ins', false); createCommonElementTest('16.1.32.1', 'Label', 'label', false); createCommonElementTest('16.1.33.1', 'Legend', 'legend', false); createCommonElementTest('16.1.34.1', 'Link', 'link'); createCommonElementTest('16.1.35.1', 'List', 'li', false); createCommonElementTest('16.1.36.1', 'Map', 'map', false); createCommonElementTest('16.1.37.1', 'Menu', 'menu', false); createCommonElementTest('16.1.38.1', 'Meta', 'meta'); createCommonElementTest('16.1.39.1', 'Obejct', 'object', false); createCommonElementTest('16.1.40.1', 'Olist', 'ol', false); createCommonElementTest('16.1.41.1', 'OptGroup', 'optgroup', false); createCommonElementTest('16.1.42.1', 'Option', 'option', false); createCommonElementTest('16.1.43.1', 'Paragraph', 'p'); createCommonElementTest('16.1.44.1', 'Param', 'param', false); createCommonElementTest('16.1.45.1', 'Pre', 'pre', false); createCommonElementTest('16.1.46.1', 'Quote', 'q', false); createCommonElementTest('16.1.47.1', 'Script', 'script'); createCommonElementTest('16.1.48.1', 'Select', 'select', false); createCommonElementTest('16.1.49.1', 'Span', 'span'); createCommonElementTest('16.1.50.1', 'Style', 'style'); createCommonElementTest('16.1.51.1', 'Table Body', 'tbody', false); createCommonElementTest('16.1.52.1', 'Table', 'table', false); createCommonElementTest('16.1.53.1', 'Table Foot', 'tfoot', false); createCommonElementTest('16.1.54.1', 'Table Head', 'thead', false); createCommonElementTest('16.1.55.1', 'TableCol', 'col', false); createCommonElementTest('16.1.56.1', 'TableDataCell', 'td', false); createCommonElementTest('16.1.57.1', 'TableHeadCell', 'th', false); createCommonElementTest('16.1.59.1', 'TableRow', 'tr', false); createCommonElementTest('16.1.60.1', 'TextArea', 'textarea', false); createCommonElementTest('16.1.61.1', 'Title', 'title'); createCommonElementTest('16.1.62.1', 'UList', 'ul', false); createCommonElementTest('16.1.63.1', 'Video', 'video'); /** * Validate videoElement fields is correctly handled. */ var createVideoFieldTest = function ( testId, name, evaluate, mandatory = true, passingCriteria = 'VideoElement fields is correctly handled', instruction = '') { var setupVideoElement = function () { var videoElement = document.createElement('video'); if (!(videoElement instanceof window.HTMLUnknownElement)) { return evaluate(videoElement); } else { return false; } }; var title = 'Test video.' + name + ' by create video Element.'; createTemplateElementTest(testId, 'video.' + name, 'Video', title, setupVideoElement, mandatory, passingCriteria, instruction); }; createVideoFieldTest('16.2.1.1', 'height', function (videoElement) { if (videoElement.height == 0) { videoElement.height = 1080; if (videoElement.height == 1080) { return true; } } return false; }); createVideoFieldTest('16.2.2.1', 'width', function (videoElement) { if (videoElement.width == 0) { videoElement.width = 1920; if (videoElement.width == 1920) { return true; } } return false; }); createVideoFieldTest('16.2.3.1', 'videoHeight', function (videoElement) { if (videoElement.videoHeight == 0) { try { // read only videoElement.videoHeight = 1080; } catch (e) { return videoElement.videoHeight != 1080; } } return false; }); createVideoFieldTest('16.2.4.1', 'videoWidth', function (videoElement) { if (videoElement.videoWidth == 0) { try { // read only videoElement.videoWidth = 1920; } catch (e) { return videoElement.videoWidth != 1920; } } return false; }); createVideoFieldTest('16.2.5.1', 'poster', function (videoElement) { return videoElement.poster == ''; }, false); /** * Setup element attributes for testing. */ var setupAttrElement = function () { var attrElement = document.createElement('div'); attrElement.className = 'attr-class'; attrElement.id = 'attr-test'; document.getElementById('testArea').appendChild(attrElement); console.log('setup'); }; /** * Teardown element attributes for testing. */ var tearDownAttrElement = function () { var attrElement = document.getElementById('attr-test'); attrElement.parentNode.removeChild(attrElement); console.log('teardown'); }; /** * Ensure element.attributes behave as expected. */ var createAttrFieldTest = function (testId, name, evaluate, mandatory = true, passingCriteria = 'Ensure element.attributes behave as expected', instruction = '') { var title = 'Test Attr.' + name + '.'; var test = createElementTest(testId, 'Attr.' + name, 'Attribute', mandatory, passingCriteria, instruction); test.prototype.start = function () { try { setupAttrElement() var attrElement = document.getElementById('attr-test'); if (evaluate(attrElement)) { this.runner.succeed(); } else { throw name + 'failed'; } } catch (e) { this.runner.fail(e); } finally { tearDownAttrElement(); } } }; createAttrFieldTest('16.3.1.1', 'name', function (attrElement) { return attrElement.attributes.getNamedItem('id').name == 'id'; }); createAttrFieldTest('16.3.2.1', 'owner', function (attrElement) { return attrElement.attributes.getNamedItem('id').ownerElement == attrElement; }, false); createAttrFieldTest('16.3.3.1', 'specified', function (attrElement) { return attrElement.attributes.getNamedItem('id').specified; }, false); createAttrFieldTest('16.3.4.1', 'value', function (attrElement) { return attrElement.attributes.getNamedItem('class').value == 'attr-class'; }); return {tests: tests, info: info, fields: fields, viewType: 'default'}; }; try { exports.getTest = DomelementTest; } catch (e) { // do nothing, this function is not supposed to work for browser, but it's for // Node js to generate json file instead. }