| <!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> |