<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>CSSOM - Serialization of CSSMediaRule</title>
<link rel="help" href="https://drafts.csswg.org/cssom/#serialize-a-css-rule">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
<script>
function makeSheet(t) {
var style = document.createElement('style');
document.body.appendChild(style);
t.add_cleanup(function() {
document.body.removeChild(style);
});
return style.sheet;
}
test(function(t) {
var sheet = makeSheet(t);
sheet.insertRule('@media {}', 0);
assert_equals(sheet.cssRules.length, 1);
assert_equals(sheet.cssRules[0].cssText, '@media {\n}');
}, 'empty media query list');
test(function(t) {
var sheet = makeSheet(t);
sheet.insertRule('@media all {}');
sheet.insertRule('@media print {}');
sheet.insertRule('@media screen {}');
sheet.insertRule('@media speech {}');
assert_equals(sheet.cssRules.length, 4);
assert_equals(sheet.cssRules[0].cssText, '@media speech {\n}');
assert_equals(sheet.cssRules[1].cssText, '@media screen {\n}');
assert_equals(sheet.cssRules[2].cssText, '@media print {\n}');
assert_equals(sheet.cssRules[3].cssText, '@media all {\n}');
}, 'type - no features');
test(function(t) {
var sheet = makeSheet(t);
sheet.insertRule('@media not all {}');
sheet.insertRule('@media not print {}');
sheet.insertRule('@media not screen {}');
sheet.insertRule('@media not speech {}');
assert_equals(sheet.cssRules.length, 4);
assert_equals(sheet.cssRules[0].cssText, '@media not speech {\n}');
assert_equals(sheet.cssRules[1].cssText, '@media not screen {\n}');
assert_equals(sheet.cssRules[2].cssText, '@media not print {\n}');
assert_equals(sheet.cssRules[3].cssText, '@media not all {\n}');
}, 'type - no features - negation');
test(function(t) {
var sheet = makeSheet(t);
sheet.insertRule('@media aLL {}');
sheet.insertRule('@media pRiNt {}');
sheet.insertRule('@media screEN {}');
sheet.insertRule('@media spEech {}');
assert_equals(sheet.cssRules.length, 4);
assert_equals(sheet.cssRules[0].cssText, '@media speech {\n}');
assert_equals(sheet.cssRules[1].cssText, '@media screen {\n}');
assert_equals(sheet.cssRules[2].cssText, '@media print {\n}');
assert_equals(sheet.cssRules[3].cssText, '@media all {\n}');
}, 'type - no features - character case normalization');
test(function(t) {
var sheet = makeSheet(t);
sheet.insertRule('@media all and (color) {}');
assert_equals(sheet.cssRules.length, 1);
assert_equals(sheet.cssRules[0].cssText, '@media (color) {\n}');
}, 'type - omission of all');
test(function(t) {
var sheet = makeSheet(t);
sheet.insertRule('@media not all and (color) {}');
assert_equals(sheet.cssRules.length, 1);
assert_equals(sheet.cssRules[0].cssText, '@media not all and (color) {\n}');
}, 'type - inclusion of negated all');
test(function(t) {
var sheet = makeSheet(t);
sheet.insertRule('@media screen and (Color) {}');
sheet.insertRule('@media screen and (cOLor) {}');
assert_equals(sheet.cssRules.length, 2);
assert_equals(sheet.cssRules[0].cssText, '@media screen and (color) {\n}');
assert_equals(sheet.cssRules[1].cssText, '@media screen and (color) {\n}');
}, 'features - character case normalization');
/**
* The following test is disabled pending clarification of the intended
* behavior: https://github.com/w3c/csswg-drafts/issues/533
*/
//test(function(t) {
// var sheet = makeSheet(t);
// sheet.insertRule('@media screen and (color) and (color) {}');
//
// assert_equals(sheet.cssRules.length, 1);
// assert_equals(
// sheet.cssRules[0].cssText,
// '@media screen and (color) {\n}'
// );
//}, 'features - de-duplication');
test(function(t) {
var sheet = makeSheet(t);
sheet.insertRule('@media print and (max-width: 23px) and (max-width: 45px) {}');
assert_equals(sheet.cssRules.length, 1);
assert_equals(
sheet.cssRules[0].cssText,
'@media print and (max-width: 23px) and (max-width: 45px) {\n}'
);
}, 'features - preservation of overspecified features');
test(function(t) {
var sheet = makeSheet(t);
sheet.insertRule('@media screen and (max-width: 0px) and (color) {}');
sheet.insertRule('@media screen and (color) and (max-width: 0px) {}');
assert_equals(sheet.cssRules.length, 2);
assert_equals(
sheet.cssRules[0].cssText,
'@media screen and (color) and (max-width: 0px) {\n}'
);
assert_equals(
sheet.cssRules[1].cssText,
'@media screen and (max-width: 0px) and (color) {\n}'
);
}, 'features - no lexicographical sorting');
test(function(t) {
var sheet = makeSheet(t);
sheet.insertRule('@media screen and (max-width: 0px), screen and (color) {}');
assert_equals(sheet.cssRules.length, 1);
assert_equals(
sheet.cssRules[0].cssText,
'@media screen and (max-width: 0px), screen and (color) {\n}'
);
}, 'media query list');
test(function(t) {
var sheet = makeSheet(t);
sheet.insertRule('@media print {}');
assert_equals(sheet.cssRules.length, 1);
sheet.cssRules[0].insertRule('#foo { z-index: 23; float: left; }', 0);
assert_equals(
sheet.cssRules[0].cssText,
[
'@media print {',
' #foo { z-index: 23; float: left; }',
'}'
].join('\n')
);
}, 'one rule');
test(function(t) {
var sheet = makeSheet(t);
sheet.insertRule('@media print {}');
assert_equals(sheet.cssRules.length, 1);
sheet.cssRules[0].insertRule('#foo { z-index: 23; float: left; }', 0);
sheet.cssRules[0].insertRule('#bar { float: none; z-index: 45; }', 0);
assert_equals(
sheet.cssRules[0].cssText,
[
'@media print {',
' #bar { float: none; z-index: 45; }',
' #foo { z-index: 23; float: left; }',
'}'
].join('\n')
);
}, 'many rules');
</script>
</body>
</html>