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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
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();
})();
})
);
|