2020/functional/domCssTest.js (216 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';
/**
* DOM CSS Test Suite.
* @class
*/
var DomcssTest = function() {
var domCssVersion = 'Current Editor\'s Draft';
var tests = [];
var info = 'Spec Version: ' + domCssVersion + ' | Default Timeout: ' +
TestBase.timeout + 'ms';
var fields = ['passes', 'failures', 'timeouts'];
var createDomCssTest = function(
testId, name, category = 'DOM CSS', mandatory = true) {
var t = createTest(name, category, mandatory, testId, 'DOM CSS Tests');
t.prototype.index = tests.length;
tests.push(t);
return t;
};
window.getCSSInterface = function(type) {
for (var i = 0; i < document.styleSheets.length; i++) {
for (var j = 0; j < document.styleSheets[i].cssRules.length; j++) {
if (document.styleSheets[i].cssRules[j] instanceof type) {
return document.styleSheets[i].cssRules[j];
} else if (document.styleSheets[i].cssRules instanceof type) {
// Some tests may only need a CSSRuleList
return document.styleSheets[i].cssRules;
} else if (document.styleSheets[i] instanceof type) {
// Some tests may only need a CSSStyleSheet
return document.styleSheets[i];
} else if (document.styleSheets[i].cssRules[j] instanceof CSSStyleRule &&
document.styleSheets[i].cssRules[j].style instanceof type) {
// Some tests may only need a CSSStyleDeclaration
return document.styleSheets[i].cssRules[j].style;
}
}
}
return null;
};
/**
* Ensure the DOM and CSS are correctly supported through Modernizr.
*/
var createCommonCssTest = function(testId, name, category, arg, mandatory) {
var test = createDomCssTest(testId, name, category, mandatory);
test.prototype.title = 'Test CSS functionality ' + name;
test.prototype.start = function() {
try {
var testRule = getCSSInterface(arg.type);
if (!!(testRule) &&
Modernizr.prefixed(arg.attribute, testRule, false) != false)
this.runner.succeed();
else {
throw Modernizr.prefixed(arg.attribute, testRule, false);
}
} catch (e) {
this.runner.fail(e);
}
};
};
createCommonCssTest(
'17.1.1.1',
'CSSFontFaceRule.style',
'CSS Font',
{type: window.CSSFontFaceRule, attribute: 'style'},
false);
createCommonCssTest(
'17.2.1.1',
'CSSImportRule.href',
'CSS Import Rule',
{type: window.CSSImportRule, attribute:'href'},
false);
createCommonCssTest(
'17.2.2.1',
'CSSImportRule.media',
'CSS Import Rule',
{type: window.CSSImportRule, attribute:'media'},
false);
createCommonCssTest(
'17.2.3.1',
'CSSImportRule.styleSheet',
'CSS Import Rule',
{type: window.CSSImportRule, attribute:'styleSheet'},
false);
createCommonCssTest(
'17.3.1.1',
'CSSMediaRule.cssRules',
'CSS Media Rule',
{type: window.CSSMediaRule, attribute: 'cssRules'});
createCommonCssTest(
'17.3.2.1',
'CSSMediaRule.deleteRule',
'CSS Media Rule',
{type: window.CSSMediaRule, attribute: 'deleteRule'},
false);
createCommonCssTest(
'17.3.3.1',
'CSSMediaRule.insertRule',
'CSS Media Rule',
{type: window.CSSMediaRule, attribute: 'insertRule'});
createCommonCssTest(
'17.3.4.1',
'CSSMediaRule.media',
'CSS Media Rule',
{type: window.CSSMediaRule, attribute: 'media'});
createCommonCssTest(
'17.4.1.1',
'CSSPageRule.selectorText',
'CSS Page Rule',
{type: window.CSSPageRule, attribute: 'selectorText'},
false);
createCommonCssTest(
'17.4.2.1',
'CSSPageRule.style',
'CSS Page Rule',
{type: window.CSSPageRule, attribute: 'style'},
false);
createCommonCssTest(
'17.5.1.1',
'CSSRule.cssText',
'CSS Rule',
{type: window.CSSRule, attribute: 'cssText'});
createCommonCssTest(
'17.5.2.1',
'CSSRule.parentRule',
'CSS Rule',
{type: window.CSSRule, attribute: 'parentRule'});
createCommonCssTest(
'17.5.3.1',
'CSSRule.parentStyleSheet',
'CSS Rule',
{type: window.CSSRule, attribute: 'parentStyleSheet'});
createCommonCssTest(
'17.6.1.1',
'CSSRuleList.item',
'CSS Rule List',
{type: window.CSSRuleList, attribute: 'item'});
createCommonCssTest(
'17.6.2.1',
'CSSRuleList.length',
'CSS Rule List',
{type: window.CSSRuleList, attribute: 'length'});
createCommonCssTest(
'17.7.1.1',
'CSSStyleDeclaration.cssText',
'CSS Style Declaration',
{type: window.CSSStyleDeclaration, attribute: 'cssText'});
createCommonCssTest(
'17.7.2.1',
'CSSStyleDeclaration.getPropertyCSSValue',
'CSS Style Declaration',
{type: window.CSSStyleDeclaration, attribute: 'getPropertyCSSValue'},
false);
createCommonCssTest(
'17.7.3.1',
'CSSStyleDeclaration.getPropertyPriority',
'CSS Style Declaration',
{type: window.CSSStyleDeclaration, attribute: 'getPropertyPriority'},
false);
createCommonCssTest(
'17.7.4.1',
'CSSStyleDeclaration.getPropertyValue',
'CSS Style Declaration',
{type: window.CSSStyleDeclaration, attribute: 'getPropertyValue'});
createCommonCssTest(
'17.7.5.1',
'CSSStyleDeclaration.item',
'CSS Style Declaration',
{type: window.CSSStyleDeclaration, attribute: 'item'});
createCommonCssTest(
'17.7.6.1',
'CSSStyleDeclaration.length',
'CSS Style Declaration',
{type: window.CSSStyleDeclaration, attribute: 'length'});
createCommonCssTest(
'17.7.7.1',
'CSSStyleDeclaration.parentRule',
'CSS Style Declaration',
{type: window.CSSStyleDeclaration, attribute: 'parentRule'});
createCommonCssTest(
'17.7.8.1',
'CSSStyleDeclaration.removeProperty',
'CSS Style Declaration',
{type: window.CSSStyleDeclaration, attribute: 'removeProperty'});
createCommonCssTest(
'17.7.9.1',
'CSSStyleDeclaration.setProperty',
'CSS Style Declaration',
{type: window.CSSStyleDeclaration, attribute: 'setProperty'});
createCommonCssTest(
'17.8.1.1',
'CSSStyleRule.selectorText',
'CSS Style Rule',
{type: window.CSSStyleRule, attribute: 'selectorText'},
false);
createCommonCssTest(
'17.8.2.1',
'CSSStyleRule.style',
'CSS Style Rule',
{type: window.CSSStyleRule, attribute: 'style'});
createCommonCssTest(
'17.9.1.1',
'CSSStyleSheet.cssRules',
'CSS Style Sheet',
{type: window.CSSStyleSheet, attribute: 'cssRules'});
createCommonCssTest(
'17.9.2.1',
'CSSStyleSheet.deleteRule',
'CSS Style Sheet',
{type: window.CSSStyleSheet, attribute: 'deleteRule'},
false);
createCommonCssTest(
'17.9.3.1',
'CSSStyleSheet.insertRule',
'CSS Style Sheet',
{type: window.CSSStyleSheet, attribute: 'insertRule'});
createCommonCssTest(
'17.9.4.1',
'CSSStyleSheet.ownerRule',
'CSS Style Sheet',
{type: window.CSSStyleSheet, attribute: 'ownerRule'},
false);
return {tests: tests, info: info, fields: fields, viewType: 'default'};
};
try {
exports.getTest = DomcssTest;
} catch (e) {
// do nothing, this function is not supposed to work for browser, but it's for
// Node js to generate json file instead.
}