<!DOCTYPE html>
<html>
<head>
  <style>
    #content {
      width: 7500px;
      height: 7500px;
      background-color: blue;
    }
  </style>
  <script src="../../resources/testharness.js"></script>
  <script src="../../resources/testharnessreport.js"></script>
  <script src="resources/scroll-behavior-test.js"></script>
  <script type="text/javascript">
    function getEndPosition(testCase, startPosition) {
      var endPosition = {};
      if (testCase.x)
        endPosition.x = testCase.x;
      else
        endPosition.x = startPosition.x;

      if (testCase.y)
        endPosition.y = testCase.y;
      else
        endPosition.y = startPosition.y;

      return endPosition;
    }

    function jsScroll(testCase) {
      if (testCase.js) {
        var scrollToOptions = {behavior: testCase.js};
        if (testCase.x)
          scrollToOptions.left = testCase.x;
        if (testCase.y)
          scrollToOptions.top = testCase.y;
        document.scrollingElement.scrollTo(scrollToOptions);
      } else {
        document.scrollingElement.scrollTo(testCase.x, testCase.y);
      }
    }

    const testScrolls = [
      {js: "instant", css: "auto", x: 1, y: 2},
      {js: "instant", css: "smooth", x: 2, y: 3},
      {js: "auto", css: "auto", x: 3, y: 4},
      {js: "", css: "auto", x: 4, y: 5},
      {js: "auto", css: "auto", x: 3},
      {js: "auto", css: "auto", y: 4},
      {js: "auto", css: "auto"},
      {js: "smooth", css: "auto", waitForEnd: true, x: 10, y: 15},
      {js: "smooth", css: "smooth", waitForEnd: true, x: 20, y: 25},
      {js: "auto", css: "smooth", waitForEnd: true, x: 30, y: 35},
      {js: "", css: "smooth", waitForEnd: true, x: 40, y: 45},
      {js: "auto", css: "smooth", waitForEnd: true, x: 45},
      {js: "auto", css: "smooth", waitForEnd: true, y: 40},
      {js: "smooth", css: "auto", waitForEnd: false, x: 4000, y: 4100},
      {js: "smooth", css: "smooth", waitForEnd: false, x: 15, y: 20},
      {js: "auto", css: "smooth", waitForEnd: false, x: 4100, y: 4000},
      {js: "", css: "smooth", waitForEnd: false, x: 10, y: 5},
    ];

    function doTest()
    {
      var testCases = [];
      for (var i = 0; i < testScrolls.length; i++) {
        testCases.push(new ScrollBehaviorTestCase(testScrolls[i]));
      }

      var scrollBehaviorTest = new ScrollBehaviorTest(document.scrollingElement,
                                                      document,
                                                      testCases,
                                                      getEndPosition,
                                                      jsScroll);
      scrollBehaviorTest.run();
    }

    window.addEventListener('load', doTest, false);
  </script>
</head>

<body>
  <p>Test that calling scrollTo on the main frame's document element works with both scroll behaviors</p>
  <div id="content"></div>
</body>
</html>
