<!DOCTYPE html>
<html>
 <!--
 https://bugzilla.mozilla.org/show_bug.cgi?id=1235899
 -->
 <head>
  <title>Test for bug 1235899</title>
  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
  <script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
  <script type="application/javascript" src="/tests/SimpleTest/paint_listener.js"></script>
  <script type="application/javascript" src="apz_test_utils.js"></script>
  <script type="application/javascript" src="apz_test_native_event_utils.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
  <style>
    .outer {
        height: 400px;
        width: 415px;
        overflow: hidden;
        position: relative;
    }
    .inner {
        height: 100%;
        outline: none;
        overflow-x: hidden;
        overflow-y: scroll;
        position: relative;
        scroll-behavior: smooth;
    }
    .outer.contentBefore::before {
        top: 0;
        content: '';
        display: block;
        height: 2px;
        position: absolute;
        width: 100%;
        z-index: 99;
    }
  </style>
 </head>
 <body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1235899">Mozilla Bug 1235899</a>
<p id="display"></p>
<div id="content">
 <p>You should be able to fling this list without it stopping abruptly</p>
 <div class="outer">
  <div class="inner">
   <ol>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
   </ol>
  </div>
 </div>
</div>

<pre id="test">
<script type="application/javascript;version=1.7">
function* test(testDriver) {
  var elm = document.getElementsByClassName('inner')[0];
  elm.scrollTop = 0;
  yield flushApzRepaints(testDriver);

  // Take over control of the refresh driver and compositor
  var utils = SpecialPowers.DOMWindowUtils;
  utils.advanceTimeAndRefresh(0);

  // Kick off an APZ smooth-scroll to 0,200
  elm.scrollTo(0, 200);
  yield waitForAllPaints(function() { setTimeout(testDriver, 0); });

  // Let's do a couple of frames of the animation, and make sure it's going
  utils.advanceTimeAndRefresh(16);
  utils.advanceTimeAndRefresh(16);
  yield flushApzRepaints(testDriver);
  ok(elm.scrollTop > 0, "APZ animation in progress", "scrollTop is now " + elm.scrollTop);
  ok(elm.scrollTop < 200, "APZ animation not yet completed", "scrollTop is now " + elm.scrollTop);

  var frameReconstructionTriggered = 0;
  // Register the listener that triggers the frame reconstruction
  elm.onscroll = function() {
    // Do the reconstruction
    elm.parentNode.classList.add('contentBefore');
    frameReconstructionTriggered++;
    // schedule a thing to undo the changes above
    setTimeout(function() {
      elm.parentNode.classList.remove('contentBefore');
    }, 0);
  }

  // and do a few more frames of the animation, this should trigger the listener
  // and the frame reconstruction
  utils.advanceTimeAndRefresh(16);
  utils.advanceTimeAndRefresh(16);
  yield flushApzRepaints(testDriver);
  ok(elm.scrollTop < 200, "APZ animation not yet completed", "scrollTop is now " + elm.scrollTop);
  ok(frameReconstructionTriggered > 0, "Frame reconstruction triggered", "reconstruction triggered " + frameReconstructionTriggered + " times");

  // and now run to completion
  for (var i = 0; i < 100; i++) {
    utils.advanceTimeAndRefresh(16);
  }
  utils.restoreNormalRefresh();
  yield waitForAllPaints(function() { setTimeout(testDriver, 0); });
  yield flushApzRepaints(testDriver);

  is(elm.scrollTop, 200, "Element should have scrolled by 200px");
}

if (isApzEnabled()) {
  SimpleTest.waitForExplicitFinish();
  SimpleTest.expectAssertions(0, 1); // this test triggers an assertion, see bug 1247050
  waitUntilApzStable()
  .then(runContinuation(test))
  .then(SimpleTest.finish);
}

</script>
</body>
</html>