glass-easel 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/README.md +40 -0
  2. package/dist/glass_easel.all.d.ts +1 -0
  3. package/dist/glass_easel.all.js +2 -0
  4. package/dist/glass_easel.all.js.map +1 -0
  5. package/dist/glass_easel.domlike.global.d.ts +1 -0
  6. package/dist/glass_easel.domlike.global.js +2 -0
  7. package/dist/glass_easel.domlike.global.js.map +1 -0
  8. package/dist/index.d.ts +1 -0
  9. package/dist/index.js +1 -0
  10. package/dist/types/src/backend/backend_protocol.d.ts +119 -0
  11. package/dist/types/src/backend/backend_protocol.d.ts.map +1 -0
  12. package/dist/types/src/backend/composed_backend_protocol.d.ts +90 -0
  13. package/dist/types/src/backend/composed_backend_protocol.d.ts.map +1 -0
  14. package/dist/types/src/backend/domlike_backend_protocol.d.ts +76 -0
  15. package/dist/types/src/backend/domlike_backend_protocol.d.ts.map +1 -0
  16. package/dist/types/src/backend/mode.d.ts +46 -0
  17. package/dist/types/src/backend/mode.d.ts.map +1 -0
  18. package/dist/types/src/backend/suggested_backend_protocol.d.ts +30 -0
  19. package/dist/types/src/backend/suggested_backend_protocol.d.ts.map +1 -0
  20. package/dist/types/src/behavior.d.ts +428 -0
  21. package/dist/types/src/behavior.d.ts.map +1 -0
  22. package/dist/types/src/class_list.d.ts +79 -0
  23. package/dist/types/src/class_list.d.ts.map +1 -0
  24. package/dist/types/src/component.d.ts +291 -0
  25. package/dist/types/src/component.d.ts.map +1 -0
  26. package/dist/types/src/component_params.d.ts +239 -0
  27. package/dist/types/src/component_params.d.ts.map +1 -0
  28. package/dist/types/src/component_space.d.ts +164 -0
  29. package/dist/types/src/component_space.d.ts.map +1 -0
  30. package/dist/types/src/data_path.d.ts +5 -0
  31. package/dist/types/src/data_path.d.ts.map +1 -0
  32. package/dist/types/src/data_proxy.d.ts +107 -0
  33. package/dist/types/src/data_proxy.d.ts.map +1 -0
  34. package/dist/types/src/data_utils.d.ts +3 -0
  35. package/dist/types/src/data_utils.d.ts.map +1 -0
  36. package/dist/types/src/element.d.ts +275 -0
  37. package/dist/types/src/element.d.ts.map +1 -0
  38. package/dist/types/src/element_iterator.d.ts +43 -0
  39. package/dist/types/src/element_iterator.d.ts.map +1 -0
  40. package/dist/types/src/event.d.ts +104 -0
  41. package/dist/types/src/event.d.ts.map +1 -0
  42. package/dist/types/src/external_shadow_tree.d.ts +20 -0
  43. package/dist/types/src/external_shadow_tree.d.ts.map +1 -0
  44. package/dist/types/src/func_arr.d.ts +39 -0
  45. package/dist/types/src/func_arr.d.ts.map +1 -0
  46. package/dist/types/src/global_options.d.ts +111 -0
  47. package/dist/types/src/global_options.d.ts.map +1 -0
  48. package/dist/types/src/index.d.ts +43 -0
  49. package/dist/types/src/index.d.ts.map +1 -0
  50. package/dist/types/src/mutation_observer.d.ts +79 -0
  51. package/dist/types/src/mutation_observer.d.ts.map +1 -0
  52. package/dist/types/src/native_node.d.ts +8 -0
  53. package/dist/types/src/native_node.d.ts.map +1 -0
  54. package/dist/types/src/node.d.ts +49 -0
  55. package/dist/types/src/node.d.ts.map +1 -0
  56. package/dist/types/src/relation.d.ts +47 -0
  57. package/dist/types/src/relation.d.ts.map +1 -0
  58. package/dist/types/src/render.d.ts +3 -0
  59. package/dist/types/src/render.d.ts.map +1 -0
  60. package/dist/types/src/selector.d.ts +32 -0
  61. package/dist/types/src/selector.d.ts.map +1 -0
  62. package/dist/types/src/shadow_root.d.ts +136 -0
  63. package/dist/types/src/shadow_root.d.ts.map +1 -0
  64. package/dist/types/src/template_engine.d.ts +18 -0
  65. package/dist/types/src/template_engine.d.ts.map +1 -0
  66. package/dist/types/src/text_node.d.ts +32 -0
  67. package/dist/types/src/text_node.d.ts.map +1 -0
  68. package/dist/types/src/tmpl/index.d.ts +18 -0
  69. package/dist/types/src/tmpl/index.d.ts.map +1 -0
  70. package/dist/types/src/tmpl/native_rendering.d.ts +45 -0
  71. package/dist/types/src/tmpl/native_rendering.d.ts.map +1 -0
  72. package/dist/types/src/tmpl/proc_gen_wrapper.d.ts +80 -0
  73. package/dist/types/src/tmpl/proc_gen_wrapper.d.ts.map +1 -0
  74. package/dist/types/src/tmpl/proc_gen_wrapper_dom.d.ts +50 -0
  75. package/dist/types/src/tmpl/proc_gen_wrapper_dom.d.ts.map +1 -0
  76. package/dist/types/src/tmpl/range_list_diff.d.ts +19 -0
  77. package/dist/types/src/tmpl/range_list_diff.d.ts.map +1 -0
  78. package/dist/types/src/trait_behaviors.d.ts +38 -0
  79. package/dist/types/src/trait_behaviors.d.ts.map +1 -0
  80. package/dist/types/src/virtual_node.d.ts +10 -0
  81. package/dist/types/src/virtual_node.d.ts.map +1 -0
  82. package/dist/types/tests/backend/domlike.test.d.ts +2 -0
  83. package/dist/types/tests/backend/domlike.test.d.ts.map +1 -0
  84. package/dist/types/tests/base/env.d.ts +29 -0
  85. package/dist/types/tests/base/env.d.ts.map +1 -0
  86. package/dist/types/tests/base/match.d.ts +9 -0
  87. package/dist/types/tests/base/match.d.ts.map +1 -0
  88. package/dist/types/tests/core/backend.test.d.ts +2 -0
  89. package/dist/types/tests/core/backend.test.d.ts.map +1 -0
  90. package/dist/types/tests/core/behavior.test.d.ts +2 -0
  91. package/dist/types/tests/core/behavior.test.d.ts.map +1 -0
  92. package/dist/types/tests/core/component_space.test.d.ts +2 -0
  93. package/dist/types/tests/core/component_space.test.d.ts.map +1 -0
  94. package/dist/types/tests/core/data_update.test.d.ts +2 -0
  95. package/dist/types/tests/core/data_update.test.d.ts.map +1 -0
  96. package/dist/types/tests/core/misc.test.d.ts +2 -0
  97. package/dist/types/tests/core/misc.test.d.ts.map +1 -0
  98. package/dist/types/tests/core/placeholder.test.d.ts +2 -0
  99. package/dist/types/tests/core/placeholder.test.d.ts.map +1 -0
  100. package/dist/types/tests/core/slot.test.d.ts +2 -0
  101. package/dist/types/tests/core/slot.test.d.ts.map +1 -0
  102. package/dist/types/tests/core/trait_behaviors.test.d.ts +2 -0
  103. package/dist/types/tests/core/trait_behaviors.test.d.ts.map +1 -0
  104. package/dist/types/tests/tmpl/binding_map.test.d.ts +2 -0
  105. package/dist/types/tests/tmpl/binding_map.test.d.ts.map +1 -0
  106. package/dist/types/tests/tmpl/event.test.d.ts +2 -0
  107. package/dist/types/tests/tmpl/event.test.d.ts.map +1 -0
  108. package/dist/types/tests/tmpl/expression.test.d.ts +2 -0
  109. package/dist/types/tests/tmpl/expression.test.d.ts.map +1 -0
  110. package/dist/types/tests/tmpl/lvalue.test.d.ts +2 -0
  111. package/dist/types/tests/tmpl/lvalue.test.d.ts.map +1 -0
  112. package/dist/types/tests/tmpl/native_rendering.test.d.ts +2 -0
  113. package/dist/types/tests/tmpl/native_rendering.test.d.ts.map +1 -0
  114. package/dist/types/tests/tmpl/structure.test.d.ts +2 -0
  115. package/dist/types/tests/tmpl/structure.test.d.ts.map +1 -0
  116. package/dist/types/tests/types/chaining.test.d.ts +2 -0
  117. package/dist/types/tests/types/chaining.test.d.ts.map +1 -0
  118. package/dist/types/tests/types/createElement.test.d.ts +2 -0
  119. package/dist/types/tests/types/createElement.test.d.ts.map +1 -0
  120. package/dist/types/tests/types/definition.test.d.ts +2 -0
  121. package/dist/types/tests/types/definition.test.d.ts.map +1 -0
  122. package/guide/zh_CN/advanced/binding_map_update.md +32 -0
  123. package/guide/zh_CN/advanced/build_args.md +28 -0
  124. package/guide/zh_CN/advanced/component_filter.md +70 -0
  125. package/guide/zh_CN/advanced/component_space.md +124 -0
  126. package/guide/zh_CN/advanced/custom_backend.md +53 -0
  127. package/guide/zh_CN/advanced/error_listener.md +32 -0
  128. package/guide/zh_CN/advanced/external_component.md +73 -0
  129. package/guide/zh_CN/advanced/template_engine.md +61 -0
  130. package/guide/zh_CN/appendix/backend_protocol.md +501 -0
  131. package/guide/zh_CN/appendix/list_diff_algorithm.md +406 -0
  132. package/guide/zh_CN/basic/beginning.md +94 -0
  133. package/guide/zh_CN/basic/component.md +156 -0
  134. package/guide/zh_CN/basic/event.md +169 -0
  135. package/guide/zh_CN/basic/lifetime.md +66 -0
  136. package/guide/zh_CN/basic/method.md +62 -0
  137. package/guide/zh_CN/basic/template.md +135 -0
  138. package/guide/zh_CN/data_management/advanced_update.md +170 -0
  139. package/guide/zh_CN/data_management/data_deep_copy.md +157 -0
  140. package/guide/zh_CN/data_management/data_observer.md +154 -0
  141. package/guide/zh_CN/data_management/property_early_init.md +31 -0
  142. package/guide/zh_CN/data_management/pure_data_pattern.md +21 -0
  143. package/guide/zh_CN/index.md +93 -0
  144. package/guide/zh_CN/interaction/behavior.md +52 -0
  145. package/guide/zh_CN/interaction/component_path.md +37 -0
  146. package/guide/zh_CN/interaction/generic.md +73 -0
  147. package/guide/zh_CN/interaction/placeholder.md +40 -0
  148. package/guide/zh_CN/interaction/relation.md +151 -0
  149. package/guide/zh_CN/interaction/slot.md +137 -0
  150. package/guide/zh_CN/interaction/template_import.md +94 -0
  151. package/guide/zh_CN/interaction/trait_behavior.md +117 -0
  152. package/guide/zh_CN/styling/external_class.md +46 -0
  153. package/guide/zh_CN/styling/style_isolation.md +54 -0
  154. package/guide/zh_CN/styling/virtual_host.md +52 -0
  155. package/guide/zh_CN/tree/element_iterator.md +54 -0
  156. package/guide/zh_CN/tree/mutation_observer.md +52 -0
  157. package/guide/zh_CN/tree/node_tree.md +142 -0
  158. package/guide/zh_CN/tree/node_tree_modification.md +78 -0
  159. package/guide/zh_CN/tree/selector.md +66 -0
  160. package/jest.config.js +6 -0
  161. package/jest.dts.config.js +9 -0
  162. package/jest.unit.config.js +14 -0
  163. package/package.json +28 -0
  164. package/src/backend/backend_protocol.ts +313 -0
  165. package/src/backend/composed_backend_protocol.ts +252 -0
  166. package/src/backend/domlike_backend_protocol.ts +370 -0
  167. package/src/backend/mode.ts +51 -0
  168. package/src/backend/suggested_backend_protocol.ts +83 -0
  169. package/src/behavior.ts +1655 -0
  170. package/src/bootstrap_dom_dev.js +22 -0
  171. package/src/class_list.ts +376 -0
  172. package/src/component.ts +1309 -0
  173. package/src/component_params.ts +461 -0
  174. package/src/component_space.ts +547 -0
  175. package/src/data_path.ts +225 -0
  176. package/src/data_proxy.ts +670 -0
  177. package/src/data_utils.ts +50 -0
  178. package/src/element.ts +1966 -0
  179. package/src/element_iterator.ts +158 -0
  180. package/src/event.ts +401 -0
  181. package/src/external_shadow_tree.ts +27 -0
  182. package/src/func_arr.ts +198 -0
  183. package/src/global_options.ts +242 -0
  184. package/src/index.ts +187 -0
  185. package/src/mutation_observer.ts +252 -0
  186. package/src/native_node.ts +74 -0
  187. package/src/node.ts +174 -0
  188. package/src/relation.ts +380 -0
  189. package/src/render.ts +25 -0
  190. package/src/selector.ts +218 -0
  191. package/src/shadow_root.ts +766 -0
  192. package/src/template_engine.ts +45 -0
  193. package/src/text_node.ts +149 -0
  194. package/src/tmpl/index.ts +199 -0
  195. package/src/tmpl/native_rendering.ts +175 -0
  196. package/src/tmpl/proc_gen_wrapper.ts +954 -0
  197. package/src/tmpl/proc_gen_wrapper_dom.ts +230 -0
  198. package/src/tmpl/range_list_diff.ts +443 -0
  199. package/src/trait_behaviors.ts +51 -0
  200. package/src/virtual_node.ts +51 -0
  201. package/tests/backend/domlike.test.ts +254 -0
  202. package/tests/base/env.ts +78 -0
  203. package/tests/base/match.ts +185 -0
  204. package/tests/core/backend.test.ts +144 -0
  205. package/tests/core/behavior.test.ts +546 -0
  206. package/tests/core/component_space.test.ts +212 -0
  207. package/tests/core/data_update.test.ts +461 -0
  208. package/tests/core/misc.test.ts +339 -0
  209. package/tests/core/placeholder.test.ts +180 -0
  210. package/tests/core/slot.test.ts +1495 -0
  211. package/tests/core/trait_behaviors.test.ts +153 -0
  212. package/tests/legacy/README.md +3 -0
  213. package/tests/legacy/behavior.test.js +293 -0
  214. package/tests/legacy/component.test.js +1247 -0
  215. package/tests/legacy/data_path.test.js +149 -0
  216. package/tests/legacy/data_proxy.test.js +759 -0
  217. package/tests/legacy/element_iterator.test.js +148 -0
  218. package/tests/legacy/event.test.js +849 -0
  219. package/tests/legacy/external.test.js +510 -0
  220. package/tests/legacy/extra_info.test.js +109 -0
  221. package/tests/legacy/generics.test.js +176 -0
  222. package/tests/legacy/mutation_observer.test.js +210 -0
  223. package/tests/legacy/relation.test.js +517 -0
  224. package/tests/legacy/selector.test.js +263 -0
  225. package/tests/legacy/slot.test.js +915 -0
  226. package/tests/legacy/virtual.test.js +394 -0
  227. package/tests/tmpl/binding_map.test.ts +208 -0
  228. package/tests/tmpl/event.test.ts +206 -0
  229. package/tests/tmpl/expression.test.ts +429 -0
  230. package/tests/tmpl/lvalue.test.ts +160 -0
  231. package/tests/tmpl/native_rendering.test.ts +155 -0
  232. package/tests/tmpl/structure.test.ts +998 -0
  233. package/tests/types/chaining.test.ts +614 -0
  234. package/tests/types/createElement.test.ts +82 -0
  235. package/tests/types/definition.test.ts +442 -0
  236. package/tsconfig.json +11 -0
  237. package/webpack.config.js +270 -0
