Skip to content

Commit 65c4229

Browse files
kfuledead-claudia
authored andcommitted
Make the attrs of non-element vnodes always non-null.
In #3041, it seemed that the case of non-element vnodes was not fully considered in terms of not breaking existing behavior.
1 parent c876faf commit 65c4229

File tree

4 files changed

+83
-0
lines changed

4 files changed

+83
-0
lines changed

render/fragment.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ var hyperscriptVnode = require("./hyperscriptVnode")
66
module.exports = function(attrs, ...children) {
77
var vnode = hyperscriptVnode(attrs, children)
88

9+
if (vnode.attrs == null) vnode.attrs = {}
910
vnode.tag = "["
1011
vnode.children = Vnode.normalizeChildren(vnode.children)
1112
return vnode

render/hyperscript.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ function hyperscript(selector, attrs, ...children) {
9696
if (selector !== "[") return execSelector(selectorCache[selector] || compileSelector(selector), vnode)
9797
}
9898

99+
if (vnode.attrs == null) vnode.attrs = {}
99100
vnode.tag = selector
100101
return vnode
101102
}

render/tests/test-fragment.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,50 +44,59 @@ function runTest(name, fragment) {
4444
o("handles string single child", function() {
4545
var vnode = fragment(["a"])
4646

47+
o(vnode.attrs).deepEquals({})
4748
o(vnode.children[0].tag).equals("#")
4849
o(vnode.children[0].children).equals("a")
4950
})
5051
o("handles falsy string single child", function() {
5152
var vnode = fragment([""])
5253

54+
o(vnode.attrs).deepEquals({})
5355
o(vnode.children[0].tag).equals("#")
5456
o(vnode.children[0].children).equals("")
5557
})
5658
o("handles number single child", function() {
5759
var vnode = fragment([1])
5860

61+
o(vnode.attrs).deepEquals({})
5962
o(vnode.children[0].tag).equals("#")
6063
o(vnode.children[0].children).equals("1")
6164
})
6265
o("handles falsy number single child", function() {
6366
var vnode = fragment([0])
6467

68+
o(vnode.attrs).deepEquals({})
6569
o(vnode.children[0].tag).equals("#")
6670
o(vnode.children[0].children).equals("0")
6771
})
6872
o("handles boolean single child", function() {
6973
var vnode = fragment([true])
7074

75+
o(vnode.attrs).deepEquals({})
7176
o(vnode.children).deepEquals([null])
7277
})
7378
o("handles falsy boolean single child", function() {
7479
var vnode = fragment([false])
7580

81+
o(vnode.attrs).deepEquals({})
7682
o(vnode.children).deepEquals([null])
7783
})
7884
o("handles null single child", function() {
7985
var vnode = fragment([null])
8086

87+
o(vnode.attrs).deepEquals({})
8188
o(vnode.children[0]).equals(null)
8289
})
8390
o("handles undefined single child", function() {
8491
var vnode = fragment([undefined])
8592

93+
o(vnode.attrs).deepEquals({})
8694
o(vnode.children).deepEquals([null])
8795
})
8896
o("handles multiple string children", function() {
8997
var vnode = fragment(["", "a"])
9098

99+
o(vnode.attrs).deepEquals({})
91100
o(vnode.children[0].tag).equals("#")
92101
o(vnode.children[0].children).equals("")
93102
o(vnode.children[1].tag).equals("#")
@@ -96,6 +105,7 @@ function runTest(name, fragment) {
96105
o("handles multiple number children", function() {
97106
var vnode = fragment([0, 1])
98107

108+
o(vnode.attrs).deepEquals({})
99109
o(vnode.children[0].tag).equals("#")
100110
o(vnode.children[0].children).equals("0")
101111
o(vnode.children[1].tag).equals("#")
@@ -104,16 +114,19 @@ function runTest(name, fragment) {
104114
o("handles multiple boolean children", function() {
105115
var vnode = fragment([false, true])
106116

117+
o(vnode.attrs).deepEquals({})
107118
o(vnode.children).deepEquals([null, null])
108119
})
109120
o("handles multiple null/undefined child", function() {
110121
var vnode = fragment([null, undefined])
111122

123+
o(vnode.attrs).deepEquals({})
112124
o(vnode.children).deepEquals([null, null])
113125
})
114126
o("handles falsy number single child without attrs", function() {
115127
var vnode = fragment(0)
116128

129+
o(vnode.attrs).deepEquals({})
117130
o(vnode.children[0].tag).equals("#")
118131
o(vnode.children[0].children).equals("0")
119132
})
@@ -122,50 +135,59 @@ function runTest(name, fragment) {
122135
o("handles string single child", function() {
123136
var vnode = fragment({}, ["a"])
124137

138+
o(vnode.attrs).deepEquals({})
125139
o(vnode.children[0].tag).equals("#")
126140
o(vnode.children[0].children).equals("a")
127141
})
128142
o("handles falsy string single child", function() {
129143
var vnode = fragment({}, [""])
130144

145+
o(vnode.attrs).deepEquals({})
131146
o(vnode.children[0].tag).equals("#")
132147
o(vnode.children[0].children).equals("")
133148
})
134149
o("handles number single child", function() {
135150
var vnode = fragment({}, [1])
136151

152+
o(vnode.attrs).deepEquals({})
137153
o(vnode.children[0].tag).equals("#")
138154
o(vnode.children[0].children).equals("1")
139155
})
140156
o("handles falsy number single child", function() {
141157
var vnode = fragment({}, [0])
142158

159+
o(vnode.attrs).deepEquals({})
143160
o(vnode.children[0].tag).equals("#")
144161
o(vnode.children[0].children).equals("0")
145162
})
146163
o("handles boolean single child", function() {
147164
var vnode = fragment({}, [true])
148165

166+
o(vnode.attrs).deepEquals({})
149167
o(vnode.children).deepEquals([null])
150168
})
151169
o("handles falsy boolean single child", function() {
152170
var vnode = fragment({}, [false])
153171

172+
o(vnode.attrs).deepEquals({})
154173
o(vnode.children).deepEquals([null])
155174
})
156175
o("handles null single child", function() {
157176
var vnode = fragment({}, [null])
158177

178+
o(vnode.attrs).deepEquals({})
159179
o(vnode.children).deepEquals([null])
160180
})
161181
o("handles undefined single child", function() {
162182
var vnode = fragment({}, [undefined])
163183

184+
o(vnode.attrs).deepEquals({})
164185
o(vnode.children).deepEquals([null])
165186
})
166187
o("handles multiple string children", function() {
167188
var vnode = fragment({}, ["", "a"])
168189

190+
o(vnode.attrs).deepEquals({})
169191
o(vnode.children[0].tag).equals("#")
170192
o(vnode.children[0].children).equals("")
171193
o(vnode.children[1].tag).equals("#")
@@ -174,6 +196,7 @@ function runTest(name, fragment) {
174196
o("handles multiple number children", function() {
175197
var vnode = fragment({}, [0, 1])
176198

199+
o(vnode.attrs).deepEquals({})
177200
o(vnode.children[0].tag).equals("#")
178201
o(vnode.children[0].children).equals("0")
179202
o(vnode.children[1].tag).equals("#")
@@ -182,11 +205,13 @@ function runTest(name, fragment) {
182205
o("handles multiple boolean children", function() {
183206
var vnode = fragment({}, [false, true])
184207

208+
o(vnode.attrs).deepEquals({})
185209
o(vnode.children).deepEquals([null, null])
186210
})
187211
o("handles multiple null/undefined child", function() {
188212
var vnode = fragment({}, [null, undefined])
189213

214+
o(vnode.attrs).deepEquals({})
190215
o(vnode.children).deepEquals([null, null])
191216
})
192217
})

render/tests/test-hyperscript.js

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,26 @@ o.spec("hyperscript", function() {
568568
o(vnode.children[0].tag).equals("i")
569569
o(vnode.children[1].tag).equals("s")
570570
})
571+
o("handles children without attr (fragment)", function() {
572+
var vnode = m("[", [m("i"), m("s")])
573+
574+
o(vnode.attrs).deepEquals({})
575+
o(vnode.children[0].tag).equals("i")
576+
o(vnode.children[1].tag).equals("s")
577+
})
578+
o("handles child without attr unwrapped (fragment)", function() {
579+
var vnode = m("[", m("i"))
580+
581+
o(vnode.attrs).deepEquals({})
582+
o(vnode.children[0].tag).equals("i")
583+
})
584+
o("handles children without attr unwrapped (fragment)", function() {
585+
var vnode = m("[", m("i"), m("s"))
586+
587+
o(vnode.attrs).deepEquals({})
588+
o(vnode.children[0].tag).equals("i")
589+
o(vnode.children[1].tag).equals("s")
590+
})
571591
o("handles shared attrs", function() {
572592
var attrs = {a: "b"}
573593

@@ -664,5 +684,41 @@ o.spec("hyperscript", function() {
664684
o(vnode.children.length).equals(1)
665685
o(vnode.children[0]).equals("b")
666686
})
687+
o("works with POJOs (without attrs)", function() {
688+
var component = {
689+
view: function() {}
690+
}
691+
var vnode = m(component, "b")
692+
693+
o(vnode.tag).equals(component)
694+
o(vnode.attrs).deepEquals({})
695+
o(vnode.children.length).equals(1)
696+
o(vnode.children[0]).equals("b")
697+
})
698+
o("works with constructibles (without attrs)", function() {
699+
var component = o.spy()
700+
component.prototype.view = function() {}
701+
702+
var vnode = m(component, "b")
703+
704+
o(component.callCount).equals(0)
705+
706+
o(vnode.tag).equals(component)
707+
o(vnode.attrs).deepEquals({})
708+
o(vnode.children.length).equals(1)
709+
o(vnode.children[0]).equals("b")
710+
})
711+
o("works with closures (without attrs)", function () {
712+
var component = o.spy()
713+
714+
var vnode = m(component, "b")
715+
716+
o(component.callCount).equals(0)
717+
718+
o(vnode.tag).equals(component)
719+
o(vnode.attrs).deepEquals({})
720+
o(vnode.children.length).equals(1)
721+
o(vnode.children[0]).equals("b")
722+
})
667723
})
668724
})

0 commit comments

Comments
 (0)