<!DOCTYPE html>
<html>
  <head>
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
    <script src="support/test_utils.sub.js"></script>
  </head>

  <body>
    <script>
      /**
       * @param Array.<Array.<Datatype>> combination A combination of datatypes.
       * @param Dict.<string, boolean> report A map between a datatype name and
       *     whether it is empty.
       * @return boolean Whether all datatypes are empty if and only if they are
       *     included in the |combination|.
       */
      function verifyDatatypes(combination, report) {
        TestUtils.DATATYPES.forEach(function(datatype) {
          if (combination.indexOf(datatype) != -1) {
            assert_true(
                report[datatype.name],
                datatype.name + " should have been cleared.");
          } else {
            assert_false(
                report[datatype.name],
                datatype.name + " should NOT have been cleared.");
          }
        });
      }

      TestUtils.COMBINATIONS.forEach(function(combination) {
        var test_name =
            "Clear datatypes on navigation: " +
            combination.map(function(e) { return e.name; }).join(", ");

        promise_test(function(test) {
          return new Promise(function(resolve_test, reject_test) {
            TestUtils.populateDatatypes()
                .then(function() {
                  // Navigate to a resource with a Clear-Site-Data header in
                  // an iframe, then verify that the correct types have been
                  // deleted.
                  return new Promise(function(resolve, reject) {
                    window.addEventListener("message", resolve);
                    var iframe = document.createElement("iframe");
                    iframe.src = TestUtils.getClearSiteDataUrl(combination);
                    document.body.appendChild(iframe);
                  }).then(function(messageEvent) {
                    verifyDatatypes(combination, messageEvent.data);
                    resolve_test();
                  });
                });
          });
        }, test_name);
      });
    </script>
  </body>
</html>
