<!DOCTYPE html>
<html>
<head>
  <script type='text/javascript'>
    // Demonstrates how media query can be used to get the value of the
    // window resolution, width, and height.

    function log_info(message) {
      console.log(message);
      document.getElementById('info').innerHTML += message + '.\n';
    }
    function log_error(message) {
      console.log('Error: ' + message);
      document.getElementById('error').innerHTML += message + '.\n';
    }

    function search(low, high, query, units) {
      var precision = 1/32;
      while (low < high - precision) {
        var mid = Math.floor((low + high) / 2 / precision) * precision;
        query_str = '(max-' + query + ':' + mid + units + ')'
        if (window.matchMedia(query_str).matches) {
          // The window value is less than or equal to result.
          high = mid;
        } else {
          // The window value is greater than result.
          low = mid;
        }
      }
      return high;
    }

    function PrintWindowSize() {
      var width = search(0, 16000, 'width', 'px');
      var height = search(0, 16000, 'height', 'px');
      log_info('media size: ' + width + 'x' + height);
      if (Math.abs(width - window.innerWidth) >= 1) {
        log_error('width does not match window.innerWidth');
      }
      if (Math.abs(height - window.innerHeight) >= 1) {
        log_error('height does not match window.innerHeight');
      }
    }

    function PrintDpi() {
      var dpi = search(0, 16000, 'resolution', 'dpi');
      log_info('resolution dpi: ' + dpi +
               ', window.devicePixelRatio: ' + window.devicePixelRatio);
      if (Math.abs(dpi - 96 * window.devicePixelRatio) > 1) {
        log_error('resolution does not match devicePixelRatio');
      }
    }


    function intervalCallback() {
      PrintDpi();
      PrintWindowSize();
    }

    window.setInterval(intervalCallback, 500);
  </script>
</head>

<body>
  <span id='error' style='white-space: pre; background-color:#FF0000'></span>
  <span id='info' style='white-space: pre; background-color:#00FF00'></span>
</body>
</html>
