<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8"/>
    <title>HTML Test: window.frameElement</title>
    <link rel="author" title="Intel" href="http://www.intel.com/" />
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
  </head>
  <body>
    <!-- t1 (same-origin)-->
    <iframe id="iframe_0"></iframe>
    <iframe id="iframe_1" src="./resources/frameElement-nested-frame.html"></iframe>
    <object id="object_id" name="object_name" type="text/html" data="about:blank"></object>
    <embed id="embed_id" name="embed_name" type="image/svg+xml" src="/images/green.svg" />

    <!-- t2 (cross-origin) -->
    <iframe name="iframe_2" src="http://{{hosts[alt][]}}:{{ports[http][0]}}/html/browsers/windows/nested-browsing-contexts/resources/frameElement-nested-frame.html"></iframe>

    <!-- t3 (cross-origin) -->
    <iframe id="iframe_3" src="http://{{hosts[alt][]}}:{{ports[http][0]}}/html/browsers/windows/nested-browsing-contexts/resources/frameElement-window-post.html"></iframe>

    <script>
      test(function() {
        assert_equals(window.frameElement, null,
          "The frameElement attribute should be null.");
      }, "The window's frameElement attribute must return null if it is not a nested browsing context");

      var t1 = async_test("The window's frameElement attribute must return its container element if it is a nested browsing context");
      window.addEventListener("load", t1.step_func_done(function() {
        assert_equals(frames[0].frameElement, document.getElementById("iframe_0"),
          "The frameElement attribute should be the first iframe element.");
        assert_equals(window["object_name"].frameElement, document.getElementById("object_id"),
          "The frameElement attribute should be the object element.");
        assert_equals(window["embed_name"].frameElement, document.getElementById("embed_id"),
          "The frameElement attribute should be the embed element.");
        assert_equals(document.getElementById("iframe_1").contentWindow[0].frameElement,
          document.getElementById("iframe_1").contentDocument.getElementById("f1"),
          "The frameElement attribute should be the frame element in 'resources/frameElement-nested-frame.html'.");
      }));

      var t2 = async_test("The SecurityError must be thrown if the window accesses to frameElement attribute of a Window which does not have the same effective script origin");
      window.addEventListener("load", t2.step_func_done(function() {
        assert_throws("SecurityError", function() {
            frames["iframe_2"].frameElement;
          },
          "The SecurityError exception should be thrown.");
      }));

      var t3 = async_test("The window's frameElement attribute must return null if the container's document does not have the same effective script origin");
      window.addEventListener("load", function() {
        window.addEventListener("message", function(event) {
          var data = JSON.parse(event.data);
          if (data.name == "testcase3") {
            t3.step(function() {
              assert_equals(data.result, "window.frameElement = null",
                "The frameElement attribute should be null.");
              t3.done();
            });
          }
        }, false);
        document.getElementById("iframe_3").contentWindow.postMessage(null, "*");
      })
    </script>
  </body>
</html>
