<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
  const namespace_url= {
    "HTML": "http://www.w3.org/1999/xhtml",
    "SVG": "http://www.w3.org/2000/svg",
  }
  const test_cases = [
    ["meh"    , "HTML"],
    ["div"    , "HTML"],
    ["script" , "HTML"],
    ["meh"    , "SVG"],
    ["svg"    , "SVG"],
    ["script" , "SVG"],
  ];

  test_cases.forEach(([localName, namespace]) => {
    test(t => {
      const element = document.createElementNS(namespace_url[namespace], localName);
      t.add_cleanup(() => element.remove());
      assert_equals(element.nonce, "", "Initial IDL attribute value");
      assert_equals(element.getAttribute("nonce"), null, "Initial content attribute");

      element.setAttribute("nonce", "x");
      assert_equals(element.nonce, "x", "IDL attribute is modified after content attribute set");
      assert_equals(element.getAttribute("nonce"), "x", "Content attribute is modified after content attribute set");

      document.body.appendChild(element);
      assert_equals(element.nonce, "x", "IDL attribute is unchanged after element insertion");
      assert_equals(element.getAttribute("nonce"), "", "Content attribute is changed after element insertion");
    }, `Basic nonce tests for ${localName} in ${namespace} namespace`);

    test(t => {
      const element = document.createElementNS(namespace_url[namespace], localName);
      t.add_cleanup(() => element.remove());
      element.setAttribute("nonce", "x");
      assert_equals(element.nonce, "x", "IDL attribute is modified after content attribute set");

      element.removeAttribute("nonce");
      assert_equals(element.nonce, "", "IDL attribute is empty after content attribute removal");
    }, `Ensure that removal of content attribute does not affect IDL attribute for ${localName} in ${namespace} namespace`);

    test(t => {
      const element = document.createElementNS(namespace_url[namespace], localName);
      t.add_cleanup(() => element.remove());
      assert_equals(element.nonce, "");
      assert_equals(element.getAttribute("nonce"), null);

      element.setAttribute("nonce", "");
      assert_equals(element.nonce, "");
      assert_equals(element.getAttribute("nonce"), "");

      document.body.appendChild(element);
      assert_equals(element.nonce, "");
      assert_equals(element.getAttribute("nonce"), "");

      element.removeAttribute("nonce");
      assert_equals(element.nonce, "");
      assert_equals(element.getAttribute("nonce"), null);
    }, `Test empty nonces for ${localName} in ${namespace} namespace`);
  });
</script>
