'use strict';

// This script depends on the following scripts:
//    /fs/resources/messaging-helpers.js
//    /fs/resources/messaging-blob-helpers.js
//    /fs/resources/messaging-serialize-helpers.js
//    /fs/resources/test-helpers.js

directory_test(async (t, root_dir) => {
  const iframe = await add_iframe(t, {src: kDocumentMessageTarget});
  await do_post_message_test(
      t, root_dir, /*receiver=*/ self, /*target=*/ iframe.contentWindow,
      /*target_origin=*/ '*');
}, 'Send and receive messages using a same origin iframe.');

directory_test(async (t, root_dir) => {
  const iframe = await add_iframe(t, {
    src: kDocumentMessageTarget,
    sandbox: 'allow-scripts allow-same-origin'
  });
  await do_post_message_test(
      t, root_dir, /*receiver=*/ self, /*target=*/ iframe.contentWindow,
      /*target_origin=*/ '*');
}, 'Send and receive messages using a sandboxed same origin iframe.');

directory_test(async (t, root_dir) => {
  const blob_url = await create_message_target_blob_url(t);
  const iframe = await add_iframe(t, {src: blob_url});
  await do_post_message_test(
      t, root_dir, /*receiver=*/ self, /*target=*/ iframe.contentWindow,
      /*target_origin=*/ '*');
}, 'Send and receive messages using a blob iframe.');

directory_test(async (t, root_dir) => {
  const iframe_html = await create_message_target_html_without_subresources(t);
  const iframe = await add_iframe(t, {srcdoc: iframe_html});
  await do_post_message_test(
      t, root_dir, /*receiver=*/ self, /*target=*/ iframe.contentWindow,
      /*target_origin=*/ '*');
}, 'Send and receive messages using an iframe srcdoc.');
