<!DOCTYPE html>
<html>
<head>
  <script type="text/javascript">

    function get_new_tab_on_blur() {
      return document.getElementById('new_tab_on_blur').innerHTML == "true";
    }

    function set_new_tab_on_blur(value) {
      return document.getElementById('new_tab_on_blur').innerHTML = value ? "true": "false";
    }

    function printVisibilityState() {
      console.log("  document.hasFocus() == " + document.hasFocus());
      console.log("  document.hidden == " + document.hidden);
      console.log("  document.visibilityState == " + document.visibilityState);
    }
    printVisibilityState();

    window.onblur = function() {
      console.log("window.onblur");
      if (get_new_tab_on_blur()) {
        set_new_tab_on_blur(false);
        setTimeout(function() { window.open("about:blank", "_blank")}, 2000);
      }
      printVisibilityState();
    };

    window.onfocus = function() {
      console.log("window.onfocus");
      printVisibilityState();
    };

    window.onload = function() {
      console.log("window.onload");
      printVisibilityState();
    };

    document.onblur = function() {
      console.log("document.onblur");
      printVisibilityState();
    };

    document.onfocus = function() {
      console.log("document.onfocus");
      printVisibilityState();
    };

    document.onvisibilitychange = function() {
      console.log("document.onvisibilitychange: " + document.visibilityState);
      printVisibilityState();
    };

    document.onfreeze = function() {
      console.log("document.onfreeze")
      printVisibilityState();
    };

    document.onresume = function() {
      console.log("document.onresume")
      printVisibilityState();
    };
    document.onkeypress = function(e) {
      console.log("document.onkeypress: keyCode == " + e.keyCode)
      if (e.keyCode == 13) {
        set_new_tab_on_blur(!get_new_tab_on_blur());
      } else {
        printVisibilityState();
      }
    }
  </script>
</head>
<body style="background-color:#ccc">

Press Enter to toggle new_tab_on_blur :
<span id="new_tab_on_blur">false</span>

</body>
</html>
