<!DOCTYPE html>
<!-- Tests that the UseCounter for "shared worker usage in third party context"
  is not recorded if the two different origins has the same eTLD+1. This
  cannot be upstreamed to WPT because it tests Chrome's UseCounter mechanism.
-->
<meta charset="utf-8">
<title>
Tests that the UseCounter for "shared worker usage in third party context is not
recorded if the two different origins has the same eTLD+1.</title>
<body></body>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/get-host-info.js"></script>
<script>

function with_iframe(url) {
  return new Promise(function(resolve) {
      var frame = document.createElement('iframe');
      frame.src = url;
      frame.onload = function() { resolve(frame); };
      document.body.appendChild(frame);
    });
}

function child_frame_has_verified_use_counter() {
  return new Promise(function(resolve, reject) {
      window.onmessage = (msg) => {
        if (msg.data == 'verified_has_use_counter')
          reject("The use counter gets recorded unexpectedly.");
        else
          reject(msg.data);
      };
    });
}

promise_test(async t => {
  const remote_origin_same_etld_plus_one_url = get_host_info().HTTPS_ORIGIN +
        '/workers/resources/create-shared-worker-verify-third-party-use-counter.html';
  const frame1 = await with_iframe(remote_origin_same_etld_plus_one_url);
  t.step_timeout(function() { t.done(); }, 1000);
  await child_frame_has_verified_use_counter();
}, "Tests that the UseCounter for shared worker usage in third party context is not recorded if the two different origins has the same eTLD+1.");
</script>