<!doctype html>
<meta charset="utf-8">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="container">
  Fission <br/>
  Some text <br/>
  Some more text Fission or Fission or even <span>Fi</span>ssion<br/>
  Fission <br/>
  more text<br/>
  <div>
    in a nested block Fission stuff
  </div>
</div>
<script>
const kContainer = document.getElementById("container");
const kExpectedCount = 6;

// We expect surroundContents() to throw in the <span>Fi</span>ssion case.
const kExpectedThrewCount = 1;

// Keep a hang of the original DOM so as to test forwards and backwards navigation.
const kContainerClone = kContainer.cloneNode(true);

function advance(backwards) {
  if (!window.find("Fiss", /* caseSensitive = */ true, backwards))
    return { success: false };

  let threw = false;
  try {
    window.getSelection().getRangeAt(0).surroundContents(document.createElement("mark"));
  } catch (ex) {
    threw = true;
  }

  // Sanity-check
  assert_equals(window.getSelection().toString(), "Fiss");
  return { success: true, threw };
}

function runTestForDirection(backwards) {
  let threwCount = 0;
  for (let i = 0; i < kExpectedCount; ++i) {
    let result = advance(backwards);
    assert_true(result.success, `Should've successfully advanced (${i} / ${kExpectedCount}, backwards: ${backwards})`);
    if (result.threw)
      threwCount++;
  }
  assert_false(advance(backwards).success, `Should've had exactly ${kExpectedCount} matches`);
  assert_equals(threwCount, kExpectedThrewCount, "Should've thrown the expected number of times");
  assert_equals(kContainer.querySelectorAll("mark").length, kExpectedCount - threwCount, "Should've created the expected number of marks");
  assert_false(!!kContainer.querySelector("mark mark"), "Shouldn't have created nested marks");
}

test(function() {
  runTestForDirection(false);
  window.getSelection().removeAllRanges();
  kContainer.innerHTML = kContainerClone.innerHTML;
  runTestForDirection(true);
}, "window.find() while marking with surroundContents");
</script>
