promises.push(test_with_new_window((testWindow) => { // Test calling the HTMLElement constructor. (() => { SimpleTest.doesThrow(() => { testWindow.HTMLElement(); }, 'calling the HTMLElement constructor should throw a TypeError'); })(); // Test constructing a HTMLELement. (() => { SimpleTest.doesThrow(() => { new testWindow.HTMLElement(); }, 'constructing a HTMLElement should throw a TypeError'); })(); // Test constructing a custom element with defining HTMLElement as entry. (() => { testWindow.customElements.define('x-defining-html-element', testWindow.HTMLElement); SimpleTest.doesThrow(() => { new testWindow.HTMLElement(); }, 'constructing a custom element with defining HTMLElement as registry ' + 'entry should throw a TypeError'); })(); // Test calling a custom element constructor and constructing an autonomous // custom element. (() => { let num_constructor_invocations = 0; class X extends testWindow.HTMLElement { constructor() { super(); num_constructor_invocations++; } } testWindow.customElements.define('x-element', X); SimpleTest.doesThrow(() => { X(); }, 'calling an autonomous custom element constructor should throw a TypeError'); let element = new X(); SimpleTest.is(Object.getPrototypeOf(Cu.waiveXrays(element)), X.prototype, 'constructing an autonomous custom element; ' + 'the element should be a registered constructor'); SimpleTest.is(element.localName, 'x-element', 'constructing an autonomous custom element; ' + 'the element tag name should be "x-element"'); SimpleTest.is(element.namespaceURI, 'http://www.w3.org/1999/xhtml', 'constructing an autonomous custom element; ' + 'the element should be in the HTML namespace'); SimpleTest.is(element.prefix, null, 'constructing an autonomous custom element; ' + 'the element name should not have a prefix'); SimpleTest.is(element.ownerDocument, testWindow.document, 'constructing an autonomous custom element; ' + 'the element should be owned by the registry\'s associated ' + 'document'); SimpleTest.is(num_constructor_invocations, 1, 'constructing an autonomous custom element; ' + 'the constructor should have been invoked once'); })(); // Test if prototype is no an object. (() => { function ElementWithNonObjectPrototype() { let o = Reflect.construct(testWindow.HTMLElement, [], new.target); SimpleTest.is(Object.getPrototypeOf(Cu.waiveXrays(o)), window.HTMLElement.prototype, 'constructing an autonomous custom element; ' + 'if prototype is not object, fallback from NewTarget\'s realm'); } // Prototype have to be an object during define(), otherwise define will // throw an TypeError exception. ElementWithNonObjectPrototype.prototype = {}; testWindow.customElements.define('x-non-object-prototype', ElementWithNonObjectPrototype); ElementWithNonObjectPrototype.prototype = "string"; new ElementWithNonObjectPrototype(); })(); }));