<!DOCTYPE html>
<html>

<head>
    <title>frame-src-self-unique-origin</title>
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
</head>

<body>
    <p>
        The origin of an URL is called "unique" when it is considered to be
        different from every origin, including itself. The origin of a
        data-url is unique. When the current origin is unique, the CSP source
        'self' must not match any URL.
    </p>
    <script>
        var iframe = document.createElement("iframe");
        iframe.src = encodeURI(`data:text/html,
          <script>
              /* Add the CSP: frame-src: 'self'. */
              var meta = document.createElement('meta');
              meta.httpEquiv = 'Content-Security-Policy';
              meta.content = "frame-src 'self'";
              document.getElementsByTagName('head')[0].appendChild(meta);

              /* Notify the parent the iframe has been blocked. */
              window.addEventListener('securitypolicyviolation', e => {
                  if (e.originalPolicy == "frame-src 'self'")
                      window.parent.postMessage('Test PASS', '*');
              });
          </scr`+`ipt>

          This iframe should be blocked by CSP:
          <iframe src='data:text/html,blocked_iframe'></iframe>
        `);
        if (window.async_test) {
            async_test(t => { 
                window.addEventListener("message", e => {
                    if (e.data == "Test PASS")
                      t.done();
                });
            }, "Iframe's url must not match with 'self'. It must be blocked.");
        }
        document.body.appendChild(iframe);
    </script>
</body>

</html>
