<!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>
/* Cobalt does not implement HTML5 spec for body margin. */
body {
  margin: 8px;
}
pre, #log {
  position: absolute;
  top: 0;
  left: 200px;
}
.spacer {
  /* Cobalt does not support calc */
  height: 100vh;
}
#root {
  overflow: scroll;
  height: 200px;
  border: 3px solid black;
}
#target {
  width: 100px;
  height: 100px;
  background-color: green;
}
</style>

<div class="spacer"></div>
<div id="root">
  <div style="height: 300px;"></div>
  <div id="target"></div>
</div>
<div class="spacer"></div>

<script>
var vh = window.innerHeight;

var entries = [];
var root, target;

runTestCycle(function() {
  target = document.getElementById("target");
  assert_true(!!target, "target exists");
  root = document.getElementById("root");
  assert_true(!!root, "root exists");
  var observer = new IntersectionObserver(function(changes) {
    entries = entries.concat(changes);
    window.testRunner.DoNonMeasuredLayout();
  }, { root: root });
  observer.observe(target);
  entries = entries.concat(observer.takeRecords());
  assert_equals(entries.length, 0, "No initial notifications.");
  runTestCycle(step0, "First rAF");
}, "IntersectionObserver in a single document with explicit root.");
window.testRunner.DoNonMeasuredLayout();
window.testRunner.DoNonMeasuredLayout();

function step0() {
  root.style.marginTop = "-200px";
  //document.documentElement.scrollTop = vh;
  runTestCycle(step1, "document.scrollingElement.scrollTop = window.innerHeight.");
  checkLastEntry(entries, 0, [ 11, 111, vh + 311, vh + 411, 0, 0, 0, 0, 11, 111, vh + 111, vh + 311, false]);
  window.testRunner.DoNonMeasuredLayout();
}

function step1() {
  target.style.marginTop = "-150px";
  //root.scrollTop = 150;
  runTestCycle(step2, "root.scrollTop = 150 with root scrolled into view.");
  assert_equals(entries.length, 1, "No notifications after scrolling frame.");
}

function step2() {
  root.style.marginTop = "0px";
  //document.documentElement.scrollTop = 0;
  runTestCycle(step3, "document.scrollingElement.scrollTop = 0.");
  const marginOffset = 200 + 150;
  const topOfTarget = vh + 311 - marginOffset;
  checkLastEntry(entries, 1, [11, 111, topOfTarget, topOfTarget + 100, 11, 111, topOfTarget, topOfTarget + 50, 11, 111, 111, 311, true]);
  window.testRunner.DoNonMeasuredLayout();
}

function step3() {
  target.style.marginTop = "0px";
  //root.scrollTop = 0;
  runTestCycle(step4, "root.scrollTop = 0");
  checkLastEntry(entries, 1);
}

function step4() {
  target.style.marginTop = "-150px";
  //root.scrollTop = 150;
  runTestCycle(step5, "root.scrollTop = 150 with root scrolled out of view.");
  checkLastEntry(entries, 2, [11, 111, vh + 311, vh + 411, 0, 0, 0, 0, 11, 111, vh + 111, vh + 311, false]);
}

// This tests that notifications are generated even when the root element is off screen.
function step5() {
  checkLastEntry(entries, 3, [11, 111, vh + 161, vh + 261, 11, 111, vh + 161, vh + 211, 11, 111, vh + 111, vh + 311, true]);
}
</script>
