2020/functional/domMiscTest.js (245 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'; var DommiscTest = function() { /** * DOM Miscellaneous Test Suite. * @class */ var domVersion = 'Current Editor\'s Draft'; var tests = []; var info = 'Spec Version: ' + domVersion + ' | Default Timeout: ' + TestBase.timeout + 'ms'; var fields = ['passes', 'failures', 'timeouts']; var createDomTest = function(testId, name, category = 'DOM Misc', mandatory = true) { var t = createTest(name, category, mandatory, testId, 'DOM chardata, window & Miscellaneous Tests'); t.prototype.index = tests.length; tests.push(t); return t; }; /** * Validate the existence of value in element. */ var isValueInElement = function(value, name, element, runner) { try { if (Modernizr.prefixed(value, element, false) != false) runner.succeed(); else throw 'Failed: ' + name + ': ' + Modernizr.prefixed(value, document.implementation, false); } catch (e) { runner.fail(e); } }; /** * Ensure the DOM methods are correctly supported through Modernizr. */ var createCommonDomTest = function(testId, value, category, element, mandatory) { var name = category.replace(/\s/g, '') + '.' + value; var test = createDomTest(testId, name, category, mandatory); test.prototype.title = 'Test DOM Implementation of ' + name; test.prototype.start = function() { isValueInElement(value, name, element, this.runner); }; }; // Category: CharacterData. var createCharDataTest = function(testId, value, mandatory) { createCommonDomTest( testId, value, 'CharacterData', document.createTextNode('Test'), mandatory); }; createCharDataTest('19.1.1.1', 'appendData', false); createCharDataTest('19.1.2.1', 'data'); createCharDataTest('19.1.3.1', 'deleteData', false); createCharDataTest('19.1.4.1', 'insertData', false); createCharDataTest('19.1.5.1', 'length', false); createCharDataTest('19.1.6.1', 'replaceData', false); createCharDataTest('19.1.7.1', 'substringData', false); // Category: NamedNodeMap. var createNameNodeMapTest = function(testId, value, mandatory) { createCommonDomTest( testId, value, 'NamedNodeMap', document.documentElement.attributes, mandatory); }; createNameNodeMapTest('19.2.1.1', 'getNamedItem'); createNameNodeMapTest('19.2.2.1', 'getNamedItemNS', false); createNameNodeMapTest('19.2.3.1', 'item'); createNameNodeMapTest('19.2.4.1', 'length'); createNameNodeMapTest('19.2.5.1', 'removeNamedItem', false); createNameNodeMapTest('19.2.6.1', 'removeNamedItemNS', false); createNameNodeMapTest('19.2.7.1', 'setNamedItem', false); createNameNodeMapTest('19.2.8.1', 'setNamedItemNS', false); // Category: Node. var createNodeTest = function(testId, value, mandatory) { createCommonDomTest(testId, value, 'Node', document.body, mandatory); }; createNodeTest('19.3.1.1', 'appendChild'); createNodeTest('19.3.2.1', 'attributes'); createNodeTest('19.3.3.1', 'childNodes'); createNodeTest('19.3.4.1', 'cloneNode'); createNodeTest('19.3.5.1', 'firstChild'); createNodeTest('19.3.6.1', 'hasAttributes', false); createNodeTest('19.3.7.1', 'hasChildNodes'); createNodeTest('19.3.8.1', 'insertBefore'); createNodeTest('19.3.9.1', 'lastChild'); createNodeTest('19.3.10.1', 'nextSibling'); createNodeTest('19.3.11.1', 'nodeName'); createNodeTest('19.3.12.1', 'nodeType'); createNodeTest('19.3.13.1', 'nodeValue'); createNodeTest('19.3.14.1', 'normalize', false); createNodeTest('19.3.15.1', 'ownerDocument'); createNodeTest('19.3.16.1', 'parentNode'); createNodeTest('19.3.17.1', 'previousSibling'); createNodeTest('19.3.18.1', 'removeChild'); createNodeTest('19.3.19.1', 'replaceChild'); createCommonDomTest('19.3.20.1', 'getElementById', 'Node', document, false); createCommonDomTest('19.3.21.1', 'localName', 'Node', document.documentElement, false); createCommonDomTest('19.3.22.1', 'namespaceURI', 'Node', document.documentElement, false); createCommonDomTest('19.3.23.1', 'prefix', 'Node', document.documentElement, false); // Category: Rect. var createRectTest = function(testId, value) { createCommonDomTest(testId, value, 'Rect', window.getComputedStyle.getRectValue); }; createRectTest('19.4.1.1', 'bottom'); createRectTest('19.4.2.1', 'left'); createRectTest('19.4.3.1', 'right'); createRectTest('19.4.4.1', 'top'); // Category: window. var createWindowTest = function(testId, value) { createCommonDomTest(testId, value, 'window', window); }; createWindowTest('19.5.1.1', 'addEventListener'); createWindowTest('19.5.2.1', 'clearInterval'); createWindowTest('19.5.3.1', 'clearTimeout'); createWindowTest('19.5.4.1', 'location'); createWindowTest('19.5.5.1', 'navigator'); createWindowTest('19.5.6.1', 'close'); createWindowTest('19.5.7.1', 'removeEventListener'); createWindowTest('19.5.8.1', 'setInterval'); createWindowTest('19.5.9.1', 'setTimeout'); var createEventTest = function(testId, value) { var test = createDomTest(testId, 'window.'+ value, 'window', false); test.prototype.title = 'Test event existence of window.' + value; test.prototype.start = function() { try { if (Modernizr.hasEvent(value, window)) this.runner.succeed(); else throw 'Failed: window.' + value + ': ' + Modernizr.hasEvent(value, window); } catch (e) { this.runner.fail(e); } } }; createEventTest('19.5.10.1', 'keydown'); createEventTest('19.5.11.1', 'keypress'); createEventTest('19.5.12.1', 'keyup'); /** * Ensure that onerror event is correctly fired. */ var testOnerror = createDomTest('19.5.13.1', 'Window.onerror stack trace', 'window'); testOnerror.prototype.title = 'Test window.onerror'; testOnerror.prototype.start = function(runner) { window.addEventListener('error', function onerror(e) { window.removeEventListener('error', onerror); // line number should match if (e.lineno == 193 && (e.colno == 5 || e.colno == 12)) { runner.succeed(); } else { runner.fail('Caught Error: line ' + e.lineno + ' : colno ' + e.colno); } }); // Line that should raise an error setTimeout(function() { failure.test; }, 500); }; /** * Ensure that device pixel ratio is valid under current output resolution. */ var testDevicePixelRatio = createDomTest('19.5.14.1', 'Window.devicePixelRatio', 'window'); testDevicePixelRatio.prototype.title = 'Test window.devicePixelRatio'; testDevicePixelRatio.prototype.start = function() { try { var validDevicePixelRatios; if (util.isGt4K()) { validDevicePixelRatios = [2, 4]; } else if (util.isGtFHD()) { validDevicePixelRatios = [1, 1.5, 2]; } else { validDevicePixelRatios = [1, 1.5]; } if (validDevicePixelRatios.indexOf(window.devicePixelRatio) > -1) { this.runner.succeed(); } else { throw 'Value returned: devicePixelRatio is ' + window.devicePixelRatio + '. Value must be in [' + validDevicePixelRatios.toString() + ']'; } } catch(e) { this.runner.fail(e); } }; // Category: Heap. /** * Validate that totalJSHeapSizs API is supported. */ var testTotalJSHeapSize = createDomTest('19.6.1.1', 'totalJSHeapSize', 'Heap'); testTotalJSHeapSize.prototype.title = 'Test totalJSHeapSize is valid'; testTotalJSHeapSize.prototype.start = function() { try { var totalHeap = window.performance.memory.totalJSHeapSize; var usedHeap = window.performance.memory.usedJSHeapSize; if (totalHeap != undefined && totalHeap > 0 && totalHeap >= usedHeap) this.runner.succeed(); else throw 'totalJSHeapSize is ' + totalHeap; } catch (e) { this.runner.fail(e); } }; /** * Validate that usedJSHeapSizs API is supported. */ var testUsedJSHeapSize = createDomTest('19.6.2.1', 'usedJSHeapSize', 'Heap'); testUsedJSHeapSize.prototype.title = 'Test usedJSHeapSize is valid'; testUsedJSHeapSize.prototype.start = function() { try { var usedHeap = window.performance.memory.usedJSHeapSize; var totalHeap = window.performance.memory.totalJSHeapSize; if (usedHeap != undefined && usedHeap > 0 && usedHeap <= totalHeap) this.runner.succeed(); else throw 'usedJSHeapSize is ' + usedHeap; } catch (e) { this.runner.fail(e); } }; // Category: Assorted. var createAssortedTest = function(testId, value, name, element, mandatory) { var test = createDomTest(testId, name, 'Assorted', mandatory); test.prototype.title = 'Test DOM Implementation of ' + name; test.prototype.start = function() { isValueInElement(value, name, element, this.runner); } }; createAssortedTest('19.7.1.1', 'item', 'NodeList.list', document.body.div); createAssortedTest( '19.7.2.1', 'length', 'NodeList.length', document.documentElement.childNodes); createAssortedTest( '19.7.3.1', 'publicId', 'Notation.publicId', document.doctype, false); createAssortedTest( '19.7.4.1', 'systemId', 'Notation.systemId', document.doctype, false); createAssortedTest( '19.7.5.1', 'data', 'ProcessingInstruction.data', document.body.firstChild); createAssortedTest( '19.7.6.1', 'item', 'StyleSheetList.item', document.StyleSheetLists); createAssortedTest( '19.7.7.1', 'length', 'StyleSheetList.length', document.StyleSheetLists); createAssortedTest( '19.7.8.1', 'splitText', 'Text.splitText', document.body.firstChild, false); createAssortedTest( '19.7.9.1', 'getComputedStyle', 'ViewCSS.getComputedStyle', window); createAssortedTest( '19.7.10.1', 'sheet', 'LinkStyle.sheet', document.getElementsByTagName('link')[0], false); createAssortedTest('19.7.11.1', 'item', 'MediaList.item', document.mediaList); createAssortedTest( '19.7.12.1', 'length', 'MediaList.length', document.mediaList); // Category: CreateEvent. var createInitEventTest = function(testId, value, event, mandatory) { var name = event + '.' + value; var test = createDomTest(testId, name, 'CreateEvent', mandatory); test.prototype.title = 'Test DOM Implementation of ' + name; test.prototype.start = function() { try { var element = document.createEvent(event); isValueInElement(value, name, element, this.runner); } catch (e) { this.runner.fail(e); } } }; createInitEventTest('19.8.1.1', 'initUIEvent', 'UIEvents'); createInitEventTest('19.8.2.1', 'initMouseEvent', 'MouseEvents', false); createInitEventTest('19.8.3.1', 'initMutationEvent', 'MutationEvents', false); return {tests: tests, info: info, fields: fields, viewType: 'default'}; }; try { exports.getTest = DommiscTest; } catch (e) { // do nothing, this function is not supposed to work for browser, but it's for // Node js to generate json file instead. }