// 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(10000, 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);
