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,263 @@
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 regBeh = (config) => {
15
+ return componentSpace.defineBehavior(config)
16
+ }
17
+
18
+ const regElem = (config) => {
19
+ const { template, ...c } = config
20
+ if (template) c.template = tmpl(template)
21
+ return componentSpace.defineComponent(c)
22
+ }
23
+
24
+ const createElem = (is, backend) => {
25
+ const def = componentSpace.getComponent(is)
26
+ return glassEasel.Component.createWithContext(is || 'test', def, backend || domBackend)
27
+ }
28
+
29
+ describe('Selector', function(){
30
+
31
+ describe('Element.parseSelector', function(){
32
+
33
+ it('should parse a selector string to a selector object', function(){
34
+ var selector = glassEasel.Element.parseSelector('#b:.-c._d_')
35
+ expect(typeof selector).toBe('object')
36
+ regElem({
37
+ is: 'glassEasel-selector-parse',
38
+ template: '<div id="b:" class="_d_ -c"/>'
39
+ })
40
+ var elem = createElem('glassEasel-selector-parse').shadowRoot
41
+ expect(elem.matchSelector(selector, elem.childNodes[0])).toBe(true)
42
+ })
43
+
44
+ it('should return null on failure', function(){
45
+ expect(glassEasel.Element.parseSelector('.-').isEmpty()).toBe(true)
46
+ })
47
+
48
+ })
49
+
50
+ describe('#matchSelector', function(){
51
+
52
+ beforeAll(function(){
53
+ regElem({
54
+ is: 'glassEasel-selector-match-selector-a',
55
+ template: '<div id="b" class="b"> b <slot/> </div> <div id="c" class="c"/>'
56
+ })
57
+ regElem({
58
+ is: 'glassEasel-selector-match-selector-b',
59
+ template: '<glassEasel-selector-match-selector-a id="a" class="a"> a <span id="b" class="b"> b <span id="c" class="c"/></span> </glassEasel-selector-match-selector-a>'
60
+ })
61
+ })
62
+
63
+ it('should be able to test selector (without deep selector)', function(){
64
+ var elem = createElem('glassEasel-selector-match-selector-b')
65
+ expect(elem.matchSelector('.a .b', elem.$.b)).toBe(false)
66
+ expect(glassEasel.Element.matchSelector('.a .b', elem.$.b)).toBe(true)
67
+ expect(elem.$.a.shadowRoot.matchSelector('.a, .b', elem)).toBe(false)
68
+ expect(elem.$.a.shadowRoot.matchSelector('.a .b', elem.$.a.$.b)).toBe(false)
69
+ expect(elem.shadowRoot.matchSelector('.aa .b', elem.$.b)).toBe(false)
70
+ expect(elem.shadowRoot.matchSelector('.a .b', elem.$.b)).toBe(true)
71
+ expect(elem.shadowRoot.matchSelector(' .a .c ', elem.$.c)).toBe(true)
72
+ expect(elem.shadowRoot.matchSelector('.a>.b', elem.$.b)).toBe(true)
73
+ expect(elem.shadowRoot.matchSelector('.a >.c', elem.$.c)).toBe(false)
74
+ expect(elem.shadowRoot.matchSelector('.a .b, .a >.c ', elem.$.b)).toBe(true)
75
+ expect(elem.shadowRoot.matchSelector(' .a .c ,.a> .b', elem.$.c)).toBe(true)
76
+ expect(elem.shadowRoot.matchSelector('.a>.b,.a > .c', elem.$.b)).toBe(true)
77
+ expect(elem.$.a.shadowRoot.matchSelector(' .a .b', elem.$.a.$.b)).toBe(false)
78
+ expect(elem.$.a.shadowRoot.matchSelector('.a .c ', elem.$.a.$.c)).toBe(false)
79
+ expect(elem.$.a.shadowRoot.matchSelector('.a> .b', elem.$.a.$.b)).toBe(false)
80
+ expect(elem.$.a.shadowRoot.matchSelector('.a > .c', elem.$.a.$.c)).toBe(false)
81
+ })
82
+
83
+ it('should be able to test selector (with deep selector)', function(){
84
+ var owner = createElem('glassEasel-selector-match-selector-a')
85
+ var elem = owner.shadowRoot.createComponent('glassEasel-selector-match-selector-b')
86
+ elem.classList.toggle('e', true)
87
+ var parent = owner.shadowRoot.createVirtualNode()
88
+ parent.appendChild(elem)
89
+ expect(parent.matchSelector('.a >>> .b', elem.$.b)).toBe(false)
90
+ expect(parent.matchSelector('.e >>>.a>>> .b', elem.$.b)).toBe(true)
91
+ expect(parent.matchSelector('.e>>>.b', elem.$.b)).toBe(true)
92
+ expect(glassEasel.Element.matchSelector('.a >>> .b', elem.$.b)).toBe(true)
93
+ expect(elem.$.a.shadowRoot.matchSelector('.a >>> .b', elem)).toBe(false)
94
+ expect(elem.$.a.shadowRoot.matchSelector('.a >>> .b', elem.$.a.$.b)).toBe(false)
95
+ expect(parent.matchSelector('.e >>> .aa >>> .b', elem.$.b)).toBe(false)
96
+ expect(elem.matchSelector('.e >>> .a >>> .b', elem.$.b)).toBe(false)
97
+ expect(parent.matchSelector('.e >>> .a > .c', elem.$.c)).toBe(false)
98
+ expect(parent.matchSelector('.e >>> .a >>> .b, .a > .c ', elem.$.b)).toBe(true)
99
+ expect(elem.shadowRoot.matchSelector('.a >>> .b', elem.$.b)).toBe(true)
100
+ expect(elem.shadowRoot.matchSelector('.a >>> .b', elem.$.a.$.b)).toBe(true)
101
+ expect(elem.shadowRoot.matchSelector('.a >>> .c', elem.$.c)).toBe(true)
102
+ expect(parent.matchSelector('.e >>> .a >>> .c', elem.$.c)).toBe(true)
103
+ expect(parent.matchSelector('.a >>> .c', elem.$.c)).toBe(false)
104
+ elem.classList.toggle('a', true)
105
+ var mid = owner.shadowRoot.createNativeNode('div')
106
+ mid.appendChild(elem)
107
+ parent.appendChild(mid)
108
+ expect(parent.matchSelector('.f > .a >>> .c', elem.$.c)).toBe(false)
109
+ mid.classList.toggle('f')
110
+ expect(parent.matchSelector('.f > .a >>> .c', elem.$.c)).toBe(true)
111
+ })
112
+
113
+ })
114
+
115
+ describe('#querySelector, #querySelectorAll', function(){
116
+
117
+ var compDefC = null
118
+
119
+ beforeAll(function(){
120
+ regElem({
121
+ is: 'glassEasel-selector-query-selector-a',
122
+ template: '<div id="a1" class="a common"/> <slot/> <div id="a2" class="common a"/>'
123
+ })
124
+ regElem({
125
+ is: 'glassEasel-selector-query-selector-b',
126
+ template: '<glassEasel-selector-query-selector-a id="a1" class="a"> <span id="b" class="common"/> </glassEasel-selector-query-selector-a> <glassEasel-selector-query-selector-a id="a2" class="a"/>'
127
+ })
128
+ componentSpace.exportComponent('glassEasel-selector-query-selector-a', 'glassEasel-selector-query-selector-a')
129
+ const componentSpace2 = new glassEasel.ComponentSpace('', componentSpace)
130
+ compDefC = componentSpace2.defineComponent({
131
+ is: 'glassEasel-selector-query-selector-c',
132
+ template: tmpl('<glassEasel-selector-query-selector-a id="a" class="a"/> <div id="c" class="c"/>')
133
+ })
134
+ })
135
+
136
+ it('should be able to select virtual-host components', function(){
137
+ regElem({
138
+ is: 'glassEasel-selector-query-selector-virtual-host-a',
139
+ options: {
140
+ virtualHost: true,
141
+ },
142
+ template: '<slot />'
143
+ })
144
+ regElem({
145
+ is: 'glassEasel-selector-query-selector-virtual-host-b',
146
+ options: {
147
+ virtualHost: true,
148
+ },
149
+ template: '<div><glassEasel-selector-query-selector-virtual-host-a class="a" /></div>'
150
+ })
151
+ var elem = createElem('glassEasel-selector-query-selector-virtual-host-b')
152
+ expect(elem.shadowRoot.querySelector('.a')).toBe(elem.shadowRoot.childNodes[0].childNodes[0])
153
+ })
154
+
155
+ it('should be able to select the first matched node (without deep selector)', function(){
156
+ var elem = createElem('glassEasel-selector-query-selector-b')
157
+ expect(elem.querySelector('.a')).toBe(null)
158
+ expect(elem.shadowRoot.querySelector('.a')).toBe(elem.$.a1)
159
+ expect(elem.shadowRoot.querySelector('#a1, #a2')).toBe(elem.$.a1)
160
+ expect(elem.shadowRoot.querySelector('#a2, #a1')).toBe(elem.$.a1)
161
+ expect(elem.shadowRoot.querySelector('#b, #a2')).toBe(elem.$.b)
162
+ expect(elem.shadowRoot.querySelector('#a2')).toBe(elem.$.a2)
163
+ expect(elem.shadowRoot.querySelector('.common')).toBe(elem.$.b)
164
+ expect(elem.shadowRoot.querySelector('#a2.common')).toBe(null)
165
+ expect(elem.shadowRoot.querySelector('#b.common')).toBe(elem.$.b)
166
+ })
167
+
168
+ it('should be able to select the first matched node (with deep selector)', function(){
169
+ var owner = createElem('glassEasel-selector-query-selector-a')
170
+ var elem = owner.shadowRoot.createComponent('glassEasel-selector-query-selector-b')
171
+ elem.classList.toggle('b', true)
172
+ var parent = owner.shadowRoot.createVirtualNode()
173
+ parent.appendChild(elem)
174
+ expect(parent.querySelector('.b')).toBe(elem)
175
+ expect(parent.querySelector('.a')).toBe(null)
176
+ expect(parent.querySelector('.b .a')).toBe(null)
177
+ expect(parent.querySelector('.b >>> .a')).toBe(elem.$.a1)
178
+ expect(parent.querySelector('.b >>> #b')).toBe(elem.$.b)
179
+ expect(parent.querySelector('.b >>> #a1, .b >>> #a2')).toBe(elem.$.a1)
180
+ expect(parent.querySelector('.b >>> #a2, .b >>> #a1')).toBe(elem.$.a1)
181
+ expect(parent.querySelector('.b >>> #a2')).toBe(elem.$.a1.$.a2)
182
+ expect(parent.querySelector('.b >>> #b, .b >>> #a2')).toBe(elem.$.a1.$.a2)
183
+ expect(parent.querySelector('.b >>> .common')).toBe(elem.$.a1.$.a1)
184
+ expect(parent.querySelector('.b >>> #a2.common')).toBe(elem.$.a1.$.a2)
185
+ expect(parent.querySelector('.b >>> #b.common')).toBe(elem.$.b)
186
+ })
187
+
188
+ it('should be able to select all matched nodes (without deep selector)', function(){
189
+ var elem = createElem('glassEasel-selector-query-selector-b')
190
+ expect(elem.querySelectorAll('.a')).toStrictEqual([])
191
+ expect(elem.shadowRoot.querySelectorAll('.a')).toStrictEqual([elem.$.a1, elem.$.a2])
192
+ expect(elem.shadowRoot.querySelectorAll('#a1, #a2')).toStrictEqual([elem.$.a1, elem.$.a2])
193
+ expect(elem.shadowRoot.querySelectorAll('#a2, #a1')).toStrictEqual([elem.$.a1, elem.$.a2])
194
+ expect(elem.shadowRoot.querySelectorAll('#b, #a2')).toStrictEqual([elem.$.b, elem.$.a2])
195
+ expect(elem.shadowRoot.querySelectorAll('#a2')).toStrictEqual([elem.$.a2])
196
+ expect(elem.shadowRoot.querySelectorAll('.common')).toStrictEqual([elem.$.b])
197
+ expect(elem.shadowRoot.querySelectorAll('#a2.common')).toStrictEqual([])
198
+ expect(elem.shadowRoot.querySelectorAll('#b.common')).toStrictEqual([elem.$.b])
199
+ })
200
+
201
+ it('should be able to select all matched nodes (with deep selector)', function(){
202
+ var owner = createElem('glassEasel-selector-query-selector-a')
203
+ var elem = owner.shadowRoot.createComponent('glassEasel-selector-query-selector-b')
204
+ elem.classList.toggle('b', true)
205
+ var parent = owner.shadowRoot.createVirtualNode()
206
+ parent.appendChild(elem)
207
+ expect(parent.querySelectorAll('.b')).toStrictEqual([elem])
208
+ expect(parent.querySelectorAll('.a')).toStrictEqual([])
209
+ expect(parent.querySelectorAll('.b .a')).toStrictEqual([])
210
+ expect(parent.querySelectorAll('.b >>> .a')).toStrictEqual([elem.$.a1, elem.$.a1.$.a1, elem.$.a1.$.a2, elem.$.a2, elem.$.a2.$.a1, elem.$.a2.$.a2])
211
+ expect(parent.querySelectorAll('.b >>> #b')).toStrictEqual([elem.$.b])
212
+ expect(parent.querySelectorAll('.b >>> #a1, .b >>> #a2')).toStrictEqual([elem.$.a1, elem.$.a1.$.a1, elem.$.a1.$.a2, elem.$.a2, elem.$.a2.$.a1, elem.$.a2.$.a2])
213
+ expect(parent.querySelectorAll('.b >>> #a2, .b >>> #a1')).toStrictEqual([elem.$.a1, elem.$.a1.$.a1, elem.$.a1.$.a2, elem.$.a2, elem.$.a2.$.a1, elem.$.a2.$.a2])
214
+ expect(parent.querySelectorAll('.b >>> #a2')).toStrictEqual([elem.$.a1.$.a2, elem.$.a2, elem.$.a2.$.a2])
215
+ expect(parent.querySelectorAll('.b >>> #b, .b >>> #a2')).toStrictEqual([elem.$.a1.$.a2, elem.$.b, elem.$.a2, elem.$.a2.$.a2])
216
+ expect(parent.querySelectorAll('.b >>> .common')).toStrictEqual([elem.$.a1.$.a1, elem.$.a1.$.a2, elem.$.b, elem.$.a2.$.a1, elem.$.a2.$.a2])
217
+ expect(parent.querySelectorAll('.b >>> #a2.common')).toStrictEqual([elem.$.a1.$.a2, elem.$.a2.$.a2])
218
+ expect(parent.querySelectorAll('.b >>> #b.common')).toStrictEqual([elem.$.b])
219
+ })
220
+
221
+ it('should prevent deep selector find in different component space', function(){
222
+ var cs1 = new glassEasel.ComponentSpace()
223
+ var cs2 = new glassEasel.ComponentSpace()
224
+ var compDef = cs2.defineComponent({
225
+ template: tmpl('<div class="b"></div>'),
226
+ })
227
+ var innerCompDef = cs1.defineComponent({
228
+ using: {
229
+ comp: compDef,
230
+ },
231
+ template: tmpl('<comp class="inner"></comp>'),
232
+ })
233
+ var outerCompDef = cs2.defineComponent({
234
+ using: {
235
+ inner: innerCompDef,
236
+ },
237
+ template: tmpl('<inner class="a"></inner>'),
238
+ })
239
+ var owner = glassEasel.Component.createWithContext('test', outerCompDef, domBackend)
240
+ var parent = owner.shadowRoot
241
+ var a = parent.childNodes[0]
242
+ var inner = a.shadowRoot.childNodes[0]
243
+ var b = inner.shadowRoot.childNodes[0]
244
+ expect(parent.querySelectorAll('.a')).toStrictEqual([a])
245
+ expect(parent.querySelectorAll('.b')).toStrictEqual([])
246
+ expect(parent.querySelectorAll('.inner')).toStrictEqual([])
247
+ expect(parent.querySelectorAll('.a >>> .inner')).toStrictEqual([])
248
+ expect(parent.querySelectorAll('.a >>> .b')).toStrictEqual([b])
249
+ expect(parent.querySelectorAll('.b >>> .inner >>> .b')).toStrictEqual([])
250
+ expect(a.shadowRoot.querySelectorAll('.inner')).toStrictEqual([inner])
251
+ expect(a.shadowRoot.querySelectorAll('.b')).toStrictEqual([])
252
+ expect(a.shadowRoot.querySelectorAll('.inner >>> .b')).toStrictEqual([])
253
+ expect(a.shadowRoot.querySelectorAll('.inner >>> .b')).toStrictEqual([])
254
+ expect(parent.matchSelector('.a >>> .b', b)).toBe(true)
255
+ expect(parent.matchSelector('.inner', inner)).toBe(false)
256
+ expect(glassEasel.Element.matchSelector('.a', a)).toBe(true)
257
+ expect(glassEasel.Element.matchSelector('.inner', inner)).toBe(true)
258
+ expect(glassEasel.Element.matchSelector('.a >>> .inner', inner)).toBe(false)
259
+ })
260
+
261
+ })
262
+
263
+ })