summaryrefslogtreecommitdiffstats
path: root/dom/tests/mochitest/webcomponents/htmlconstructor_autonomous_tests.js
blob: 636d9aff6f9a2f801b713422c765a5a2a583e56b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
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();
  })();
}));