tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 }