blob: 220f2ca80d85567a0a13246d94a62db5cd3bb736 [file] [log] [blame]
<!DOCTYPE html>
<title>Custom Elements: Constructor Tests</title>
<link rel="help" href="https://html.spec.whatwg.org/multipage/dom.html#elements-in-the-dom">
<meta name="author" title="Dominic Cooney" href="mailto:dominicc@chromium.org">
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharness-helpers.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="resources/custom-elements-helpers.js"></script>
<body>
<script>
'use strict';
test_with_window((w) => {
assert_throws(TypeError.prototype, () => {
w.HTMLElement();
}, 'calling the HTMLElement constructor should throw a TypeError');
}, 'HTMLElement constructor, invoke');
test_with_window((w) => {
assert_throws(TypeError.prototype, () => {
new w.HTMLElement();
}, 'invoking the HTMLElement constructor with a construct call should ' +
'throw a TypeError');
}, 'HTMLElement constructor, construct');
test_with_window((w) => {
class X extends w.HTMLElement {}
w.customElements.define('a-a', X);
assert_throws(TypeError.prototype, () => {
X();
}, 'calling a custom element constructor should throw a TypeError');
}, 'Custom element constructor, invoke');
test_with_window((w) => {
var num_constructor_invocations = 0;
class C extends w.HTMLElement {
constructor() {
super();
num_constructor_invocations++;
}
}
w.customElements.define('a-a', C);
let e = new C();
assert_true(e instanceof w.HTMLElement,
'the element should be an HTMLElement');
assert_equals(e.localName,
'a-a',
'the element tag name should be "a-a"');
assert_equals(e.namespaceURI,
'http://www.w3.org/1999/xhtml',
'the element should be in the HTML namespace');
assert_equals(e.prefix,
null,
'the element name should not have a prefix');
assert_equals(e.ownerDocument,
w.document,
'the element should be owned by the registry\'s associated ' +
'document');
assert_equals(num_constructor_invocations,
1,
'the constructor should have been invoked once');
}, 'Custom element constructor, construct');
test_with_window((w) => {
class C extends w.HTMLElement { }
class D extends C {}
w.customElements.define('a-a', C); // Note: Not D.
assert_throws(TypeError.prototype, () => {
new D();
}, 'constructing a custom element with a new.target with no registry ' +
'entry should throw a TypeError');
assert_throws(TypeError.prototype, () => {
Reflect.construct(C, [], 42);
}, 'constructing a custom element with a non-object new.target should ' +
'throw a TypeError');
}, 'Custom element constructor, construct invalid new.target');
</script>