<!doctype html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/utils.js"></script>
<script src="/common/get-host-info.sub.js"></script>
<script src="/shared-storage/resources/util.js"></script>
<script src="/fenced-frame/resources/utils.js"></script>

<body>
<script>
'use strict';

promise_test(async () => {
  const ancestorKey = token();

  let fencedFrameConfig0 = await runSelectURL(
    "/shared-storage/resources/embedder-context-inner.https.html",
    [ancestorKey], true);
  assert_true(validateSelectURLResult(fencedFrameConfig0, true));

  fencedFrameConfig0.setSharedStorageContext("here is some context");

  attachFencedFrame(fencedFrameConfig0, 'opaque-ads');
  const result0 = await nextValueFromServer(ancestorKey);
  assert_equals(result0, "embedder_context_inner_loaded");

  let url0 = generateURL("/shared-storage/resources/frame0.html", [ancestorKey]);
  let url1 = generateURL("/shared-storage/resources/frame1.html", [ancestorKey]);

  let fencedFrameConfig1 = await sharedStorage.selectURL(
    "verify-key-value", [{url: url0}, {url: url1}],
    {data: {'expectedKey': ancestorKey,
            'expectedValue': 'here is some context'},
     resolveToConfig: true,
     keepAlive: true});
  assert_true(validateSelectURLResult(fencedFrameConfig1, true));

  attachFencedFrame(fencedFrameConfig1, 'opaque-ads');
  const result1 = await nextValueFromServer(ancestorKey);
  assert_equals(result1, "frame1_loaded");
}, 'embedder sharedStorage.context');

promise_test(async () => {
  const ancestorKey = token();

  let fencedFrameConfig0 = await runSelectURL(
    "/shared-storage/resources/embedder-context-inner.https.html",
    [ancestorKey], true);
  assert_true(validateSelectURLResult(fencedFrameConfig0, true));

  attachFencedFrame(fencedFrameConfig0, 'opaque-ads');
  const result0 = await nextValueFromServer(ancestorKey);
  assert_equals(result0, "embedder_context_inner_loaded");

  let url0 = generateURL("/shared-storage/resources/frame0.html", [ancestorKey]);
  let url1 = generateURL("/shared-storage/resources/frame1.html", [ancestorKey]);

  let fencedFrameConfig1 = await sharedStorage.selectURL(
    "verify-key-value", [{url: url0}, {url: url1}],
    {data: {'expectedKey': ancestorKey, 'expectedValue': 'undefined'},
     resolveToConfig: true,
     keepAlive: true});
  assert_true(validateSelectURLResult(fencedFrameConfig1, true));

  attachFencedFrame(fencedFrameConfig1, 'opaque-ads');
  const result1 = await nextValueFromServer(ancestorKey);
  assert_equals(result1, "frame1_loaded");
}, 'undefined embedder sharedStorage.context');

promise_test(async () => {
  const outerKey = token();
  const innerKey0 = token();
  const innerKey1 = token();

  let fencedFrameConfig0 = await runSelectURL(
    "/shared-storage/resources/embedder-context-nested-inner.https.html",
    [outerKey, innerKey0, innerKey1], true);
  assert_true(validateSelectURLResult(fencedFrameConfig0, true));

  fencedFrameConfig0.setSharedStorageContext("here is some context");

  attachFencedFrame(fencedFrameConfig0, 'opaque-ads');
  const result0 = await nextValueFromServer(outerKey);
  assert_equals(result0, "embedder_context_nested_inner_loaded");

  let url0 = generateURL("/shared-storage/resources/frame0.html", [outerKey]);
  let url1 = generateURL("/shared-storage/resources/frame1.html", [outerKey]);

  let fencedFrameConfig1 = await sharedStorage.selectURL(
    "verify-key-value", [{url: url0}, {url: url1}],
    {data: {'expectedKey': innerKey0,
            'expectedValue': 'here is some context'},
     resolveToConfig: true});
  assert_true(validateSelectURLResult(fencedFrameConfig1, true));

  attachFencedFrame(fencedFrameConfig1, 'opaque-ads');
  const result1 = await nextValueFromServer(outerKey);
  assert_equals(result1, "frame1_loaded");

  let iframeURL =
    generateURL("/shared-storage/resources/embedder-context-nested-iframe.https.html",
                [outerKey, innerKey1]);
  iframeURL = getRemoteOriginURL(iframeURL);
  attachIFrame(iframeURL);
  const result2 = await nextValueFromServer(outerKey);
  assert_equals(result2, "embedder_context_nested_iframe_loaded");
}, 'embedder sharedStorage.context with nested iframes');
</script>
</body>
