<html>
  <head>
    <script>

var apiHandle;
var newTabPageHandle;
var suggestion;
var onMostVisitedChangedCalls = 0;
var mostVisitedItemsCount = 0;
var firstMostVisitedItemId = 0;
var submitCount = 0;
var onFocusChangedCalls = 0;
var prefetchQuery = '';
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 handleSubmit() {
  location.hash = 'q=' + encodeURIComponent(apiHandle.value);
  submitCount++;
}

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 handleSuggestionChange() {
  prefetchQuery = getApiHandle().suggestion.text;
}

function handleThemeChange() {
  onThemeChangedCalls++;
}

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

  apiHandle.onsubmit = handleSubmit;
  apiHandle.onfocuschange = handleFocusChange;
  apiHandle.onsuggestionchange = handleSuggestionChange;

  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>
