// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

request = {action: 'should_scroll'}

var PLAY_MUSIC_HOSTNAME = 'play.google.com';

function report_scrolling_to_test() {
  //Sends message to PLT informing that user is scrolling on the browser.
  var scroll_url = 'http://localhost:8001/scroll';
  var req = new XMLHttpRequest();
  req.open('GET', scroll_url, true);
  req.send("");
}

//Sends message to the test.js(background script). test.js on
//receiving a message from content script assumes the page has
//loaded successfully. It further responds with instructions on
//whether/how to scroll.
function sendSuccessToBGScript() {
  chrome.runtime.sendMessage(request, function(response) {
    if (response && response.should_scroll) {
      window.focus();
      lastOffset = window.pageYOffset;
      var start_interval = Math.max(1000, response.scroll_interval);
      function smoothScrollDown() {
        report_scrolling_to_test();
        window.scrollBy(0, response.scroll_by);
        if (window.pageYOffset != lastOffset) {
          lastOffset = window.pageYOffset;
          setTimeout(smoothScrollDown, response.scroll_interval);
        } else if (response.should_scroll_up) {
          setTimeout(smoothScrollUp, start_interval);
        }
      }
      function smoothScrollUp() {
        report_scrolling_to_test();
        window.scrollBy(0, -1 * response.scroll_by);
        if (window.pageYOffset != lastOffset) {
          lastOffset = window.pageYOffset;
          setTimeout(smoothScrollUp, response.scroll_interval);
        } else if (response.scroll_loop) {
          setTimeout(smoothScrollDown, start_interval);
        }
      }
      setTimeout(smoothScrollDown, start_interval);
    }
  });
}

function afterLoad() {
  if (document.location.hostname !== PLAY_MUSIC_HOSTNAME) {
    sendSuccessToBGScript();
    return;
  }

  var playButton = document.querySelector('[data-id="play"]');

  //If play music website, if we do not see a play button
  //that effectively means the music is not loaded. So do not
  //report success load to test.js.
  if (playButton) {
    sendSuccessToBGScript();
    playButton.click();
  }
}

window.addEventListener('load', afterLoad);
