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