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,176 @@
1
+ /* eslint-disable */
2
+
3
+ const { tmpl, domBackend, shadowBackend } = require('../base/env')
4
+ const glassEasel = require('../../src')
5
+
6
+ const componentSpace = new glassEasel.ComponentSpace()
7
+ componentSpace.updateComponentOptions({
8
+ writeFieldsToNode: true,
9
+ })
10
+ componentSpace.defineComponent({
11
+ is: '',
12
+ })
13
+
14
+ const regElem = (config) => {
15
+ const { template, ...c } = config
16
+ if (template) c.template = tmpl(template)
17
+ return componentSpace.defineComponent(c)
18
+ }
19
+
20
+ const createElem = (is, backend) => {
21
+ const def = componentSpace.getComponent(is)
22
+ return glassEasel.Component.createWithContext(is || 'test', def, backend || domBackend)
23
+ }
24
+
25
+ describe('Generics, using and write-only', function(){
26
+
27
+ beforeAll(function(){
28
+ regElem({
29
+ is: 'generics-common',
30
+ options: {
31
+ writeOnly: true
32
+ },
33
+ template: '<span />'
34
+ })
35
+ regElem({
36
+ is: 'generics-common-cross-domain',
37
+ options: {
38
+ domain: 'XXX'
39
+ },
40
+ template: '<span />'
41
+ })
42
+ })
43
+
44
+ describe('Component using', function(){
45
+
46
+ it('should support using', function(){
47
+ var compA = regElem({
48
+ is: 'generics-using-a',
49
+ properties: {
50
+ propA: String
51
+ },
52
+ template: '<span></span>'
53
+ })
54
+ regElem({
55
+ is: 'generics-using-b',
56
+ using: {
57
+ 'a-a': 'generics-using-a',
58
+ 'a-b': compA
59
+ },
60
+ template: '<a-a></a-a><a-b></a-b>'
61
+ })
62
+ var elem = createElem('generics-using-b')
63
+ expect(elem.shadowRoot.childNodes[0].is).toStrictEqual('generics-using-a')
64
+ expect(elem.shadowRoot.childNodes[0].$$.tagName).toStrictEqual('A-A')
65
+ expect(elem.shadowRoot.childNodes[0].propA).toStrictEqual('')
66
+ expect(elem.shadowRoot.childNodes[0].shadowRoot.childNodes[0].is).toStrictEqual('span')
67
+ expect(elem.shadowRoot.childNodes[1].is).toStrictEqual('generics-using-a')
68
+ expect(elem.shadowRoot.childNodes[1].$$.tagName).toStrictEqual('A-B')
69
+ expect(elem.shadowRoot.childNodes[1].propA).toStrictEqual('')
70
+ var child1 = elem.shadowRoot.createComponent('a-a')
71
+ var child2 = elem.shadowRoot.createComponent('a-b')
72
+ expect(child1.is).toStrictEqual('generics-using-a')
73
+ expect(child1.$$.tagName).toStrictEqual('A-A')
74
+ expect(child2.is).toStrictEqual('generics-using-a')
75
+ expect(child2.$$.tagName).toStrictEqual('A-B')
76
+ })
77
+
78
+ })
79
+
80
+ describe('Component generics', function(){
81
+
82
+ it('should be able to declare generics', function(){
83
+ regElem({
84
+ is: 'generics-declare-inner',
85
+ generics: {
86
+ 'g-a': '',
87
+ 'g-b': {
88
+ default: 'generics-common'
89
+ },
90
+ },
91
+ template: '<g-a></g-a><g-b></g-b>'
92
+ })
93
+ regElem({
94
+ is: 'generics-declare-outer',
95
+ using: {
96
+ 'g-common': 'generics-common'
97
+ },
98
+ template: '<generics-declare-inner generic:g-a="generics-common" />'
99
+ })
100
+ var elem = createElem('generics-declare-outer')
101
+ expect(elem.is).toStrictEqual('generics-declare-outer')
102
+ expect(elem.shadowRoot.childNodes[0].is).toStrictEqual('generics-declare-inner')
103
+ expect(elem.shadowRoot.childNodes[0].$$.tagName).toStrictEqual('GENERICS-DECLARE-INNER')
104
+ expect(elem.shadowRoot.childNodes[0].shadowRoot.childNodes[0].is).toStrictEqual('generics-common')
105
+ expect(elem.shadowRoot.childNodes[0].shadowRoot.childNodes[0].$$.tagName).toStrictEqual('G-A')
106
+ expect(elem.shadowRoot.childNodes[0].shadowRoot.childNodes[1].is).toStrictEqual('generics-common')
107
+ expect(elem.shadowRoot.childNodes[0].shadowRoot.childNodes[1].$$.tagName).toStrictEqual('G-B')
108
+ })
109
+
110
+ it('should be able to pass generics', function(){
111
+ regElem({
112
+ is: 'generics-passing-a',
113
+ generics: {
114
+ 'g-a': ''
115
+ },
116
+ template: '<g-a id="x"></g-a>'
117
+ })
118
+ regElem({
119
+ is: 'generics-passing-b',
120
+ generics: {
121
+ 'g-b': ''
122
+ },
123
+ using: {
124
+ 'c-a': 'generics-passing-a'
125
+ },
126
+ template: '<c-a generic:g-a="g-b" id="x" />'
127
+ })
128
+ regElem({
129
+ is: 'generics-passing-c',
130
+ using: {
131
+ 'c-common': 'generics-common',
132
+ 'c-b': 'generics-passing-b'
133
+ },
134
+ template: '<c-b generic:g-b="c-common" id="x" />'
135
+ })
136
+ var elem = createElem('generics-passing-c')
137
+ expect(elem.is).toStrictEqual('generics-passing-c')
138
+ expect(elem.$.x.is).toStrictEqual('generics-passing-b')
139
+ expect(elem.$.x.$.x.is).toStrictEqual('generics-passing-a')
140
+ expect(elem.$.x.$.x.$.x.is).toStrictEqual('generics-common')
141
+ expect(elem.$.x.$.x.$.x.$$.tagName).toStrictEqual('G-A')
142
+ })
143
+
144
+ it('should be able to pass a cross domain component', function(){
145
+ regElem({
146
+ is: 'generics-cross-domain-inner',
147
+ options: {
148
+ domain: 'XXX'
149
+ },
150
+ generics: {
151
+ 'g-a': ''
152
+ },
153
+ template: '<g-a></g-a>'
154
+ })
155
+ regElem({
156
+ is: 'generics-cross-domain-outer',
157
+ using: {
158
+ 'x-domain': 'generics-cross-domain-inner'
159
+ },
160
+ template: '<x-domain generic:g-a="generics-common-cross-domain" /> <x-domain generic:g-a="generics-common" />'
161
+ })
162
+ var elem = createElem('generics-cross-domain-outer')
163
+ expect(elem.is).toStrictEqual('generics-cross-domain-outer')
164
+ expect(elem.shadowRoot.childNodes[0].is).toStrictEqual('generics-cross-domain-inner')
165
+ expect(elem.shadowRoot.childNodes[0].$$.tagName).toStrictEqual('X-DOMAIN')
166
+ expect(elem.shadowRoot.childNodes[0].shadowRoot.childNodes[0].is).toStrictEqual('generics-common-cross-domain')
167
+ expect(elem.shadowRoot.childNodes[0].shadowRoot.childNodes[0].$$.tagName).toStrictEqual('G-A')
168
+ expect(elem.shadowRoot.childNodes[1].is).toStrictEqual('generics-cross-domain-inner')
169
+ expect(elem.shadowRoot.childNodes[1].$$.tagName).toStrictEqual('X-DOMAIN')
170
+ expect(elem.shadowRoot.childNodes[1].shadowRoot.childNodes[0].is).toStrictEqual('generics-common')
171
+ expect(elem.shadowRoot.childNodes[1].shadowRoot.childNodes[0].$$.tagName).toStrictEqual('G-A')
172
+ })
173
+
174
+ })
175
+
176
+ })
@@ -0,0 +1,210 @@
1
+ /* eslint-disable */
2
+
3
+ const { tmpl, domBackend } = require('../base/env')
4
+ const glassEasel = require('../../src')
5
+
6
+ const componentSpace = new glassEasel.ComponentSpace()
7
+ componentSpace.updateComponentOptions({
8
+ writeFieldsToNode: true,
9
+ })
10
+ componentSpace.defineComponent({
11
+ is: '',
12
+ })
13
+
14
+ const regElem = (config) => {
15
+ const { template, ...c } = config
16
+ if (template) c.template = tmpl(template)
17
+ return componentSpace.defineComponent(c)
18
+ }
19
+
20
+ const createElem = (is, backend) => {
21
+ const def = componentSpace.getComponent(is)
22
+ return glassEasel.Component.createWithContext(is || 'test', def, backend || domBackend)
23
+ }
24
+
25
+ describe('Observer', function(){
26
+ var root = null
27
+
28
+ beforeAll(function(){
29
+ regElem({
30
+ is: 'observer-a',
31
+ template: '<slot></slot>',
32
+ properties: {
33
+ a: {
34
+ type: String,
35
+ public: true
36
+ },
37
+ b: {
38
+ type: Number,
39
+ public: true
40
+ }
41
+ }
42
+ })
43
+ })
44
+
45
+ it('should create an observer', function(){
46
+ var elem = createElem('observer-a')
47
+ var observer = glassEasel.Observer.create(function(){
48
+ throw(new Error())
49
+ })
50
+ expect(observer).toBeInstanceOf(glassEasel.MutationObserver)
51
+ observer.observe(elem)
52
+ elem.a = 'TEST'
53
+ elem.appendChild(createElem('observer-a'))
54
+ })
55
+
56
+ it('should be able to observe different types of changes', function(){
57
+ var parent = createElem('observer-a')
58
+ var elem = parent.shadowRoot.createComponent('observer-a')
59
+ var child = parent.shadowRoot.createTextNode('text')
60
+ var eventsLeft = 4
61
+ var cb = function(e){
62
+ expect(this).toBe(elem)
63
+ if(eventsLeft === 4) {
64
+ expect(e.type).toBe('properties')
65
+ expect(e.target).toBe(elem)
66
+ expect(e.propertyName).toBe('a')
67
+ } else if(eventsLeft === 3) {
68
+ expect(e.type).toBe('childList')
69
+ expect(e.target).toBe(elem)
70
+ expect(e.addedNodes[0]).toBe(child)
71
+ } else if(eventsLeft === 1) {
72
+ expect(e.type).toBe('childList')
73
+ expect(e.target).toBe(elem)
74
+ expect(e.removedNodes[0]).toBe(child)
75
+ } else if(eventsLeft === 2) {
76
+ expect(e.type).toBe('characterData')
77
+ expect(e.target).toBe(child)
78
+ }
79
+ eventsLeft--
80
+ }
81
+ elem.b = 1
82
+ elem.appendChild(child)
83
+ elem.removeChild(child)
84
+ var observer = glassEasel.MutationObserver.create(cb)
85
+ observer.observe(elem, {properties: true, childList: true})
86
+ child.textContent = 'old'
87
+ var observer2 = glassEasel.MutationObserver.create(cb)
88
+ observer2.observe(elem, {characterData: true, subtree: true})
89
+ elem.a = 'a'
90
+ elem.appendChild(child)
91
+ child.textContent = 'new'
92
+ elem.removeChild(child)
93
+ expect(eventsLeft).toBe(0)
94
+ })
95
+
96
+ it('should be able to observe core property changes', function(){
97
+ var elem = createElem('observer-a')
98
+ var expectPropertyNameList = ['id', 'slot', 'class', 'class', 'class', 'class', 'style']
99
+ var observer = glassEasel.MutationObserver.create(function(e){
100
+ expect(this).toBe(e.target)
101
+ expect(e.type).toBe('properties')
102
+ expect(e.target).toBe(elem)
103
+ expect(e.attributeName).toBe(expectPropertyNameList.shift())
104
+ })
105
+ observer.observe(elem, {properties: true})
106
+ elem.id = 'a'
107
+ elem.slot = 'b'
108
+ elem.class = 'c'
109
+ elem.classList.toggle('c')
110
+ elem.classList.toggle('c')
111
+ elem.classList.toggle('c', true)
112
+ elem.classList.toggle('d', false)
113
+ elem.classList.toggle('d', true)
114
+ elem.style = 'd'
115
+ expect(expectPropertyNameList.length).toBe(0)
116
+ })
117
+
118
+ it('should be able to disconnect', function(){
119
+ var elem = createElem('observer-a')
120
+ var eventsLeft = 1
121
+ var observer = glassEasel.MutationObserver.create(function(){
122
+ eventsLeft--
123
+ })
124
+ elem.a = 1
125
+ observer.observe(elem, {properties: true})
126
+ elem.a = 2
127
+ observer.disconnect()
128
+ elem.a = 3
129
+ expect(eventsLeft).toBe(0)
130
+ })
131
+
132
+ it('should allow subtree observers', function(){
133
+ var parent = createElem('observer-a')
134
+ var elem1 = parent.shadowRoot.createComponent('observer-a')
135
+ var elem2 = parent.shadowRoot.createComponent('observer-a')
136
+ var elem3 = parent.shadowRoot.createComponent('observer-a')
137
+ var elem4 = parent.shadowRoot.createTextNode('')
138
+ var eventsLeft = 4
139
+ var observer = glassEasel.MutationObserver.create(function(e){
140
+ expect(this).toBe(elem1)
141
+ if(eventsLeft === 2) {
142
+ expect(e.type).toBe('characterData')
143
+ expect(e.target).toBeInstanceOf(glassEasel.TextNode)
144
+ expect(e.target.textContent).toBe('3')
145
+ } else {
146
+ expect(e.type).toBe('properties')
147
+ expect(e.target).toBeInstanceOf(glassEasel.Element)
148
+ expect(e.propertyName).toBe('a')
149
+ expect(e.target.a <= 4).toBe(true)
150
+ }
151
+ eventsLeft--
152
+ })
153
+ expect(glassEasel.Element.hasSubtreeMutationObservers(elem1)).toBe(false)
154
+ observer.observe(elem1, {properties: true, characterData: true, subtree: true})
155
+ elem1.a = 1
156
+ elem1.appendChild(elem2)
157
+ elem3.appendChild(elem4)
158
+ elem1.insertBefore(elem3, elem2)
159
+ elem2.a = 2
160
+ elem2.appendChild(elem3)
161
+ elem4.textContent = 3
162
+ expect(glassEasel.Element.hasSubtreeMutationObservers(elem1)).toBe(true)
163
+ expect(glassEasel.Element.hasSubtreeMutationObservers(elem2)).toBe(true)
164
+ expect(glassEasel.Element.hasSubtreeMutationObservers(elem3)).toBe(true)
165
+ elem1.replaceChild(elem3, elem2)
166
+ expect(glassEasel.Element.hasSubtreeMutationObservers(elem2)).toBe(false)
167
+ expect(glassEasel.Element.hasSubtreeMutationObservers(elem3)).toBe(true)
168
+ elem1.removeChild(elem3)
169
+ expect(glassEasel.Element.hasSubtreeMutationObservers(elem3)).toBe(false)
170
+ elem1.a = 4
171
+ elem2.a = 5
172
+ elem3.a = 6
173
+ expect(eventsLeft).toBe(0)
174
+ })
175
+
176
+ it('should allow attach status observers', function(){
177
+ var elem1 = createElem('observer-a')
178
+ var elem2 = createElem('observer-a')
179
+ var eventsLeft = 4
180
+ var observer1 = glassEasel.MutationObserver.create(function(e){
181
+ expect(this).toBe(elem1)
182
+ expect(e.type).toBe('attachStatus')
183
+ expect(e.target).toBe(elem1)
184
+ if(eventsLeft > 2) {
185
+ expect(e.status).toBe('attached')
186
+ } else {
187
+ expect(e.status).toBe('detached')
188
+ }
189
+ eventsLeft--
190
+ })
191
+ var observer2 = glassEasel.MutationObserver.create(function(e){
192
+ expect(this).toBe(elem2)
193
+ expect(e.type).toBe('attachStatus')
194
+ expect(e.target).toBe(elem2)
195
+ if(eventsLeft > 2) {
196
+ expect(e.status).toBe('attached')
197
+ } else {
198
+ expect(e.status).toBe('detached')
199
+ }
200
+ eventsLeft--
201
+ })
202
+ observer1.observe(elem1, {attachStatus: true, subtree: true})
203
+ observer2.observe(elem2, {attachStatus: true})
204
+ elem1.appendChild(elem2)
205
+ glassEasel.Element.pretendAttached(elem1)
206
+ glassEasel.Element.pretendDetached(elem1)
207
+ expect(eventsLeft).toBe(0)
208
+ })
209
+
210
+ })