<!-- This tests the agreed upon outcome for https://www.w3.org/Bugs/Public/show_bug.cgi?id=24652
     that has not been reflected in the IDL standard yet due to lack of editing resources.

     TODO: https://github.com/w3c/webcrypto/issues/85 -->
<!DOCTYPE html>
<meta charset=utf-8>
<title>Current Realm</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
<iframe srcdoc="<body test>"></iframe>
<script>
 setup({explicit_done:true})

 function isObjectFromGlobal(object, global) {
   return object instanceof global.Object;
 }
 function assert_global(obj) {
   assert_false(isObjectFromGlobal(obj, self), obj + " should not be from top-level Realm")
   assert_true(isObjectFromGlobal(obj, self[0]), obj + " should be from <iframe> Realm")
 }

 onload = function() {
   [["querySelectorAll", "test"],
    ["createElement", "x"],
    ["createElementNS", null, "x"],
    ["createDocumentFragment"],
    ["createTextNode", "test"],
    ["createComment", "test"],
    ["createProcessingInstruction", "x", "x"],
    ["createAttribute", "x"],
    ["createAttributeNS", "x", "x"],
    ["createEvent", "Event"],
    ["createRange"],
    ["createNodeIterator", document.head],
    ["createTreeWalker", document.head]].forEach(function(val) {
     test(function() {
       var obj = self[0].document[val[0]](val[1], val[2])
       assert_global(obj)

       obj = Document.prototype[val[0]].call(self[0].document, val[1], val[2])
       assert_global(obj)
     }, val[0])
   })

   // Note: these are not [NewObject] and can be cached. But across globals?
   ;[["getElementsByTagName", "x"],
     ["getElementsByTagNameNS", null, "x"],
     ["getElementsByClassName", "x"]].forEach(function(val) {
     test(function() {
       var obj = self[0].document[val[0]](val[1], val[2])
       assert_global(obj)

       var obj2 = Document.prototype[val[0]].call(self[0].document, val[1], val[2])
       assert_global(obj)

       assert_equals(obj, obj2) // XXX this might be controversial
     }, val[0])
   })

   ;[["createDocumentType", "x", "", ""],
     ["createDocument", null, "", null],
     ["createHTMLDocument", "x"]].forEach(function(val) {
     test(function() {
       var obj = self[0].document.implementation[val[0]](val[1], val[2], val[3])
       assert_global(obj)

       obj = DOMImplementation.prototype[val[0]].call(self[0].document.implementation, val[1], val[2], val[3])
       assert_global(obj)
     }, val[0])
   })

   ;[["item", 0],
     ["getNamedItem", "test"],
     ["getNamedItemNS", null, "test"]].forEach(function(val) {
     test(function() {
       var obj = self[0].document.body.attributes[val[0]](val[1], val[2])
       assert_global(obj)

       var obj2 = NamedNodeMap.prototype[val[0]].call(self[0].document.body.attributes, val[1], val[2])
       assert_global(obj)

       assert_equals(obj, obj2)
     }, "NamedNodeMap " + val[0])
   })

   test(function() {
     var c = self[0].document.createTextNode(""),
         obj = c.splitText(0)
     assert_global(obj)

     obj = Text.prototype.splitText.call(c, "")
     assert_global(obj)
   }, "splitText")

   ;["extractContents",
     "cloneContents",
     "cloneRange"].forEach(function(val) {
     test(function() {
       var c = self[0].document.createRange(),
           obj = c[val]()
       assert_global(obj)

       obj = Range.prototype[val].call(c)
       assert_global(obj)
     }, val)
   })

   ;["2d", "webgl"].forEach(function(val) {
     test(function() {
       var c = self[0].document.createElement("canvas"),
           obj = c.getContext(val)

       // WebGL might not be enabled in this environment
       if (!obj && val === "webgl") {
         return;
       }

       assert_global(obj)
       obj = HTMLCanvasElement.prototype.getContext.call(c, val)
       assert_global(obj)
     }, "getContext " + val)
   })

   ;[["createImageData", 5, 5],
     ["getImageData", 5, 5, 5, 5]].forEach(function(val) {
     test(function() {
       var c = self[0].document.createElement("canvas").getContext("2d"),
           obj = c[val[0]](val[1], val[2], val[3], val[4]);
       assert_global(obj)
       assert_global(obj.data)

       obj = CanvasRenderingContext2D.prototype[val[0]].call(c, val[1], val[2], val[3], val[4]);
       assert_global(obj)
       assert_global(obj.data)
     }, val[0])
   })

   test(function() {
     var c = new self[0].FontFace("test", "about:blank"),
         obj = c.load()
     assert_global(obj)

     obj = FontFace.prototype.load.call(c)
     assert_global(obj)
   }, "FontFace's load()")

   done()
 }
</script>
