matchmedia-utils.js (2230B)
1 'use strict'; 2 3 function query_is_css_parseable(query) { 4 const style = document.createElement('style'); 5 style.type = 'text/css'; 6 document.head.appendChild(style); 7 8 const sheet = style.sheet; 9 try { 10 sheet.insertRule("@media " + query + "{}", 0); 11 return sheet.cssRules.length == 1 && 12 sheet.cssRules[0].media.mediaText != "not all"; 13 } finally { 14 while (sheet.cssRules.length) 15 sheet.deleteRule(0); 16 style.remove(); 17 } 18 } 19 20 function query_should_be_css_parseable(query) { 21 test(() => { 22 assert_true(query_is_css_parseable(query)); 23 }, "Should be parseable in a CSS stylesheet: '" + query + "'"); 24 } 25 26 function query_should_not_be_css_parseable(query) { 27 test(() => { 28 assert_false(query_is_css_parseable(query)); 29 }, "Should not be parseable in a CSS stylesheet: '" + query + "'"); 30 } 31 32 function query_is_js_parseable(query) { 33 // We cannot rely on whether a given feature is on or off, so only check the 34 // 'media' member of the result. 35 const match = window.matchMedia(query); 36 return match.media == query; 37 } 38 39 function query_should_be_js_parseable(query) { 40 test(() => { 41 assert_true(query_is_js_parseable(query)); 42 }, "Should be parseable in JS: '" + query + "'"); 43 } 44 45 function query_should_not_be_js_parseable(query) { 46 test(() => { 47 assert_false(query_is_js_parseable(query)); 48 }, "Should not be parseable in JS: '" + query + "'"); 49 } 50 51 function query_is_known(query) { 52 return window.matchMedia(`${query}, not all and ${query}`).matches; 53 } 54 55 function query_is_unknown(query) { 56 return !window.matchMedia(`${query}, not all and ${query}`).matches; 57 } 58 59 function query_should_be_known(query) { 60 test(() => { 61 assert_true(query_is_js_parseable(query), "Can parse with JS"); 62 assert_true(query_is_css_parseable(query), "Can parse with CSS"); 63 assert_true(query_is_known(query)); 64 }, "Should be known: '" + query + "'"); 65 } 66 67 function query_should_be_unknown(query) { 68 test(() => { 69 assert_true(query_is_js_parseable(query), "Can parse with JS"); 70 assert_true(query_is_css_parseable(query), "Can parse with CSS"); 71 }, "Should be parseable: '" + query + "'"); 72 73 test(() => { 74 assert_true(query_is_unknown(query)); 75 }, "Should be unknown: '" + query + "'"); 76 }