<html>
  <head>
    <script>

var apiHandle;
var newTabPageHandle;
var onMostVisitedChangedCalls = 0;
var mostVisitedItemsCount = 0;
var firstMostVisitedItemId = 0;
var onFocusChangedCalls = 0;
var isFocused = false;
var onvisibilitycalls = 0;
var onThemeChangedCalls = 0;

function getApiHandle() {
  if (window.navigator && window.navigator.searchBox)
    return window.navigator.searchBox;
  if (window.chrome && window.chrome.searchBox)
    return window.chrome.searchBox;
  return null;
}

function getNewTabPageHandle() {
  if (window.navigator && window.navigator.embeddedSearch &&
      window.navigator.embeddedSearch.newTabPage)
    return window.navigator.embeddedSearch.newTabPage;
  if (window.chrome && window.chrome.embeddedSearch &&
      window.chrome.embeddedSearch.newTabPage)
    return window.chrome.embeddedSearch.newTabPage;
  return null;
}

function handleMostVisitedChange() {
  onMostVisitedChangedCalls++;
  var items = newTabPageHandle.mostVisited;
  if (items) {
    mostVisitedItemsCount = items.length;
    firstMostVisitedItemId = items[0] ? items[0].rid : 0;
  }
}

document.addEventListener("visibilitychange", function() {
  onvisibilitycalls++;
}, false);

function handleFocusChange() {
  onFocusChangedCalls++;
  isFocused = apiHandle.isFocused;
}

function handleThemeChange() {
  onThemeChangedCalls++;
}

function setUp() {
  apiHandle = getApiHandle();
  if (!apiHandle)
    return;

  apiHandle.onfocuschange = handleFocusChange;

  newTabPageHandle = getNewTabPageHandle();
  newTabPageHandle.onmostvisitedchange = handleMostVisitedChange;
  newTabPageHandle.onthemechange = handleThemeChange;
  if (newTabPageHandle.mostVisited && newTabPageHandle.mostVisited.length) {
    handleMostVisitedChange();
  }
  handleFocusChange();
}

setUp();

    </script>

    <meta name="referrer" content="origin" />

  </head>
  <body>
    <h1>Instant</h1>
  </body>
</html>
