summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/custom-elements/HTMLElement-constructor-customized-bulitins.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/custom-elements/HTMLElement-constructor-customized-bulitins.html')
-rw-r--r--testing/web-platform/tests/custom-elements/HTMLElement-constructor-customized-bulitins.html62
1 files changed, 62 insertions, 0 deletions
diff --git a/testing/web-platform/tests/custom-elements/HTMLElement-constructor-customized-bulitins.html b/testing/web-platform/tests/custom-elements/HTMLElement-constructor-customized-bulitins.html
new file mode 100644
index 0000000000..9244dfe4ad
--- /dev/null
+++ b/testing/web-platform/tests/custom-elements/HTMLElement-constructor-customized-bulitins.html
@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: HTMLElement must allow subclassing</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="HTMLElement must allow subclassing">
+<link rel="help" href="https://html.spec.whatwg.org/#html-element-constructors">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+test(function() {
+ class SomeCustomElement extends HTMLElement {};
+ var getCount = 0;
+ var countingProxy = new Proxy(SomeCustomElement, {
+ get: function(target, prop, receiver) {
+ if (prop == "prototype") {
+ ++getCount;
+ }
+ return Reflect.get(target, prop, receiver);
+ }
+ });
+ customElements.define("failure-counting-element-1", countingProxy,
+ { extends: "button" });
+ // define() gets the prototype of the constructor it's passed, so
+ // reset the counter.
+ getCount = 0;
+ assert_throws_js(TypeError,
+ function () { new countingProxy() },
+ "Should not be able to construct an HTMLElement named 'button'");
+ assert_equals(getCount, 0, "Should never have gotten .prototype");
+}, 'HTMLElement constructor must not get .prototype until it finishes its extends sanity checks, calling proxy constructor directly');
+
+test(function() {
+ class SomeCustomElement extends HTMLElement {};
+ var getCount = 0;
+ var countingProxy = new Proxy(SomeCustomElement, {
+ get: function(target, prop, receiver) {
+ if (prop == "prototype") {
+ ++getCount;
+ }
+ return Reflect.get(target, prop, receiver);
+ }
+ });
+ customElements.define("failure-counting-element-2", countingProxy,
+ { extends: "button" });
+ // define() gets the prototype of the constructor it's passed, so
+ // reset the counter.
+ getCount = 0;
+ assert_throws_js(TypeError,
+ function () { Reflect.construct(HTMLElement, [], countingProxy) },
+ "Should not be able to construct an HTMLElement named 'button'");
+ assert_equals(getCount, 0, "Should never have gotten .prototype");
+}, 'HTMLElement constructor must not get .prototype until it finishes its extends sanity checks, calling via Reflect');
+
+</script>
+</body>
+</html>
+