@@ -0,0 +1,915 @@
1
+ /* eslint-disable */
2
+
3
+ const { tmpl, domBackend, shadowBackend, composedBackend } = require('../base/env')
4
+ const glassEasel = require('../../src')
5
+
6
+ const componentSpace = new glassEasel.ComponentSpace()
7
+ componentSpace.updateComponentOptions({
8
+ writeFieldsToNode: true,
9
+ writeIdToDOM: true,
10
+ })
11
+ componentSpace.defineComponent({
12
+ is: '',
13
+ })
14
+
15
+ const regElem = (config) => {
16
+ const { template, ...c } = config
17
+ if (template) c.template = tmpl(template)
18
+ return componentSpace.defineComponent(c)
19
+ }
20
+
21
+ const createElemInBackend = (is, backend) => {
22
+ const def = componentSpace.getComponent(is)
23
+ return glassEasel.Component.createWithContext(is || 'test', def, backend || domBackend)
24
+ }
25
+
26
+ var matchElementWithDom = require('../base/match').virtual
27
+
28
+ const testCases = function(testBackend){
29
+ var root = null
30
+
31
+ const createElem = function(is){
32
+ return createElemInBackend(is, testBackend)
33
+ }
34
+
35
+ beforeAll(function(){
36
+ regElem({
37
+ is: 'virtual-a',
38
+ })
39
+ root = createElem('virtual-a')
40
+ root.$$.id = 'root'
41
+ var backendRoot = testBackend.getRootNode()
42
+ if (testBackend === shadowBackend) {
43
+ var placeholder = backendRoot.getShadowRoot().createElement('div')
44
+ backendRoot.getShadowRoot().getRootNode().appendChild(placeholder)
45
+ glassEasel.Element.replaceDocumentElement(root, backendRoot, placeholder)
46
+ } else if (testBackend === domBackend) {
47
+ var placeholder = testBackend.document.createElement('div')
48
+ backendRoot.appendChild(placeholder)
49
+ glassEasel.Element.replaceDocumentElement(root, backendRoot, placeholder)
50
+ } else {
51
+ var placeholder = testBackend.createElement('div')
52
+ backendRoot.appendChild(placeholder)
53
+ glassEasel.Element.replaceDocumentElement(root, backendRoot, placeholder)
54
+ }
55
+ })
56
+
57
+ beforeAll(function(){
58
+ regElem({
59
+ is: 'component-slot-a',
60
+ template: '<span id="a"></span>'
61
+ })
62
+ root = createElem('component-slot-a')
63
+ regElem({
64
+ is: 'component-slot-b',
65
+ template: '<span id="b"><component-slot-a> <slot></slot> </component-slot-a></span>'
66
+ })
67
+ regElem({
68
+ is: 'component-slot-c',
69
+ options: {
70
+ multipleSlots: true
71
+ },
72
+ template: '<slot></slot> <span id="c"> <slot name="1"></slot> </span> <slot name="2"></slot>'
73
+ })
74
+ regElem({
75
+ is: 'component-slot-d',
76
+ options: {
77
+ multipleSlots: true
78
+ },
79
+ template: '<span id="d"><component-slot-c id="child"> <span id="a" slot="">A</span> <span id="b" slot="1">B</span> <span id="c" slot="2">C</span>D</component-slot-c></span>'
80
+ })
81
+ regElem({
82
+ is: 'component-slot-e',
83
+ template: '<span id="e"> <slot/> </span>'
84
+ })
85
+ })
86
+
87
+ describe('single-slotted', function(){
88
+
89
+ it('should support non-slot components', function(){
90
+ var elem = root.shadowRoot.createComponent('component-slot-a')
91
+ var text = glassEasel.TextNode.create('test', elem.ownerShadowRoot)
92
+ var child = root.shadowRoot.createComponent('component-slot-b')
93
+ elem.appendChild(text)
94
+ elem.appendChild(child)
95
+ matchElementWithDom(elem)
96
+
97
+ var newSlot = elem.shadowRoot.createVirtualNode('slot')
98
+ glassEasel.Element.setSlotName(newSlot)
99
+ elem.$.a.appendChild(newSlot)
100
+ expect(newSlot.getComposedChildren()).toStrictEqual([text, child])
101
+ matchElementWithDom(elem)
102
+
103
+ var newSlot2 = elem.shadowRoot.createVirtualNode('slot')
104
+ glassEasel.Element.setSlotName(newSlot2, 's2')
105
+ elem.shadowRoot.appendChild(newSlot2)
106
+ expect(newSlot.getComposedChildren()).toStrictEqual([text, child])
107
+ expect(newSlot2.getComposedChildren()).toStrictEqual([])
108
+ matchElementWithDom(elem)
109
+
110
+ elem.shadowRoot.insertBefore(newSlot2, elem.$.a)
111
+ expect(newSlot.getComposedChildren()).toStrictEqual([])
112
+ expect(newSlot2.getComposedChildren()).toStrictEqual([text, child])
113
+ matchElementWithDom(elem)
114
+
115
+ elem.$.a.removeChild(newSlot)
116
+ expect(newSlot.getComposedChildren()).toStrictEqual([])
117
+ expect(newSlot2.getComposedChildren()).toStrictEqual([text, child])
118
+ matchElementWithDom(elem)
119
+
120
+ elem.shadowRoot.removeChild(newSlot2)
121
+ expect(newSlot.getComposedChildren()).toStrictEqual([])
122
+ expect(newSlot2.getComposedChildren()).toStrictEqual([])
123
+ matchElementWithDom(elem)
124
+ })
125
+
126
+ it('should support slot movement', function(){
127
+ var elem = null
128
+ var text = glassEasel.TextNode.create('test', root.shadowRoot)
129
+ var text2 = null
130
+ elem = root.shadowRoot.createComponent('component-slot-b')
131
+ text2 = elem.shadowRoot.createTextNode('test2')
132
+ elem.appendChild(text)
133
+ elem.$.b.childNodes[0].appendChild(text2)
134
+ expect(elem.childNodes).toStrictEqual([text])
135
+ expect(elem.shadowRoot.getContainingSlot(null).getComposedChildren()).toStrictEqual([text])
136
+ expect(elem.shadowRoot.getContainingSlot(null).getComposedParent()).toBe(null)
137
+ expect(elem.$.b.childNodes[0].childNodes).toStrictEqual([elem.shadowRoot.getContainingSlot(null), text2])
138
+ expect(elem.$.b.childNodes[0].shadowRoot.getContainingSlot(null)).toBe(null)
139
+ matchElementWithDom(elem)
140
+
141
+ var a = elem.$.b.childNodes[0]
142
+ var newSlot = a.shadowRoot.createVirtualNode('slot')
143
+ glassEasel.Element.setSlotName(newSlot)
144
+ a.shadowRoot.insertBefore(newSlot, a.$.a)
145
+ expect(a.shadowRoot.getContainingSlot(null)).toBe(newSlot)
146
+ expect(a.shadowRoot.getContainingSlot(null).getComposedChildren()).toStrictEqual([elem.shadowRoot.getContainingSlot(null), text2])
147
+ expect(elem.shadowRoot.getContainingSlot(null).getComposedChildren()).toStrictEqual([text])
148
+ expect(elem.shadowRoot.getContainingSlot(null).getComposedParent()).toBe(newSlot)
149
+ expect(a.shadowRoot.childNodes[0].getComposedChildren()).toStrictEqual([elem.shadowRoot.getContainingSlot(null), text2])
150
+ matchElementWithDom(elem)
151
+
152
+ a.shadowRoot.appendChild(newSlot)
153
+ expect(a.shadowRoot.getContainingSlot(null)).toBe(newSlot)
154
+ expect(a.shadowRoot.getContainingSlot(null).getComposedChildren()).toStrictEqual([elem.shadowRoot.getContainingSlot(null), text2])
155
+ expect(elem.shadowRoot.getContainingSlot(null).getComposedChildren()).toStrictEqual([text])
156
+ expect(elem.shadowRoot.getContainingSlot(null).getComposedParent()).toBe(newSlot)
157
+ expect(a.shadowRoot.childNodes[a.shadowRoot.childNodes.length - 1].getComposedChildren()).toStrictEqual([elem.shadowRoot.getContainingSlot(null), text2])
158
+ matchElementWithDom(elem)
159
+ })
160
+
161
+ })
162
+
163
+ describe('multi-slotted (without splitting insertion)', function(){
164
+
165
+ it('should support static slotting', function(){
166
+ var elem = root.shadowRoot.createComponent('component-slot-d')
167
+ var child = elem.$.child
168
+ expect(child.childNodes[3].textContent).toBe('D')
169
+ expect(child.shadowRoot.childNodes[0].getComposedChildren()).toStrictEqual([elem.$.a, child.childNodes[3]])
170
+ expect(child.shadowRoot.childNodes[1].childNodes[0].getComposedChildren()).toStrictEqual([elem.$.b])
171
+ expect(child.shadowRoot.childNodes[2].getComposedChildren()).toStrictEqual([elem.$.c])
172
+ matchElementWithDom(elem)
173
+
174
+ elem.$.a.slot = '1'
175
+ expect(child.childNodes[3].textContent).toBe('D')
176
+ expect(child.shadowRoot.childNodes[0].getComposedChildren()).toStrictEqual([child.childNodes[3]])
177
+ expect(child.shadowRoot.childNodes[1].childNodes[0].getComposedChildren()).toStrictEqual([elem.$.a, elem.$.b])
178
+ expect(child.shadowRoot.childNodes[2].getComposedChildren()).toStrictEqual([elem.$.c])
179
+ matchElementWithDom(elem)
180
+
181
+ elem.$.c.slot = '1'
182
+ expect(child.childNodes[3].textContent).toBe('D')
183
+ expect(child.shadowRoot.childNodes[0].getComposedChildren()).toStrictEqual([child.childNodes[3]])
184
+ expect(child.shadowRoot.childNodes[1].childNodes[0].getComposedChildren()).toStrictEqual([elem.$.a, elem.$.b, elem.$.c])
185
+ expect(child.shadowRoot.childNodes[2].getComposedChildren()).toStrictEqual([])
186
+ matchElementWithDom(elem)
187
+
188
+ elem.$.a.slot = '2'
189
+ expect(child.childNodes[3].textContent).toBe('D')
190
+ expect(child.shadowRoot.childNodes[0].getComposedChildren()).toStrictEqual([child.childNodes[3]])
191
+ expect(child.shadowRoot.childNodes[1].childNodes[0].getComposedChildren()).toStrictEqual([elem.$.b, elem.$.c])
192
+ expect(child.shadowRoot.childNodes[2].getComposedChildren()).toStrictEqual([elem.$.a])
193
+ matchElementWithDom(elem)
194
+
195
+ elem.$.b.slot = 'xxx'
196
+ expect(child.childNodes[3].textContent).toBe('D')
197
+ expect(elem.$.b.getComposedParent()).toBe(null)
198
+ expect(child.shadowRoot.childNodes[0].getComposedChildren()).toStrictEqual([child.childNodes[3]])
199
+ expect(child.shadowRoot.childNodes[1].childNodes[0].getComposedChildren()).toStrictEqual([elem.$.c])
200
+ expect(child.shadowRoot.childNodes[2].getComposedChildren()).toStrictEqual([elem.$.a])
201
+ matchElementWithDom(elem)
202
+
203
+ elem.$.b.slot = 'yyy'
204
+ expect(child.childNodes[3].textContent).toBe('D')
205
+ expect(elem.$.b.getComposedParent()).toBe(null)
206
+ expect(child.shadowRoot.childNodes[0].getComposedChildren()).toStrictEqual([child.childNodes[3]])
207
+ expect(child.shadowRoot.childNodes[1].childNodes[0].getComposedChildren()).toStrictEqual([elem.$.c])
208
+ expect(child.shadowRoot.childNodes[2].getComposedChildren()).toStrictEqual([elem.$.a])
209
+ matchElementWithDom(elem)
210
+
211
+ elem.$.b.slot = ''
212
+ expect(child.childNodes[3].textContent).toBe('D')
213
+ expect(child.shadowRoot.childNodes[0].getComposedChildren()).toStrictEqual([elem.$.b, child.childNodes[3]])
214
+ expect(child.shadowRoot.childNodes[1].childNodes[0].getComposedChildren()).toStrictEqual([elem.$.c])
215
+ expect(child.shadowRoot.childNodes[2].getComposedChildren()).toStrictEqual([elem.$.a])
216
+ matchElementWithDom(elem)
217
+ })
218
+
219
+ it('should support non-slot components', function(){
220
+ var elem = root.shadowRoot.createComponent('component-slot-d')
221
+ var child = elem.$.child
222
+ var elem2 = root.shadowRoot.createComponent('component-slot-a')
223
+ var elem3 = root.shadowRoot.createComponent('component-slot-a')
224
+ elem3.slot = 'new2'
225
+ elem.appendChild(elem2)
226
+ elem.appendChild(elem3)
227
+
228
+ var newSlot = elem.shadowRoot.createNativeNode('div')
229
+ glassEasel.Element.setSlotName(newSlot)
230
+ newSlot.slot = 1
231
+ child.appendChild(newSlot)
232
+ expect(newSlot.getComposedChildren()).toStrictEqual([elem2])
233
+ expect(child.shadowRoot.childNodes[1].childNodes[0].getComposedChildren()).toStrictEqual([elem.$.b, newSlot])
234
+ matchElementWithDom(elem)
235
+
236
+ var newSlot2 = elem.shadowRoot.createNativeNode('div')
237
+ glassEasel.Element.setSlotName(newSlot2, 'new2')
238
+ child.appendChild(newSlot2)
239
+ expect(newSlot2.getComposedChildren()).toStrictEqual([elem3])
240
+ expect(child.childNodes[3].textContent).toBe('D')
241
+ expect(child.shadowRoot.childNodes[0].getComposedChildren()).toStrictEqual([elem.$.a, child.childNodes[3], newSlot2])
242
+ matchElementWithDom(elem)
243
+
244
+ glassEasel.Element.setSlotName(newSlot, 'new2')
245
+ expect(newSlot.getComposedChildren()).toStrictEqual([elem3])
246
+ expect(newSlot2.getComposedChildren()).toStrictEqual([])
247
+ expect(child.childNodes[3].textContent).toBe('D')
248
+ expect(child.shadowRoot.childNodes[0].getComposedChildren()).toStrictEqual([elem.$.a, child.childNodes[3], newSlot2])
249
+ expect(child.shadowRoot.childNodes[1].childNodes[0].getComposedChildren()).toStrictEqual([elem.$.b, newSlot])
250
+ matchElementWithDom(elem)
251
+
252
+ child.removeChild(newSlot2)
253
+ expect(newSlot.getComposedChildren()).toStrictEqual([elem3])
254
+ expect(newSlot2.getComposedChildren()).toStrictEqual([])
255
+ matchElementWithDom(elem)
256
+
257
+ child.removeChild(newSlot)
258
+ expect(newSlot.getComposedChildren()).toStrictEqual([])
259
+ matchElementWithDom(elem)
260
+ })
261
+
262
+ it('should support slot movement', function(){
263
+ var elem = root.shadowRoot.createComponent('component-slot-d')
264
+ var child = elem.$.child
265
+
266
+ var slot1 = child.$.c.childNodes[0]
267
+ child.shadowRoot.appendChild(slot1)
268
+ expect(child.$.c.getComposedChildren()).toStrictEqual([])
269
+ expect(slot1.getComposedParent()).toBe(child.shadowRoot)
270
+ expect(slot1.getComposedChildren()).toStrictEqual([elem.$.b])
271
+ matchElementWithDom(elem)
272
+ })
273
+
274
+ it('should support slot replacement, removal, and insertion', function(){
275
+ var elem = root.shadowRoot.createComponent('component-slot-c')
276
+ var elem2 = null
277
+ var elem3 = null
278
+ elem2 = root.shadowRoot.createComponent('component-slot-a')
279
+ elem3 = root.shadowRoot.createComponent('component-slot-a')
280
+ elem2.slot = '1'
281
+ elem.appendChild(elem2)
282
+ elem.appendChild(elem3)
283
+
284
+ var slot0 = elem.shadowRoot.childNodes[0]
285
+ var slot1 = elem.$.c.childNodes[0]
286
+ expect(elem2.getComposedParent()).toBe(slot1)
287
+ expect(elem3.getComposedParent()).toBe(slot0)
288
+
289
+ var slot1dup = elem.shadowRoot.createNativeNode('span')
290
+ glassEasel.Element.setSlotName(slot1dup, '1')
291
+ slot1.parentNode.replaceChild(slot1dup, slot1)
292
+ expect(slot1.getComposedParent()).toBe(null)
293
+ expect(slot1.getComposedChildren()).toStrictEqual([])
294
+ expect(elem2.getComposedParent()).toBe(slot1dup)
295
+ expect(elem3.getComposedParent()).toBe(slot0)
296
+ matchElementWithDom(elem)
297
+
298
+ slot1dup.parentNode.removeChild(slot1dup)
299
+ expect(slot1dup.getComposedParent()).toBe(null)
300
+ expect(slot1dup.getComposedChildren()).toStrictEqual([])
301
+ expect(elem2.getComposedParent()).toBe(null)
302
+ expect(elem3.getComposedParent()).toBe(slot0)
303
+ matchElementWithDom(elem)
304
+
305
+ elem.shadowRoot.appendChild(slot1)
306
+ expect(slot1.getComposedParent()).toBe(elem.shadowRoot)
307
+ expect(slot1.getComposedChildren()).toStrictEqual([elem2])
308
+ expect(elem2.getComposedParent()).toBe(slot1)
309
+ expect(elem3.getComposedParent()).toBe(slot0)
310
+ matchElementWithDom(elem)
311
+ })
312
+
313
+ it('should support slot children movement (multi-slotted)', function(){
314
+ var parent1 = root.shadowRoot.createComponent('component-slot-e')
315
+ var parent2 = root.shadowRoot.createComponent('component-slot-c')
316
+ var virtual = root.shadowRoot.createVirtualNode('group')
317
+ var elem1 = root.shadowRoot.createComponent('component-slot-e')
318
+ var elem2 = root.shadowRoot.createComponent('component-slot-e')
319
+ var slot1 = parent1.$.e.childNodes[0]
320
+ var slot20 = parent2.shadowRoot.childNodes[0]
321
+ // var slot21 = parent2.$.c.childNodes[0]
322
+ elem1.slot = '1'
323
+ virtual.appendChild(elem1)
324
+ virtual.appendChild(elem2)
325
+
326
+ parent1.appendChild(virtual)
327
+ expect(virtual.getComposedParent()).toBe(slot1)
328
+ expect(slot1.getComposedChildren()).toStrictEqual([virtual])
329
+ matchElementWithDom(parent1)
330
+ matchElementWithDom(parent2)
331
+
332
+ parent2.appendChild(virtual)
333
+ expect(virtual.getComposedParent()).toBe(slot20)
334
+ expect(slot20.getComposedChildren()).toStrictEqual([virtual])
335
+ matchElementWithDom(parent1)
336
+ matchElementWithDom(parent2)
337
+
338
+ parent1.appendChild(virtual)
339
+ expect(virtual.getComposedParent()).toBe(slot1)
340
+ expect(slot1.getComposedChildren()).toStrictEqual([virtual])
341
+ matchElementWithDom(parent1)
342
+ matchElementWithDom(parent2)
343
+
344
+ parent2.appendChild(virtual)
345
+ expect(virtual.getComposedParent()).toBe(slot20)
346
+ expect(slot20.getComposedChildren()).toStrictEqual([virtual])
347
+ matchElementWithDom(parent1)
348
+ matchElementWithDom(parent2)
349
+ })
350
+
351
+ })
352
+
353
+ describe('multi-slotted (with splitting insertion)', function(){
354
+
355
+ it('should be able to insert to single slot', function(){
356
+ var p1 = root.shadowRoot.createComponent('component-slot-e')
357
+ var p2 = root.shadowRoot.createComponent('component-slot-e')
358
+ var p1slot = p1.$.e.childNodes[0]
359
+ var p2slot = p2.$.e.childNodes[0]
360
+ var s1 = root.shadowRoot.createVirtualNode('s1')
361
+ var s2 = root.shadowRoot.createVirtualNode('s2')
362
+ var s3 = root.shadowRoot.createVirtualNode('s3')
363
+ glassEasel.Element.setInheritSlots(s1)
364
+ glassEasel.Element.setInheritSlots(s2)
365
+ glassEasel.Element.setInheritSlots(s3)
366
+ var c1 = root.shadowRoot.createVirtualNode()
367
+ var c2 = root.shadowRoot.createNativeNode('span')
368
+ var c3 = root.shadowRoot.createNativeNode('span')
369
+ var c4 = root.shadowRoot.createNativeNode('span')
370
+ s1.appendChild(s2)
371
+ s1.appendChild(c1)
372
+ s2.appendChild(c2)
373
+ s2.appendChild(c3)
374
+ s3.appendChild(c4)
375
+ matchElementWithDom(s1)
376
+ matchElementWithDom(s3)
377
+
378
+ p1.appendChild(s1)
379
+ expect(p1slot.getComposedChildren()).toStrictEqual([s1, s2, c2, c3, c1])
380
+ expect(s1.childNodes).toStrictEqual([s2, c1])
381
+ expect(s1.getComposedChildren()).toStrictEqual([])
382
+ expect(s2.getComposedChildren()).toStrictEqual([])
383
+ expect(s3.getComposedChildren()).toStrictEqual([])
384
+ matchElementWithDom(p1)
385
+
386
+ s1.appendChild(s3)
387
+ expect(p1slot.getComposedChildren()).toStrictEqual([s1, s2, c2, c3, c1, s3, c4])
388
+ expect(s1.childNodes).toStrictEqual([s2, c1, s3])
389
+ expect(s1.getComposedChildren()).toStrictEqual([])
390
+ expect(s2.getComposedChildren()).toStrictEqual([])
391
+ expect(s3.getComposedChildren()).toStrictEqual([])
392
+ matchElementWithDom(p1)
393
+
394
+ p2.appendChild(s3)
395
+ expect(p1slot.getComposedChildren()).toStrictEqual([s1, s2, c2, c3, c1])
396
+ expect(p2slot.getComposedChildren()).toStrictEqual([s3, c4])
397
+ expect(s1.childNodes).toStrictEqual([s2, c1])
398
+ matchElementWithDom(p1)
399
+ matchElementWithDom(p2)
400
+
401
+ p2.removeChild(s3)
402
+ expect(p1slot.getComposedChildren()).toStrictEqual([s1, s2, c2, c3, c1])
403
+ expect(p2slot.getComposedChildren()).toStrictEqual([])
404
+ expect(s3.getComposedChildren()).toStrictEqual([])
405
+ matchElementWithDom(p1)
406
+ matchElementWithDom(p2)
407
+
408
+ s1.insertBefore(s3, s2)
409
+ expect(p1slot.getComposedChildren()).toStrictEqual([s1, s3, c4, s2, c2, c3, c1])
410
+ expect(p2slot.getComposedChildren()).toStrictEqual([])
411
+ expect(s1.childNodes).toStrictEqual([s3, s2, c1])
412
+ expect(s3.getComposedChildren()).toStrictEqual([])
413
+ matchElementWithDom(p1)
414
+
415
+ s1.insertBefore(s3, c1)
416
+ expect(p1slot.getComposedChildren()).toStrictEqual([s1, s2, c2, c3, s3, c4, c1])
417
+ expect(p2slot.getComposedChildren()).toStrictEqual([])
418
+ expect(s1.childNodes).toStrictEqual([s2, s3, c1])
419
+ matchElementWithDom(p1)
420
+
421
+ s1.removeChild(s2)
422
+ expect(p1slot.getComposedChildren()).toStrictEqual([s1, s3, c4, c1])
423
+ expect(p2slot.getComposedChildren()).toStrictEqual([])
424
+ expect(s1.childNodes).toStrictEqual([s3, c1])
425
+ matchElementWithDom(p1)
426
+ matchElementWithDom(s2)
427
+
428
+ s1.replaceChild(s2, c1)
429
+ expect(p1slot.getComposedChildren()).toStrictEqual([s1, s3, c4, s2, c2, c3])
430
+ expect(p2slot.getComposedChildren()).toStrictEqual([])
431
+ expect(s1.childNodes).toStrictEqual([s3, s2])
432
+ matchElementWithDom(p1)
433
+ matchElementWithDom(c1)
434
+
435
+ p1.removeChild(s1)
436
+ expect(p1slot.getComposedChildren()).toStrictEqual([])
437
+ expect(p2slot.getComposedChildren()).toStrictEqual([])
438
+ matchElementWithDom(p1)
439
+ matchElementWithDom(s1)
440
+ })
441
+
442
+ it('should be able to insert to multiple slots', function(){
443
+ var p1 = root.shadowRoot.createComponent('component-slot-c')
444
+ var p2 = root.shadowRoot.createComponent('component-slot-c')
445
+ var p1slot0 = p1.shadowRoot.childNodes[0]
446
+ var p1slot1 = p1.shadowRoot.childNodes[1].childNodes[0]
447
+ var p1slot2 = p1.shadowRoot.childNodes[2]
448
+ var p2slot5 = p2.shadowRoot.childNodes[0]
449
+ glassEasel.Element.setSlotName(p2slot5, '5')
450
+ var p2slot1 = p2.shadowRoot.childNodes[1].childNodes[0]
451
+ var p2slot2 = p2.shadowRoot.childNodes[2]
452
+ var s1 = root.shadowRoot.createVirtualNode('s1')
453
+ var s2 = root.shadowRoot.createVirtualNode('s2')
454
+ var s3 = root.shadowRoot.createVirtualNode('s3')
455
+ glassEasel.Element.setInheritSlots(s1)
456
+ glassEasel.Element.setInheritSlots(s2)
457
+ glassEasel.Element.setInheritSlots(s3)
458
+ var c1 = root.shadowRoot.createVirtualNode()
459
+ var c2 = root.shadowRoot.createNativeNode('span')
460
+ var c3 = root.shadowRoot.createNativeNode('span')
461
+ var c4 = root.shadowRoot.createNativeNode('span')
462
+ var c5 = root.shadowRoot.createVirtualNode()
463
+ c1.slot = '1'
464
+ c2.slot = 2
465
+ c5.slot = 5
466
+ s1.appendChild(s2)
467
+ s1.appendChild(c1)
468
+ s2.appendChild(c2)
469
+ // s2.appendChild(c3)
470
+ s3.appendChild(c4)
471
+ s3.appendChild(c5)
472
+ expect(s3.getComposedChildren()).toStrictEqual([])
473
+ expect(s3.childNodes).toStrictEqual([c4, c5])
474
+ matchElementWithDom(s1)
475
+ matchElementWithDom(s3)
476
+
477
+ p1.appendChild(s1)
478
+ expect(p1slot0.getComposedChildren()).toStrictEqual([s1, s2])
479
+ expect(p1slot1.getComposedChildren()).toStrictEqual([c1])
480
+ expect(p1slot2.getComposedChildren()).toStrictEqual([c2])
481
+ expect(s1.getComposedChildren()).toStrictEqual([])
482
+ expect(s2.getComposedChildren()).toStrictEqual([])
483
+ matchElementWithDom(p1)
484
+
485
+ s1.appendChild(s3)
486
+ expect(p1slot0.getComposedChildren()).toStrictEqual([s1, s2, s3, c4])
487
+ expect(p1slot1.getComposedChildren()).toStrictEqual([c1])
488
+ expect(p1slot2.getComposedChildren()).toStrictEqual([c2])
489
+ expect(s1.getComposedChildren()).toStrictEqual([])
490
+ expect(s2.getComposedChildren()).toStrictEqual([])
491
+ expect(s3.getComposedChildren()).toStrictEqual([])
492
+ matchElementWithDom(p1)
493
+
494
+ s2.appendChild(c3)
495
+ expect(p1slot0.getComposedChildren()).toStrictEqual([s1, s2, c3, s3, c4])
496
+ expect(p1slot1.getComposedChildren()).toStrictEqual([c1])
497
+ expect(p1slot2.getComposedChildren()).toStrictEqual([c2])
498
+ expect(s1.getComposedChildren()).toStrictEqual([])
499
+ expect(s2.getComposedChildren()).toStrictEqual([])
500
+ expect(s3.getComposedChildren()).toStrictEqual([])
501
+ matchElementWithDom(p1)
502
+
503
+ p2.appendChild(s3)
504
+ expect(p1slot0.getComposedChildren()).toStrictEqual([s1, s2, c3])
505
+ expect(p1slot1.getComposedChildren()).toStrictEqual([c1])
506
+ expect(p1slot2.getComposedChildren()).toStrictEqual([c2])
507
+ expect(p2slot1.getComposedChildren()).toStrictEqual([])
508
+ expect(p2slot2.getComposedChildren()).toStrictEqual([])
509
+ expect(p2slot5.getComposedChildren()).toStrictEqual([c5])
510
+ expect(s1.getComposedChildren()).toStrictEqual([])
511
+ expect(s2.getComposedChildren()).toStrictEqual([])
512
+ expect(s3.getComposedChildren()).toStrictEqual([])
513
+ matchElementWithDom(p1)
514
+ matchElementWithDom(p2)
515
+ matchElementWithDom(s3)
516
+
517
+ p2.removeChild(s3)
518
+ expect(p2slot1.getComposedChildren()).toStrictEqual([])
519
+ expect(p2slot2.getComposedChildren()).toStrictEqual([])
520
+ expect(p2slot5.getComposedChildren()).toStrictEqual([])
521
+ expect(s3.getComposedChildren()).toStrictEqual([])
522
+ matchElementWithDom(p2)
523
+ matchElementWithDom(s3)
524
+
525
+ s1.insertBefore(s3, s2)
526
+ expect(p1slot0.getComposedChildren()).toStrictEqual([s1, s3, c4, s2, c3])
527
+ expect(p1slot1.getComposedChildren()).toStrictEqual([c1])
528
+ expect(p1slot2.getComposedChildren()).toStrictEqual([c2])
529
+ expect(s1.getComposedChildren()).toStrictEqual([])
530
+ expect(s2.getComposedChildren()).toStrictEqual([])
531
+ expect(s3.getComposedChildren()).toStrictEqual([])
532
+ matchElementWithDom(p1)
533
+ matchElementWithDom(s3)
534
+
535
+ s1.appendChild(s3)
536
+ expect(p1slot0.getComposedChildren()).toStrictEqual([s1, s2, c3, s3, c4])
537
+ expect(p1slot1.getComposedChildren()).toStrictEqual([c1])
538
+ expect(p1slot2.getComposedChildren()).toStrictEqual([c2])
539
+ expect(s1.getComposedChildren()).toStrictEqual([])
540
+ expect(s2.getComposedChildren()).toStrictEqual([])
541
+ expect(s3.getComposedChildren()).toStrictEqual([])
542
+ matchElementWithDom(p1)
543
+
544
+ s1.insertBefore(s3, s2)
545
+ expect(p1slot0.getComposedChildren()).toStrictEqual([s1, s3, c4, s2, c3])
546
+ expect(p1slot1.getComposedChildren()).toStrictEqual([c1])
547
+ expect(p1slot2.getComposedChildren()).toStrictEqual([c2])
548
+ expect(s1.getComposedChildren()).toStrictEqual([])
549
+ expect(s2.getComposedChildren()).toStrictEqual([])
550
+ expect(s3.getComposedChildren()).toStrictEqual([])
551
+ matchElementWithDom(p1)
552
+
553
+ s1.insertBefore(s3, s2)
554
+ expect(p1slot0.getComposedChildren()).toStrictEqual([s1, s3, c4, s2, c3])
555
+ expect(p1slot1.getComposedChildren()).toStrictEqual([c1])
556
+ expect(p1slot2.getComposedChildren()).toStrictEqual([c2])
557
+ expect(s1.getComposedChildren()).toStrictEqual([])
558
+ expect(s2.getComposedChildren()).toStrictEqual([])
559
+ expect(s3.getComposedChildren()).toStrictEqual([])
560
+ matchElementWithDom(p1)
561
+
562
+ s1.replaceChild(s3, s2)
563
+ expect(p1slot0.getComposedChildren()).toStrictEqual([s1, s3, c4])
564
+ expect(p1slot1.getComposedChildren()).toStrictEqual([c1])
565
+ expect(p1slot2.getComposedChildren()).toStrictEqual([])
566
+ expect(s1.getComposedChildren()).toStrictEqual([])
567
+ expect(s2.getComposedChildren()).toStrictEqual([])
568
+ expect(s3.getComposedChildren()).toStrictEqual([])
569
+ matchElementWithDom(p1)
570
+ matchElementWithDom(s2)
571
+
572
+ p1.removeChild(s1)
573
+ expect(p1slot0.getComposedChildren()).toStrictEqual([])
574
+ expect(p1slot1.getComposedChildren()).toStrictEqual([])
575
+ expect(p1slot2.getComposedChildren()).toStrictEqual([])
576
+ expect(s1.getComposedChildren()).toStrictEqual([])
577
+ expect(s2.getComposedChildren()).toStrictEqual([])
578
+ expect(s3.getComposedChildren()).toStrictEqual([])
579
+ matchElementWithDom(p1)
580
+ matchElementWithDom(s1)
581
+ })
582
+
583
+ it('should be able to move between single and multiple slots', function(){
584
+ var p1 = root.shadowRoot.createComponent('component-slot-e')
585
+ var p2 = root.shadowRoot.createComponent('component-slot-c')
586
+ var p1slot = p1.$.e.childNodes[0]
587
+ var p2slot0 = p2.shadowRoot.childNodes[0]
588
+ var p2slot1 = p2.shadowRoot.childNodes[1].childNodes[0]
589
+ var p2slot2 = p2.shadowRoot.childNodes[2]
590
+ var s1 = root.shadowRoot.createVirtualNode('s1')
591
+ var s2 = root.shadowRoot.createVirtualNode('s2')
592
+ var s3 = root.shadowRoot.createVirtualNode('s3')
593
+ glassEasel.Element.setInheritSlots(s1)
594
+ glassEasel.Element.setInheritSlots(s2)
595
+ glassEasel.Element.setInheritSlots(s3)
596
+ var c1 = root.shadowRoot.createVirtualNode()
597
+ var c2 = root.shadowRoot.createNativeNode('span')
598
+ var c3 = root.shadowRoot.createNativeNode('span')
599
+ var c4 = root.shadowRoot.createNativeNode('span')
600
+ var c5 = root.shadowRoot.createVirtualNode()
601
+ c1.slot = '1'
602
+ c2.slot = 2
603
+ c5.slot = 1
604
+ s1.appendChild(s2)
605
+ s1.appendChild(c1)
606
+ s2.appendChild(c2)
607
+ s2.appendChild(c3)
608
+ s3.appendChild(c4)
609
+ s3.appendChild(c5)
610
+ matchElementWithDom(s1)
611
+ matchElementWithDom(s3)
612
+
613
+ p1.appendChild(s3)
614
+ expect(p1slot.getComposedChildren()).toStrictEqual([s3, c4, c5])
615
+ expect(s1.getComposedChildren()).toStrictEqual([])
616
+ expect(s2.getComposedChildren()).toStrictEqual([])
617
+ expect(s3.getComposedChildren()).toStrictEqual([])
618
+ matchElementWithDom(p1)
619
+
620
+ p1.insertBefore(s1, s3)
621
+ expect(p1slot.getComposedChildren()).toStrictEqual([s1, s2, c2, c3, c1, s3, c4, c5])
622
+ expect(s1.getComposedChildren()).toStrictEqual([])
623
+ expect(s2.getComposedChildren()).toStrictEqual([])
624
+ expect(s3.getComposedChildren()).toStrictEqual([])
625
+ matchElementWithDom(p1)
626
+
627
+ s1.appendChild(s3)
628
+ expect(p1slot.getComposedChildren()).toStrictEqual([s1, s2, c2, c3, c1, s3, c4, c5])
629
+ expect(s1.getComposedChildren()).toStrictEqual([])
630
+ expect(s2.getComposedChildren()).toStrictEqual([])
631
+ expect(s3.getComposedChildren()).toStrictEqual([])
632
+ matchElementWithDom(p1)
633
+
634
+ p2.appendChild(s1)
635
+ expect(p1slot.getComposedChildren()).toStrictEqual([])
636
+ expect(p2slot0.getComposedChildren()).toStrictEqual([s1, s2, c3, s3, c4])
637
+ expect(p2slot1.getComposedChildren()).toStrictEqual([c1, c5])
638
+ expect(p2slot2.getComposedChildren()).toStrictEqual([c2])
639
+ expect(s1.getComposedChildren()).toStrictEqual([])
640
+ expect(s2.getComposedChildren()).toStrictEqual([])
641
+ expect(s3.getComposedChildren()).toStrictEqual([])
642
+ matchElementWithDom(p1)
643
+ matchElementWithDom(p2)
644
+
645
+ p2.insertBefore(s3, s1)
646
+ expect(p2slot0.getComposedChildren()).toStrictEqual([s3, c4, s1, s2, c3])
647
+ expect(p2slot1.getComposedChildren()).toStrictEqual([c5, c1])
648
+ expect(p2slot2.getComposedChildren()).toStrictEqual([c2])
649
+ expect(s1.getComposedChildren()).toStrictEqual([])
650
+ expect(s2.getComposedChildren()).toStrictEqual([])
651
+ expect(s3.getComposedChildren()).toStrictEqual([])
652
+ matchElementWithDom(p1)
653
+ matchElementWithDom(p2)
654
+
655
+ p1.insertBefore(s1)
656
+ expect(p1slot.getComposedChildren()).toStrictEqual([s1, s2, c2, c3, c1])
657
+ expect(p2slot0.getComposedChildren()).toStrictEqual([s3, c4])
658
+ expect(p2slot1.getComposedChildren()).toStrictEqual([c5])
659
+ expect(p2slot2.getComposedChildren()).toStrictEqual([])
660
+ expect(s1.getComposedChildren()).toStrictEqual([])
661
+ expect(s2.getComposedChildren()).toStrictEqual([])
662
+ expect(s3.getComposedChildren()).toStrictEqual([])
663
+ matchElementWithDom(p1)
664
+ matchElementWithDom(p2)
665
+
666
+ s1.insertBefore(s3, c1)
667
+ expect(p1slot.getComposedChildren()).toStrictEqual([s1, s2, c2, c3, s3, c4, c5, c1])
668
+ expect(p2slot0.getComposedChildren()).toStrictEqual([])
669
+ expect(p2slot1.getComposedChildren()).toStrictEqual([])
670
+ expect(p2slot2.getComposedChildren()).toStrictEqual([])
671
+ expect(s1.getComposedChildren()).toStrictEqual([])
672
+ expect(s2.getComposedChildren()).toStrictEqual([])
673
+ expect(s3.getComposedChildren()).toStrictEqual([])
674
+ matchElementWithDom(p1)
675
+ matchElementWithDom(p2)
676
+
677
+ p2.appendChild(s3)
678
+ expect(p1slot.getComposedChildren()).toStrictEqual([s1, s2, c2, c3, c1])
679
+ expect(p2slot0.getComposedChildren()).toStrictEqual([s3, c4])
680
+ expect(p2slot1.getComposedChildren()).toStrictEqual([c5])
681
+ expect(p2slot2.getComposedChildren()).toStrictEqual([])
682
+ expect(s1.getComposedChildren()).toStrictEqual([])
683
+ expect(s2.getComposedChildren()).toStrictEqual([])
684
+ expect(s3.getComposedChildren()).toStrictEqual([])
685
+ matchElementWithDom(p1)
686
+ matchElementWithDom(p2)
687
+
688
+ s3.insertBefore(s1, c5)
689
+ expect(p2slot0.getComposedChildren()).toStrictEqual([s3, c4, s1, s2, c3])
690
+ expect(p2slot1.getComposedChildren()).toStrictEqual([c1, c5])
691
+ expect(p2slot2.getComposedChildren()).toStrictEqual([c2])
692
+ expect(s1.getComposedChildren()).toStrictEqual([])
693
+ expect(s2.getComposedChildren()).toStrictEqual([])
694
+ expect(s3.getComposedChildren()).toStrictEqual([])
695
+ matchElementWithDom(p1)
696
+ matchElementWithDom(p2)
697
+ })
698
+
699
+ it('should be able to change slot attributes', function(){
700
+ var p1 = root.shadowRoot.createComponent('component-slot-c')
701
+ var p1slot0 = p1.shadowRoot.childNodes[0]
702
+ var p1slot1 = p1.shadowRoot.childNodes[1].childNodes[0]
703
+ var p1slot2 = p1.shadowRoot.childNodes[2]
704
+ var s1 = root.shadowRoot.createVirtualNode('s1')
705
+ var s2 = root.shadowRoot.createVirtualNode('s2')
706
+ var s3 = root.shadowRoot.createVirtualNode('s3')
707
+ glassEasel.Element.setInheritSlots(s1)
708
+ glassEasel.Element.setInheritSlots(s2)
709
+ glassEasel.Element.setInheritSlots(s3)
710
+ var c1 = root.shadowRoot.createVirtualNode()
711
+ var c2 = root.shadowRoot.createNativeNode('span')
712
+ var c3 = root.shadowRoot.createNativeNode('span')
713
+ var c4 = root.shadowRoot.createNativeNode('span')
714
+ var c5 = root.shadowRoot.createVirtualNode()
715
+ c1.slot = '1'
716
+ c2.slot = 2
717
+ c5.slot = 1
718
+ s1.appendChild(s2)
719
+ s1.appendChild(c1)
720
+ s2.appendChild(c2)
721
+ s2.appendChild(c3)
722
+ s3.appendChild(c4)
723
+ s3.appendChild(c5)
724
+ s1.appendChild(s3)
725
+ matchElementWithDom(s1)
726
+
727
+ p1.appendChild(s1)
728
+ expect(p1slot0.getComposedChildren()).toStrictEqual([s1, s2, c3, s3, c4])
729
+ expect(p1slot1.getComposedChildren()).toStrictEqual([c1, c5])
730
+ expect(p1slot2.getComposedChildren()).toStrictEqual([c2])
731
+ expect(s1.getComposedChildren()).toStrictEqual([])
732
+ expect(s2.getComposedChildren()).toStrictEqual([])
733
+ matchElementWithDom(p1)
734
+
735
+ c1.slot = '2'
736
+ expect(p1slot0.getComposedChildren()).toStrictEqual([s1, s2, c3, s3, c4])
737
+ expect(p1slot1.getComposedChildren()).toStrictEqual([c5])
738
+ expect(p1slot2.getComposedChildren()).toStrictEqual([c2, c1])
739
+ expect(s1.getComposedChildren()).toStrictEqual([])
740
+ expect(s2.getComposedChildren()).toStrictEqual([])
741
+ matchElementWithDom(p1)
742
+
743
+ c3.slot = '1'
744
+ expect(p1slot0.getComposedChildren()).toStrictEqual([s1, s2, s3, c4])
745
+ expect(p1slot1.getComposedChildren()).toStrictEqual([c3, c5])
746
+ expect(p1slot2.getComposedChildren()).toStrictEqual([c2, c1])
747
+ expect(s1.getComposedChildren()).toStrictEqual([])
748
+ expect(s2.getComposedChildren()).toStrictEqual([])
749
+ matchElementWithDom(p1)
750
+
751
+ c5.slot = ''
752
+ expect(p1slot0.getComposedChildren()).toStrictEqual([s1, s2, s3, c4, c5])
753
+ expect(p1slot1.getComposedChildren()).toStrictEqual([c3])
754
+ expect(p1slot2.getComposedChildren()).toStrictEqual([c2, c1])
755
+ expect(s1.getComposedChildren()).toStrictEqual([])
756
+ expect(s2.getComposedChildren()).toStrictEqual([])
757
+ matchElementWithDom(p1)
758
+
759
+ c2.slot = ''
760
+ expect(p1slot0.getComposedChildren()).toStrictEqual([s1, s2, c2, s3, c4, c5])
761
+ expect(p1slot1.getComposedChildren()).toStrictEqual([c3])
762
+ expect(p1slot2.getComposedChildren()).toStrictEqual([c1])
763
+ expect(s1.getComposedChildren()).toStrictEqual([])
764
+ expect(s2.getComposedChildren()).toStrictEqual([])
765
+ matchElementWithDom(p1)
766
+ })
767
+
768
+ it('should be able to reassign slots in single slot', function(){
769
+ var p1 = root.shadowRoot.createComponent('component-slot-e')
770
+ var p1slot = p1.$.e.childNodes[0]
771
+ var s1 = root.shadowRoot.createVirtualNode('s1')
772
+ var s2 = root.shadowRoot.createVirtualNode('s2')
773
+ var s3 = root.shadowRoot.createVirtualNode('s3')
774
+ glassEasel.Element.setInheritSlots(s1)
775
+ glassEasel.Element.setInheritSlots(s2)
776
+ glassEasel.Element.setInheritSlots(s3)
777
+ var c1 = root.shadowRoot.createVirtualNode()
778
+ var c2 = root.shadowRoot.createNativeNode('span')
779
+ var c3 = root.shadowRoot.createNativeNode('span')
780
+ var c4 = root.shadowRoot.createNativeNode('span')
781
+ var c5 = root.shadowRoot.createVirtualNode()
782
+ c1.slot = '1'
783
+ c2.slot = 2
784
+ c5.slot = 1
785
+ s1.appendChild(s2)
786
+ s1.appendChild(c1)
787
+ s2.appendChild(c2)
788
+ s2.appendChild(c3)
789
+ s3.appendChild(c4)
790
+ s3.appendChild(c5)
791
+ s1.appendChild(s3)
792
+ matchElementWithDom(s1)
793
+
794
+ p1.appendChild(s1)
795
+ expect(p1slot.getComposedChildren()).toStrictEqual([s1, s2, c2, c3, c1, s3, c4, c5])
796
+ expect(s1.getComposedChildren()).toStrictEqual([])
797
+ expect(s2.getComposedChildren()).toStrictEqual([])
798
+ expect(s3.getComposedChildren()).toStrictEqual([])
799
+ matchElementWithDom(p1)
800
+
801
+ p1.$.e.removeChild(p1slot)
802
+ expect(p1slot.getComposedChildren()).toStrictEqual([])
803
+ expect(s1.getComposedChildren()).toStrictEqual([])
804
+ expect(s2.getComposedChildren()).toStrictEqual([])
805
+ expect(s3.getComposedChildren()).toStrictEqual([])
806
+ matchElementWithDom(p1)
807
+ matchElementWithDom(s1)
808
+
809
+ p1.shadowRoot.appendChild(p1slot)
810
+ expect(p1slot.getComposedChildren()).toStrictEqual([s1, s2, c2, c3, c1, s3, c4, c5])
811
+ expect(s1.getComposedChildren()).toStrictEqual([])
812
+ expect(s2.getComposedChildren()).toStrictEqual([])
813
+ expect(s3.getComposedChildren()).toStrictEqual([])
814
+ matchElementWithDom(p1)
815
+ matchElementWithDom(s1)
816
+ })
817
+
818
+ it('should be able to reassign slots in multiple slots', function(){
819
+ var p1 = root.shadowRoot.createComponent('component-slot-c')
820
+ var p1slot0 = p1.shadowRoot.childNodes[0]
821
+ var p1slot1 = p1.shadowRoot.childNodes[1].childNodes[0]
822
+ var p1slot2 = p1.shadowRoot.childNodes[2]
823
+ var s1 = root.shadowRoot.createVirtualNode('s1')
824
+ var s2 = root.shadowRoot.createVirtualNode('s2')
825
+ var s3 = root.shadowRoot.createVirtualNode('s3')
826
+ glassEasel.Element.setInheritSlots(s1)
827
+ glassEasel.Element.setInheritSlots(s2)
828
+ glassEasel.Element.setInheritSlots(s3)
829
+ var c1 = root.shadowRoot.createVirtualNode()
830
+ var c2 = root.shadowRoot.createNativeNode('span')
831
+ var c3 = root.shadowRoot.createNativeNode('span')
832
+ var c4 = root.shadowRoot.createNativeNode('span')
833
+ var c5 = root.shadowRoot.createVirtualNode()
834
+ c1.slot = '1'
835
+ c2.slot = 2
836
+ c5.slot = 1
837
+ s1.appendChild(s2)
838
+ s1.appendChild(c1)
839
+ s2.appendChild(c2)
840
+ s2.appendChild(c3)
841
+ s3.appendChild(c4)
842
+ s3.appendChild(c5)
843
+ s1.appendChild(s3)
844
+ matchElementWithDom(s1)
845
+
846
+ p1.appendChild(s1)
847
+ expect(p1slot0.getComposedChildren()).toStrictEqual([s1, s2, c3, s3, c4])
848
+ expect(p1slot1.getComposedChildren()).toStrictEqual([c1, c5])
849
+ expect(p1slot2.getComposedChildren()).toStrictEqual([c2])
850
+ expect(s1.getComposedChildren()).toStrictEqual([])
851
+ expect(s2.getComposedChildren()).toStrictEqual([])
852
+ matchElementWithDom(p1)
853
+
854
+ glassEasel.Element.setSlotName(p1slot1, '2')
855
+ expect(p1slot0.getComposedChildren()).toStrictEqual([s1, s2, c3, s3, c4])
856
+ expect(p1slot1.getComposedChildren()).toStrictEqual([c2])
857
+ expect(p1slot2.getComposedChildren()).toStrictEqual([])
858
+ expect(s1.getComposedChildren()).toStrictEqual([])
859
+ expect(s2.getComposedChildren()).toStrictEqual([])
860
+ matchElementWithDom(p1)
861
+
862
+ p1slot0.parentNode.removeChild(p1slot0)
863
+ expect(p1slot0.getComposedChildren()).toStrictEqual([])
864
+ expect(p1slot1.getComposedChildren()).toStrictEqual([c2])
865
+ expect(p1slot2.getComposedChildren()).toStrictEqual([])
866
+ expect(s1.getComposedChildren()).toStrictEqual([])
867
+ expect(s2.getComposedChildren()).toStrictEqual([])
868
+ matchElementWithDom(p1)
869
+
870
+ glassEasel.Element.setSlotName(p1slot1, '')
871
+ expect(p1slot0.getComposedChildren()).toStrictEqual([])
872
+ expect(p1slot1.getComposedChildren()).toStrictEqual([s1, s2, c3, s3, c4])
873
+ expect(p1slot2.getComposedChildren()).toStrictEqual([c2])
874
+ expect(s1.getComposedChildren()).toStrictEqual([])
875
+ expect(s2.getComposedChildren()).toStrictEqual([])
876
+ matchElementWithDom(p1)
877
+
878
+ glassEasel.Element.setSlotName(p1slot1, '1')
879
+ expect(p1slot0.getComposedChildren()).toStrictEqual([])
880
+ expect(p1slot1.getComposedChildren()).toStrictEqual([c1, c5])
881
+ expect(p1slot2.getComposedChildren()).toStrictEqual([c2])
882
+ expect(s1.getComposedChildren()).toStrictEqual([])
883
+ expect(s2.getComposedChildren()).toStrictEqual([])
884
+ matchElementWithDom(p1)
885
+
886
+ p1slot2.parentNode.removeChild(p1slot2)
887
+ expect(p1slot0.getComposedChildren()).toStrictEqual([])
888
+ expect(p1slot1.getComposedChildren()).toStrictEqual([c1, c5])
889
+ expect(p1slot2.getComposedChildren()).toStrictEqual([])
890
+ expect(s1.getComposedChildren()).toStrictEqual([])
891
+ expect(s2.getComposedChildren()).toStrictEqual([])
892
+ matchElementWithDom(p1)
893
+
894
+ p1.shadowRoot.appendChild(p1slot0)
895
+ expect(p1slot0.getComposedChildren()).toStrictEqual([s1, s2, c3, s3, c4])
896
+ expect(p1slot1.getComposedChildren()).toStrictEqual([c1, c5])
897
+ expect(p1slot2.getComposedChildren()).toStrictEqual([])
898
+ expect(s1.getComposedChildren()).toStrictEqual([])
899
+ expect(s2.getComposedChildren()).toStrictEqual([])
900
+ matchElementWithDom(p1)
901
+ })
902
+
903
+ })
904
+
905
+ }
906
+
907
+ describe('VirtualNode (DOM backend)', function(){
908
+ testCases(domBackend)
909
+ })
910
+ describe('VirtualNode (shadow backend)', function(){
911
+ testCases(shadowBackend)
912
+ })
913
+ describe('VirtualNode (composed backend)', function(){
914
+ testCases(composedBackend)
915
+ })