<!DOCTYPE html>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
<script src="file:///gen/content/test/data/mojo_web_test_helper_test.mojom.js"></script>
<body>
<script>

function frameLoaded(frame) {
  return new Promise(resolve => {
    let eventHandler = e => {
      frame.removeEventListener('load', eventHandler);
      resolve();
    };
    frame.addEventListener('load', eventHandler);
  });
}

promise_test(async () => {
  let frame = document.createElement("iframe");
  let promise = frameLoaded(frame);
  document.body.appendChild(frame);
  await promise;

  // Save a reference to the Mojo object from the child frame so that we can
  // make calls to it after the context has been destroyed.
  let frameMojo = frame.contentWindow.Mojo;
  document.body.removeChild(frame);

  let helper = new content.mojom.MojoWebTestHelperPtr;
  frameMojo.bindInterface(content.mojom.MojoWebTestHelper.name,
                          mojo.makeRequest(helper).handle);

  try {
    let reply = await helper.reverse("hello world.");
    assert_unreached();
  } catch (e) {
    // Connection failure expected.
  }
}, "Mojo object is safe to use after its frame has been detached");

promise_test(async () => {
  let frame = document.createElement("iframe");
  let promise = frameLoaded(frame);
  document.body.appendChild(frame);
  await promise;

  // Save a reference to the MojoInterfaceInterceptor constructor from the child
  // frame so that we can be used after the context has been destroyed.
  let frameMojoInterfaceInterceptor =
      frame.contentWindow.MojoInterfaceInterceptor;
  document.body.removeChild(frame);

  let interceptor = new frameMojoInterfaceInterceptor(
      content.mojom.MojoWebTestHelper.name);
  try {
    interceptor.start();
    assert_unreached();
  } catch (e) {
    // Failure expected.
  }
}, "MojoInterfaceInterceptor constructor is safe to use after its frame has been detached");

promise_test(async () => {
  let frame = document.createElement("iframe");
  let promise = frameLoaded(frame);
  document.body.appendChild(frame);
  await promise;

  // Create the interceptor while the frame is attached so that it is associated
  // with the frame's execution context.
  let interceptor = new frame.contentWindow.MojoInterfaceInterceptor(
      content.mojom.MojoWebTestHelper.name);
  document.body.removeChild(frame);

  try {
    interceptor.start();
    assert_unreached();
  } catch (e) {
    // Failure expected.
  }
}, "MojoInterfaceInterceptor can't be started after its frame has been detached");

promise_test(async () => {
  let frame = document.createElement("iframe");
  let promise = frameLoaded(frame);
  document.body.appendChild(frame);
  await promise;

  // Create the interceptor and start it while the frame is attached.
  let interceptor = new frame.contentWindow.MojoInterfaceInterceptor(
      content.mojom.MojoWebTestHelper.name);
  interceptor.start();
  document.body.removeChild(frame);

  // stop() will succeed because it is implicitly called when the execution
  // context is destroyed.
  interceptor.stop();
}, "MojoInterfaceInterceptor is stopped on frame destruction");

</script>
</body>
