diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
commit | 43a97878ce14b72f0981164f87f2e35e14151312 (patch) | |
tree | 620249daf56c0258faa40cbdcf9cfba06de2a846 /testing/web-platform/tests/webidl/ecmascript-binding/constructors.html | |
parent | Initial commit. (diff) | |
download | firefox-upstream.tar.xz firefox-upstream.zip |
Adding upstream version 110.0.1.upstream/110.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'testing/web-platform/tests/webidl/ecmascript-binding/constructors.html')
-rw-r--r-- | testing/web-platform/tests/webidl/ecmascript-binding/constructors.html | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/testing/web-platform/tests/webidl/ecmascript-binding/constructors.html b/testing/web-platform/tests/webidl/ecmascript-binding/constructors.html new file mode 100644 index 0000000000..61993a6200 --- /dev/null +++ b/testing/web-platform/tests/webidl/ecmascript-binding/constructors.html @@ -0,0 +1,132 @@ +<!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> |