<!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>
<script src="resources/helpers.js"></script>
<script>

promise_test(() => {
  let helper = new content.mojom.MojoWebTestHelperPtr;
  Mojo.bindInterface(content.mojom.MojoWebTestHelper.name,
                     mojo.makeRequest(helper).handle);

  const kTestMessage = "hello world.";
  const kExpectedReply = ".dlrow olleh";
  return helper.reverse(kTestMessage).then(reply => {
    assert_equals(reply.reversed, kExpectedReply);
  });
}, "can bind interfaces");

promise_test(() => {
  let helperImpl = new TestHelperImpl;
  let interceptor =
      new MojoInterfaceInterceptor(content.mojom.MojoWebTestHelper.name);
  interceptor.oninterfacerequest = e => {
    helperImpl.bindRequest(e.handle);
  };
  interceptor.start();

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

  return helper.reverse("doesn't matter").then(reply => {
    assert_equals(reply.reversed, kTestReply);
  });
}, "can intercept calls to bindInterface");

promise_test(async () => {
  // Intercept this interface at "context" scope to check that it is being
  // requested at "process" scope.
  let helperImpl = new TestHelperImpl;
  let interceptor =
      new MojoInterfaceInterceptor(content.mojom.MojoWebTestHelper.name);
  interceptor.oninterfacerequest = e => {
    helperImpl.bindRequest(e.handle);
  };
  interceptor.start();

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

  const kTestMessage = "hello world.";
  const kExpectedReply = ".dlrow olleh";
  await helper.reverse(kTestMessage).then(reply => {
    assert_equals(reply.reversed, kExpectedReply);
  });

  interceptor.stop();
}, "can request interfaces at process scope");

promise_test(() => {
  let helperImpl = new TestHelperImpl;
  let interceptor = new MojoInterfaceInterceptor(
      content.mojom.MojoWebTestHelper.name, "process");
  interceptor.oninterfacerequest = e => {
    helperImpl.bindRequest(e.handle);
  };
  interceptor.start();

  let helper = new content.mojom.MojoWebTestHelperPtr;
  Mojo.bindInterface(content.mojom.MojoWebTestHelper.name,
                     mojo.makeRequest(helper).handle,
                     "process");
  interceptor.stop();

  return helper.reverse("doesn't matter").then(reply => {
    assert_equals(reply.reversed, kTestReply);
  });
}, "can intercept interfaces at process scope");

test(() => {
  let a = new MojoInterfaceInterceptor(content.mojom.MojoWebTestHelper.name);
  let b = new MojoInterfaceInterceptor(content.mojom.MojoWebTestHelper.name);
  a.oninterfacerequest = () => {};
  b.oninterfacerequest = () => {};
  a.start();
  assert_throws('InvalidModificationError', () => { b.start(); });
  a.stop();
}, "interface interceptors are mutually exclusive");

test(() => {
  let a = new MojoInterfaceInterceptor(content.mojom.MojoWebTestHelper.name,
                                       "process");
  let b = new MojoInterfaceInterceptor(content.mojom.MojoWebTestHelper.name,
                                       "process");
  a.oninterfacerequest = () => {};
  b.oninterfacerequest = () => {};
  a.start();
  assert_throws('InvalidModificationError', () => { b.start(); });
  a.stop();
}, "process scope interface interceptors are mutually exclusive");

promise_test(async t => {
  // First check that the interceptor can be started and intercepts requests.
  let interceptor =
      new MojoInterfaceInterceptor(content.mojom.MojoWebTestHelper.name);
  let promise = new Promise(resolve => {
    interceptor.oninterfacerequest = e => {
      resolve(e.handle);
    };
  });
  interceptor.start();

  let pipe = Mojo.createMessagePipe();
  Mojo.bindInterface(content.mojom.MojoWebTestHelper.name, pipe.handle0);
  let interceptedHandle = await promise;
  assert_true(interceptedHandle instanceof MojoHandle);
  interceptedHandle.close();
  pipe.handle1.close();

  // Stop the interceptor and make another request.
  interceptor.stop();

  let helper = new content.mojom.MojoWebTestHelperPtr;
  interceptor.oninterfacerequest = t.step_func(() => {
    assert_unreached("unexpected 'interfacerequest' event after stop");
  });
  Mojo.bindInterface(content.mojom.MojoWebTestHelper.name,
                     mojo.makeRequest(helper).handle);

  // Enusre that the interface is functioning, i.e. the request definitely was
  // not intercepted.
  await helper.reverse("abc").then(reply => {
    assert_equals(reply.reversed, "cba");
  });
  pipe.handle1.close();

  // And ensure that we can start a new interceptor for the same interface since
  // the previous one was stopped.
  interceptor =
      new MojoInterfaceInterceptor(content.mojom.MojoWebTestHelper.name);
  interceptor.oninterfacerequest = e => {};
  interceptor.start();
  interceptor.stop();
}, "interceptors cancel properly");

</script>
