<!DOCTYPE html>
<title>Test Content Index API</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/common/utils.js"></script>
<script src="/common/dispatcher/dispatcher.js"></script>
<script src="resources/utils.js"></script>

<body>
<script>
const id = 'fenced-frame-id';

promise_test(async () => {
  const frame = attachFencedFrameContext();
  try {
    await frame.execute(async (id) => {
      navigator.serviceWorker.register(
        "empty-worker.js", { scope: location.href });
      const registration = await navigator.serviceWorker.ready;
      return registration.index.add({
        id,
        title: 'same title',
        description: 'same description',
        url: 'resources/'
      });
    }, [id]);
    assert_unreached('index.add executed without error; want error');
  } catch(e) {
    assert_equals(e.message, "Failed to execute 'add' on 'ContentIndex': " +
    "ContentIndex is not allowed in fenced frames.")
  }
}, 'index.add should fail inside a fenced frame');

promise_test(async () => {
  const frame = attachFencedFrameContext();
  try {
    await frame.execute(async (id) => {
      navigator.serviceWorker.register(
        "empty-worker.js", { scope: location.href });
      const registration = await navigator.serviceWorker.ready;
      return registration.index.delete(id);
    }, [id]);
    assert_unreached('index.delete executed without error; want error');
  } catch(e) {
    assert_equals(e.message, "Failed to execute 'delete' on 'ContentIndex': " + "ContentIndex is not allowed in fenced frames.");
  }
}, 'index.delete should fail inside a fenced frame');

promise_test(async () => {
  const frame = attachFencedFrameContext();
  try {
    await frame.execute(async () => {
      navigator.serviceWorker.register(
        "empty-worker.js", { scope: location.href });
      const registration = await navigator.serviceWorker.ready;
      return registration.index.getAll();
    });
    assert_unreached('index.getAll executed without error; want error');
  } catch(e) {
    assert_equals(e.message, "Failed to execute 'getAll' on 'ContentIndex': " + "ContentIndex is not allowed in fenced frames.");
  }
}, 'index.getAll should fail inside a fenced frame');

promise_test(async () => {
  const frame = attachFencedFrameContext();
  const message = await frame.execute(async () => {
    const getController = () => {
      if (navigator.serviceWorker.controller) {
        return navigator.serviceWorker.controller;
      }
      return new Promise(resolve => {
        navigator.serviceWorker.addEventListener('controllerchange', () => {
          resolve(navigator.serviceWorker.controller);
        });
      });
    };

    navigator.serviceWorker.register(
      "content-index-sw.js", { scope: location.href });
    return new Promise(async resolve => {
      const ctrl = await getController();
      ctrl.postMessage('add');
      navigator.serviceWorker.onmessage = e => {
        resolve(e.data);
      }
    });
  });
  assert_equals(message, "Failed to execute 'add' on 'ContentIndex': " +
    "ContentIndex is not allowed in fenced frames.");
}, 'index.add should fail from the service worker inside a fenced frame');

promise_test(async () => {
  const frame = attachFencedFrameContext();
  const message = await frame.execute(async () => {
    const getController = () => {
      if (navigator.serviceWorker.controller) {
        return navigator.serviceWorker.controller;
      }
      return new Promise(resolve => {
        navigator.serviceWorker.addEventListener('controllerchange', () => {
          resolve(navigator.serviceWorker.controller);
        });
      });
    };

    navigator.serviceWorker.register(
      "content-index-sw.js", { scope: location.href });
    return new Promise(async resolve => {
      const ctrl = await getController();
      ctrl.postMessage('delete');
      navigator.serviceWorker.onmessage = e => {
        resolve(e.data);
      }
    });
  });
  assert_equals(message, "Failed to execute 'delete' on 'ContentIndex': " +
    "ContentIndex is not allowed in fenced frames.");
}, 'index.delete should fail from the service worker inside a fenced frame');

promise_test(async () => {
  const frame = attachFencedFrameContext();
  const message = await frame.execute(async () => {
    const getController = () => {
      if (navigator.serviceWorker.controller) {
        return navigator.serviceWorker.controller;
      }
      return new Promise(resolve => {
        navigator.serviceWorker.addEventListener('controllerchange', () => {
          resolve(navigator.serviceWorker.controller);
        });
      });
    };

    navigator.serviceWorker.register(
      "content-index-sw.js", { scope: location.href });
    return new Promise(async resolve => {
      const ctrl = await getController();
      ctrl.postMessage('getAll');
      navigator.serviceWorker.onmessage = e => {
        resolve(e.data);
      }
    });
  });
  assert_equals(message, "Failed to execute 'getAll' on 'ContentIndex': " +
    "ContentIndex is not allowed in fenced frames.");
}, 'index.getAll should fail from the service worker inside a fenced frame');
</script>
</body>
