summaryrefslogtreecommitdiffstats
path: root/dom/tests/mochitest/webcomponents/htmlconstructor_autonomous_tests.js
diff options
context:
space:
mode:
Diffstat (limited to 'dom/tests/mochitest/webcomponents/htmlconstructor_autonomous_tests.js')
-rw-r--r--dom/tests/mochitest/webcomponents/htmlconstructor_autonomous_tests.js107
1 files changed, 107 insertions, 0 deletions
diff --git a/dom/tests/mochitest/webcomponents/htmlconstructor_autonomous_tests.js b/dom/tests/mochitest/webcomponents/htmlconstructor_autonomous_tests.js
new file mode 100644
index 0000000000..75b42389cc
--- /dev/null
+++ b/dom/tests/mochitest/webcomponents/htmlconstructor_autonomous_tests.js
@@ -0,0 +1,107 @@
+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();
+ })();
+ })
+);