<!DOCTYPE html>
<html>
<head>
  <script src="/tests/SimpleTest/SimpleTest.js"></script>        
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>

<script type="text/javascript">

SimpleTest.waitForExplicitFinish();

const SAME_ORIGIN_URI = "http://mochi.test:8888/tests/docshell/test/dummy_page.html";
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
const CROSS_ORIGIN_URI = "http://example.com/tests/docshell/test/dummy_page.html";
const NUMBER_OF_TESTS = 3;
let testCounter = 0;

function checkFinish() {
  testCounter++;
  if (testCounter < NUMBER_OF_TESTS) {
    return;
  }
  SimpleTest.finish();
}

// ---- test 1 ----

let myFrame1 = document.createElement("iframe");
myFrame1.src = SAME_ORIGIN_URI;
myFrame1.addEventListener("load", checkLoadFrame1);
document.documentElement.appendChild(myFrame1);

function checkLoadFrame1() {
  myFrame1.removeEventListener("load", checkLoadFrame1);
  // window.location.href is no longer cross-origin accessible in gecko.
  is(SpecialPowers.wrap(myFrame1.contentWindow).location.href, SAME_ORIGIN_URI,
    "initial same origin dummy loaded into frame1");

  SpecialPowers.wrap(myFrame1.contentWindow).location.hash = "#bar";
  is(SpecialPowers.wrap(myFrame1.contentWindow).location.href, SAME_ORIGIN_URI + "#bar",
    "initial same origin dummy#bar loaded into iframe1");

  myFrame1.addEventListener("load", checkNavFrame1);
  myFrame1.src = CROSS_ORIGIN_URI;
}

async function checkNavFrame1() {
  myFrame1.removeEventListener("load", checkNavFrame1);
  is(await SpecialPowers.spawn(myFrame1, [], () => this.content.location.href),
     CROSS_ORIGIN_URI,
    "cross origin dummy loaded into frame1");

  myFrame1.addEventListener("load", checkBackNavFrame1);
  myFrame1.src = SAME_ORIGIN_URI + "#bar";
}

async function checkBackNavFrame1() {
  myFrame1.removeEventListener("load", checkBackNavFrame1);
  is(await SpecialPowers.spawn(myFrame1, [], () => this.content.location.href),
     SAME_ORIGIN_URI + "#bar",
    "navagiating back to same origin dummy for frame1");
  checkFinish();
}

// ---- test 2 ----

let myFrame2 = document.createElement("iframe");
myFrame2.src = "about:blank";
myFrame2.addEventListener("load", checkLoadFrame2);
document.documentElement.appendChild(myFrame2);

function checkLoadFrame2() {
  myFrame2.removeEventListener("load", checkLoadFrame2);
  is(SpecialPowers.wrap(myFrame2.contentWindow).location.href, "about:blank",
    "initial about:blank frame loaded");

  myFrame2.contentWindow.location.hash = "#foo";
  is(SpecialPowers.wrap(myFrame2.contentWindow).location.href, "about:blank#foo",
      "about:blank#foo frame loaded");

  myFrame2.addEventListener("load", checkHistoryFrame2);
  myFrame2.src = "about:blank";
}

function checkHistoryFrame2() {
  myFrame2.removeEventListener("load", checkHistoryFrame2);
  is(SpecialPowers.wrap(myFrame2.contentWindow).location.href, "about:blank",
    "about:blank frame loaded again");
  checkFinish();
}

// ---- test 3 ----

let myFrame3 = document.createElement("frame");
document.documentElement.appendChild(myFrame3);
myFrame3.contentWindow.location.hash = "#foo";

is(myFrame3.contentWindow.location.href, "about:blank#foo",
   "created history entry with about:blank#foo");
checkFinish();

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