| <!DOCTYPE html> | |
| <meta charset=utf-8> | |
| <title>Realm for constructed objects</title> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <div id=log></div> | |
| <script> | |
| function object_realm(dp) { | |
| // Note that browsers use the URL of the relevant global object's associated | |
| // Document. | |
| // https://github.com/w3c/DOM-Parsing/issues/46 | |
| var url = DOMParser.prototype.parseFromString.call(dp, "x", "text/html").documentURI; | |
| var file = url.slice(url.lastIndexOf("/") + 1); | |
| switch (file) { | |
| case "constructors.html": | |
| return "parent window"; | |
| case "constructors-support.html": | |
| return "child window"; | |
| default: | |
| return "???"; | |
| } | |
| } | |
| async_test(function() { | |
| var iframe = document.createElement("iframe"); | |
| iframe.onload = this.step_func_done(function() { | |
| var child = iframe.contentWindow; | |
| test(function() { | |
| var dp = new DOMParser(); | |
| assert_equals(Object.getPrototypeOf(dp), DOMParser.prototype); | |
| assert_equals(object_realm(dp), "parent window"); | |
| }, "Normal constructor in parent window"); | |
| test(function() { | |
| var dp = new child.DOMParser(); | |
| assert_equals(Object.getPrototypeOf(dp), child.DOMParser.prototype); | |
| assert_equals(object_realm(dp), "child window"); | |
| }, "Normal constructor in child window"); | |
| test(function() { | |
| var dp = Reflect.construct(child.DOMParser, [], DOMParser); | |
| assert_equals(Object.getPrototypeOf(dp), DOMParser.prototype); | |
| assert_equals(object_realm(dp), "child window"); | |
| }, "Constructor in child window with normal NewTarget from parent window"); | |
| test(function() { | |
| var dp = Reflect.construct(DOMParser, [], child.DOMParser); | |
| assert_equals(Object.getPrototypeOf(dp), child.DOMParser.prototype); | |
| assert_equals(object_realm(dp), "parent window"); | |
| }, "Constructor in parent window with normal NewTarget from child window"); | |
| test(function() { | |
| class DOMParserSubclass extends DOMParser {} | |
| var dp = new DOMParserSubclass(); | |
| assert_equals(Object.getPrototypeOf(dp), DOMParserSubclass.prototype); | |
| assert_equals(object_realm(dp), "parent window"); | |
| }, "Subclass constructor in parent window"); | |
| test(function() { | |
| var dp = new child.DOMParserSubclass(); | |
| assert_equals(Object.getPrototypeOf(dp), child.DOMParserSubclass.prototype); | |
| assert_equals(object_realm(dp), "child window"); | |
| }, "Subclass constructor in child window"); | |
| test(function() { | |
| class ForeignDOMParserSubclass extends child.DOMParser {} | |
| var dp = new ForeignDOMParserSubclass(); | |
| assert_equals(Object.getPrototypeOf(dp), ForeignDOMParserSubclass.prototype); | |
| assert_equals(object_realm(dp), "child window"); | |
| }, "Subclass constructor in parent window with parent class in child window"); | |
| test(function() { | |
| var dp = new child.ForeignDOMParserSubclass(); | |
| assert_equals(Object.getPrototypeOf(dp), child.ForeignDOMParserSubclass.prototype); | |
| assert_equals(object_realm(dp), "parent window"); | |
| }, "Subclass constructor in child window with parent class in parent window"); | |
| test(function() { | |
| var badNewTarget = function() {}; | |
| badNewTarget.prototype = 7; | |
| var dp = Reflect.construct(child.DOMParser, [], badNewTarget); | |
| assert_equals(Object.getPrototypeOf(dp), DOMParser.prototype); | |
| assert_equals(object_realm(dp), "child window"); | |
| }, "Constructor in child window with bad NewTarget from parent window"); | |
| test(function() { | |
| var dp = Reflect.construct(DOMParser, [], child.badNewTarget); | |
| assert_equals(Object.getPrototypeOf(dp), child.DOMParser.prototype); | |
| assert_equals(object_realm(dp), "parent window"); | |
| }, "Constructor in parent window with bad NewTarget from child window"); | |
| test(function() { | |
| var badNewTarget = Function.prototype.bind.call(new child.Function()); | |
| badNewTarget.prototype = 7; | |
| var dp = Reflect.construct(DOMParser, [], badNewTarget); | |
| assert_equals(Object.getPrototypeOf(dp), child.DOMParser.prototype); | |
| assert_equals(object_realm(dp), "parent window"); | |
| }, "Constructor in parent window with bad NewTarget from parent window that's a bound child window function"); | |
| test(function() { | |
| var badNewTarget = child.Function.prototype.bind.call(new Function()); | |
| badNewTarget.prototype = 7; | |
| var dp = Reflect.construct(child.DOMParser, [], badNewTarget); | |
| assert_equals(Object.getPrototypeOf(dp), DOMParser.prototype); | |
| assert_equals(object_realm(dp), "child window"); | |
| }, "Constructor in child window with bad NewTarget from child window that's a bound parent window function"); | |
| test(function() { | |
| var badNewTarget = new Proxy(new child.Function(), {}); | |
| badNewTarget.prototype = 7; | |
| var dp = Reflect.construct(DOMParser, [], badNewTarget); | |
| assert_equals(Object.getPrototypeOf(dp), child.DOMParser.prototype); | |
| assert_equals(object_realm(dp), "parent window"); | |
| }, "Constructor in parent window with bad NewTarget from parent window that's a proxy for a child window function"); | |
| test(function() { | |
| var badNewTarget = new child.Proxy(new Function(), {}); | |
| badNewTarget.prototype = 7; | |
| var dp = Reflect.construct(child.DOMParser, [], badNewTarget); | |
| assert_equals(Object.getPrototypeOf(dp), DOMParser.prototype); | |
| assert_equals(object_realm(dp), "child window"); | |
| }, "Constructor in child window with bad NewTarget from child window that's a proxy for a parent window function"); | |
| }); | |
| iframe.src = "support/constructors-support.html"; | |
| document.body.appendChild(iframe); | |
| }); | |
| </script> |