<!DOCTYPE html>
<meta name="viewport" content="width=device-width,initial-scale=1">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="./resources/intersection-observer-test-utils.js"></script>

<style>
pre, #log {
  position: absolute;
  top: 0;
  left: 200px;
}
#target {
  display: inline-block;
  width: 100px;
  height: 100px;
  background-color: green;
}
.vertical-spacer {
  height: calc(100vh + 100px);
}
.horizontal-spacer {
  display: inline-block;
  width: 120vw;
}
</style>

<div class="vertical-spacer"></div>
<div style="white-space:nowrap;">
  <div class="horizontal-spacer"></div>
  <div id="target"></div>
  <div class="horizontal-spacer"></div>
</div>
<div class="vertical-spacer"></div>

<script>
var vw = document.documentElement.clientWidth;
var vh = document.documentElement.clientHeight;

var entries = [];
var target;

runTestCycle(function() {
  target = document.getElementById("target");
  assert_true(!!target, "Target exists");
  var observer = new IntersectionObserver(function(changes) {
    entries = entries.concat(changes)
  }, { rootMargin: "10px 20% 40% 30px" });
  observer.observe(target);
  entries = entries.concat(observer.takeRecords());
  assert_equals(entries.length, 0, "No initial notifications.");
  runTestCycle(step0, "First rAF.");
}, "Root margin tests");

function step0() {
  var targetBounds = clientBounds(target);
  document.scrollingElement.scrollLeft = 100;
  runTestCycle(step1, "document.scrollingElement.scrollLeft = 100");
  checkLastEntry(entries, 0, targetBounds.concat(0, 0, 0, 0, -30, vw * 1.2, -10, vh * 1.4, false));
}

function step1() {
  var targetBounds = clientBounds(target);
  var sw = window.innerWidth - document.documentElement.clientWidth;
  var sh = window.innerHeight - document.documentElement.clientHeight;
  document.scrollingElement.scrollTop = vh + 200;
  runTestCycle(step2, "document.scrollingElement.scrollTop = document.documentElement.clientHeight + 200");
  checkLastEntry(entries, 1, targetBounds.concat(
    targetBounds[0], Math.min(targetBounds[1], vw * 1.2), vh + 108 + sh, Math.min(vh + 208 + sw, vh * 1.4),
    -30, vw * 1.2, -10, vh * 1.4,
    true
  ));
}

function step2() {
  document.scrollingElement.scrollTop = vh + 300;
  runTestCycle(step3, "document.scrollingElement.scrollTop = document.documentElement.clientHeight + 300");
  checkLastEntry(entries, 1);
}

function step3() {
  var targetBounds = clientBounds(target);
  document.scrollingElement.scrollLeft = 0;
  document.scrollingElement.scrollTop = 0;
  checkLastEntry(entries, 2, targetBounds.concat(0, 0, 0, 0, -30, vw * 1.2, -10, vh * 1.4, false));
}
</script>
