marko 5.32.10 → 5.32.12
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.
- package/dist/runtime/vdom/VElement.js +73 -117
- package/dist/runtime/vdom/VNode.js +13 -15
- package/dist/runtime/vdom/VText.js +4 -4
- package/dist/runtime/vdom/hot-reload.js +2 -2
- package/dist/runtime/vdom/morphdom/fragment.js +3 -3
- package/dist/runtime/vdom/morphdom/helpers.js +1 -1
- package/dist/runtime/vdom/morphdom/index.js +19 -18
- package/dist/runtime/vdom/vdom.js +2 -2
- package/package.json +2 -2
- package/src/runtime/vdom/VElement.js +76 -120
- package/src/runtime/vdom/VNode.js +0 -2
- package/src/runtime/vdom/morphdom/index.js +9 -8
- package/dist/runtime/vdom/morphdom/specialElHandlers.js +0 -106
- package/dist/runtime/vdom/preserve-attrs.js +0 -15
- package/src/runtime/vdom/morphdom/specialElHandlers.js +0 -106
- package/src/runtime/vdom/preserve-attrs.js +0 -15
|
@@ -22,28 +22,51 @@ var FLAG_SIMPLE_ATTRS = 1;
|
|
|
22
22
|
var FLAG_CUSTOM_ELEMENT = 2;
|
|
23
23
|
var FLAG_SPREAD_ATTRS = 4;
|
|
24
24
|
|
|
25
|
-
var defineProperty = Object.defineProperty;
|
|
26
|
-
|
|
27
25
|
var ATTR_HREF = "href";
|
|
28
|
-
var EMPTY_OBJECT = Object.freeze(
|
|
26
|
+
var EMPTY_OBJECT = Object.freeze(Object.create(null));
|
|
27
|
+
var specialElHandlers = {
|
|
28
|
+
option: {
|
|
29
|
+
selected: function (fromEl, value) {
|
|
30
|
+
fromEl.selected = value !== undefined;
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
input: {
|
|
34
|
+
value: function (fromEl, value) {
|
|
35
|
+
fromEl.value = value === undefined ? "" : value;
|
|
36
|
+
},
|
|
37
|
+
checked: function (fromEl, value) {
|
|
38
|
+
fromEl.checked = value !== undefined;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
};
|
|
29
42
|
|
|
30
|
-
function
|
|
43
|
+
function normalizeValue(value) {
|
|
31
44
|
if (value === true) {
|
|
32
45
|
return "";
|
|
33
|
-
}
|
|
34
|
-
switch (value.toString) {
|
|
35
|
-
case Object.prototype.toString:
|
|
36
|
-
case Array.prototype.toString:
|
|
37
|
-
// eslint-disable-next-line no-constant-condition
|
|
46
|
+
}
|
|
38
47
|
|
|
48
|
+
if (value == null || value === false) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
39
51
|
|
|
52
|
+
switch (typeof value) {
|
|
53
|
+
case "string":
|
|
54
|
+
return value;
|
|
55
|
+
case "object":
|
|
56
|
+
switch (value.toString) {
|
|
57
|
+
case Object.prototype.toString:
|
|
58
|
+
case Array.prototype.toString:
|
|
59
|
+
// eslint-disable-next-line no-constant-condition
|
|
40
60
|
|
|
41
61
|
|
|
42
62
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
return JSON.stringify(value);
|
|
66
|
+
case RegExp.prototype.toString:
|
|
67
|
+
return value.source;
|
|
68
|
+
}
|
|
69
|
+
break;
|
|
47
70
|
}
|
|
48
71
|
|
|
49
72
|
return value + "";
|
|
@@ -57,22 +80,6 @@ function assign(a, b) {
|
|
|
57
80
|
}
|
|
58
81
|
}
|
|
59
82
|
|
|
60
|
-
function setAttribute(el, namespaceURI, name, value) {
|
|
61
|
-
if (namespaceURI === null) {
|
|
62
|
-
el.setAttribute(name, value);
|
|
63
|
-
} else {
|
|
64
|
-
el.setAttributeNS(namespaceURI, name, value);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
function removeAttribute(el, namespaceURI, name) {
|
|
69
|
-
if (namespaceURI === null) {
|
|
70
|
-
el.removeAttribute(name);
|
|
71
|
-
} else {
|
|
72
|
-
el.removeAttributeNS(namespaceURI, name);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
83
|
function VElementClone(other) {
|
|
77
84
|
this.bW_ = other.bW_;
|
|
78
85
|
this.bT_ = null;
|
|
@@ -177,19 +184,11 @@ VElement.prototype = {
|
|
|
177
184
|
assign(el, attributes);
|
|
178
185
|
} else {
|
|
179
186
|
for (var attrName in attributes) {
|
|
180
|
-
var attrValue = attributes[attrName];
|
|
181
|
-
|
|
182
|
-
if (attrValue !== false && attrValue != null) {
|
|
183
|
-
var type = typeof attrValue;
|
|
184
|
-
|
|
185
|
-
if (type !== "string") {
|
|
186
|
-
// Special attributes aren't copied to the real DOM. They are only
|
|
187
|
-
// kept in the virtual attributes map
|
|
188
|
-
attrValue = convertAttrValue(type, attrValue);
|
|
189
|
-
}
|
|
187
|
+
var attrValue = normalizeValue(attributes[attrName]);
|
|
190
188
|
|
|
189
|
+
if (attrValue !== undefined) {
|
|
191
190
|
if (attrName == ATTR_XLINK_HREF) {
|
|
192
|
-
|
|
191
|
+
el.setAttributeNS(NS_XLINK, ATTR_HREF, attrValue);
|
|
193
192
|
} else {
|
|
194
193
|
el.setAttribute(attrName, attrValue);
|
|
195
194
|
}
|
|
@@ -197,7 +196,7 @@ VElement.prototype = {
|
|
|
197
196
|
}
|
|
198
197
|
|
|
199
198
|
if (tagName === "textarea") {
|
|
200
|
-
el.defaultValue =
|
|
199
|
+
el.defaultValue = this.bZ_;
|
|
201
200
|
}
|
|
202
201
|
}
|
|
203
202
|
|
|
@@ -217,39 +216,7 @@ VElement.prototype = {
|
|
|
217
216
|
|
|
218
217
|
inherit(VElement, VNode);
|
|
219
218
|
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
["checked", "selected", "disabled"].forEach(function (name) {
|
|
223
|
-
defineProperty(proto, name, {
|
|
224
|
-
get: function () {
|
|
225
|
-
var value = this.bX_[name];
|
|
226
|
-
return value !== false && value != null;
|
|
227
|
-
}
|
|
228
|
-
});
|
|
229
|
-
});
|
|
230
|
-
|
|
231
|
-
defineProperty(proto, "e_", {
|
|
232
|
-
get: function () {
|
|
233
|
-
var value = this.bZ_;
|
|
234
|
-
if (value == null) {
|
|
235
|
-
value = this.bX_.value;
|
|
236
|
-
}
|
|
237
|
-
return value != null && value !== false ?
|
|
238
|
-
value + "" :
|
|
239
|
-
this.bX_.type === "checkbox" ||
|
|
240
|
-
this.bX_.type === "radio" ?
|
|
241
|
-
"on" :
|
|
242
|
-
"";
|
|
243
|
-
}
|
|
244
|
-
});
|
|
245
|
-
|
|
246
|
-
VElement.cc_ = function (attrs) {
|
|
247
|
-
// By default this static method is a no-op, but if there are any
|
|
248
|
-
// compiled components that have "no-update" attributes then
|
|
249
|
-
// `preserve-attrs.js` will be imported and this method will be replaced
|
|
250
|
-
// with a method that actually does something
|
|
251
|
-
return attrs;
|
|
252
|
-
};
|
|
219
|
+
VElementClone.prototype = VElement.prototype;
|
|
253
220
|
|
|
254
221
|
function virtualizeElement(node, virtualizeChildNodes, ownerComponent) {
|
|
255
222
|
var attributes = node.attributes;
|
|
@@ -300,23 +267,18 @@ function virtualizeElement(node, virtualizeChildNodes, ownerComponent) {
|
|
|
300
267
|
return vdomEl;
|
|
301
268
|
}
|
|
302
269
|
|
|
303
|
-
VElement.
|
|
304
|
-
|
|
305
|
-
VElement.ce_ = function (fromEl, vFromEl, toEl) {
|
|
306
|
-
var removePreservedAttributes = VElement.cc_;
|
|
270
|
+
VElement.cc_ = virtualizeElement;
|
|
307
271
|
|
|
272
|
+
VElement.cd_ = function (fromEl, vFromEl, toEl) {
|
|
308
273
|
var fromFlags = vFromEl.t_;
|
|
309
274
|
var toFlags = toEl.t_;
|
|
310
|
-
|
|
311
|
-
vElementByDOMNode.set(fromEl, toEl);
|
|
312
|
-
|
|
313
275
|
var attrs = toEl.bX_;
|
|
314
|
-
var props = toEl._L_;
|
|
315
276
|
|
|
316
277
|
if (toFlags & FLAG_CUSTOM_ELEMENT) {
|
|
317
278
|
return assign(fromEl, attrs);
|
|
318
279
|
}
|
|
319
280
|
|
|
281
|
+
var props = toEl._L_;
|
|
320
282
|
var attrName;
|
|
321
283
|
|
|
322
284
|
// We use expando properties to associate the previous HTML
|
|
@@ -329,16 +291,12 @@ VElement.ce_ = function (fromEl, vFromEl, toEl) {
|
|
|
329
291
|
|
|
330
292
|
var oldAttrs = vFromEl.bX_;
|
|
331
293
|
|
|
332
|
-
if (oldAttrs) {
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
return;
|
|
339
|
-
} else {
|
|
340
|
-
oldAttrs = removePreservedAttributes(oldAttrs, props);
|
|
341
|
-
}
|
|
294
|
+
if (oldAttrs === attrs) {
|
|
295
|
+
// For constant attributes the same object will be provided
|
|
296
|
+
// every render and we can use that to our advantage to
|
|
297
|
+
// not waste time diffing a constant, immutable attribute
|
|
298
|
+
// map.
|
|
299
|
+
return;
|
|
342
300
|
}
|
|
343
301
|
|
|
344
302
|
var attrValue;
|
|
@@ -356,36 +314,32 @@ VElement.ce_ = function (fromEl, vFromEl, toEl) {
|
|
|
356
314
|
return;
|
|
357
315
|
}
|
|
358
316
|
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
// so it's as if they never existed.
|
|
363
|
-
attrs = removePreservedAttributes(attrs, props, true);
|
|
364
|
-
|
|
365
|
-
var namespaceURI;
|
|
317
|
+
var preserve = props && props.pa || EMPTY_OBJECT;
|
|
318
|
+
var specialAttrs = specialElHandlers[toEl.bY_] || EMPTY_OBJECT;
|
|
319
|
+
var specialAttr;
|
|
366
320
|
|
|
367
321
|
// Loop over all of the attributes in the attribute map and compare
|
|
368
322
|
// them to the value in the old map. However, if the value is
|
|
369
323
|
// null/undefined/false then we want to remove the attribute
|
|
370
324
|
for (attrName in attrs) {
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
if (
|
|
385
|
-
|
|
325
|
+
if (
|
|
326
|
+
!preserve[attrName] &&
|
|
327
|
+
normalizeValue(oldAttrs[attrName]) !== (
|
|
328
|
+
attrValue = normalizeValue(attrs[attrName])))
|
|
329
|
+
{
|
|
330
|
+
if (specialAttr = specialAttrs[attrName]) {
|
|
331
|
+
specialAttr(fromEl, attrValue);
|
|
332
|
+
} else if (attrName === ATTR_XLINK_HREF) {
|
|
333
|
+
if (attrValue === undefined) {
|
|
334
|
+
fromEl.removeAttributeNS(NS_XLINK, ATTR_HREF);
|
|
335
|
+
} else {
|
|
336
|
+
fromEl.setAttributeNS(NS_XLINK, ATTR_HREF, attrValue);
|
|
337
|
+
}
|
|
338
|
+
} else if (attrValue === undefined) {
|
|
339
|
+
fromEl.removeAttribute(attrName);
|
|
340
|
+
} else {
|
|
341
|
+
fromEl.setAttribute(attrName, attrValue);
|
|
386
342
|
}
|
|
387
|
-
|
|
388
|
-
setAttribute(fromEl, namespaceURI, attrName, attrValue);
|
|
389
343
|
}
|
|
390
344
|
}
|
|
391
345
|
|
|
@@ -402,7 +356,9 @@ VElement.ce_ = function (fromEl, vFromEl, toEl) {
|
|
|
402
356
|
if (toEl.bR_ === null || fromFlags & FLAG_SPREAD_ATTRS) {
|
|
403
357
|
for (attrName in oldAttrs) {
|
|
404
358
|
if (!(attrName in attrs)) {
|
|
405
|
-
if (
|
|
359
|
+
if (specialAttr = specialAttrs[attrName]) {
|
|
360
|
+
specialAttr(fromEl, undefined);
|
|
361
|
+
} else if (attrName === ATTR_XLINK_HREF) {
|
|
406
362
|
fromEl.removeAttributeNS(ATTR_XLINK_HREF, ATTR_HREF);
|
|
407
363
|
} else {
|
|
408
364
|
fromEl.removeAttribute(attrName);
|
|
@@ -3,10 +3,10 @@ function VNode() {}
|
|
|
3
3
|
|
|
4
4
|
VNode.prototype = {
|
|
5
5
|
bQ_: function (finalChildCount, ownerComponent) {
|
|
6
|
-
this.
|
|
7
|
-
this.
|
|
6
|
+
this.ce_ = finalChildCount;
|
|
7
|
+
this.cf_ = 0;
|
|
8
8
|
this.bW_ = null;
|
|
9
|
-
this.
|
|
9
|
+
this.cg_ = null;
|
|
10
10
|
this.bT_ = null;
|
|
11
11
|
this.bU_ = null;
|
|
12
12
|
this._J_ = ownerComponent;
|
|
@@ -21,24 +21,24 @@ VNode.prototype = {
|
|
|
21
21
|
// If the DocumentFragment node has a first child then we will return that.
|
|
22
22
|
// Otherwise, the DocumentFragment node is not *really* the first child and
|
|
23
23
|
// we need to skip to its next sibling
|
|
24
|
-
return nestedFirstChild || firstChild.
|
|
24
|
+
return nestedFirstChild || firstChild.ch_;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
return firstChild;
|
|
28
28
|
},
|
|
29
29
|
|
|
30
|
-
get
|
|
30
|
+
get ch_() {
|
|
31
31
|
var nextSibling = this.bU_;
|
|
32
32
|
|
|
33
33
|
if (nextSibling) {
|
|
34
34
|
if (nextSibling.bV_) {
|
|
35
35
|
var firstChild = nextSibling.ay_;
|
|
36
|
-
return firstChild || nextSibling.
|
|
36
|
+
return firstChild || nextSibling.ch_;
|
|
37
37
|
}
|
|
38
38
|
} else {
|
|
39
39
|
var parentNode = this.bT_;
|
|
40
40
|
if (parentNode && parentNode.bV_) {
|
|
41
|
-
return parentNode.
|
|
41
|
+
return parentNode.ch_;
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
|
|
@@ -46,19 +46,17 @@ VNode.prototype = {
|
|
|
46
46
|
},
|
|
47
47
|
|
|
48
48
|
bI_: function (child) {
|
|
49
|
-
this.
|
|
49
|
+
this.cf_++;
|
|
50
50
|
|
|
51
51
|
if (this.bY_ === "textarea") {
|
|
52
|
-
if (child.
|
|
53
|
-
var childValue = child.
|
|
52
|
+
if (child.ci_) {
|
|
53
|
+
var childValue = child.cj_;
|
|
54
54
|
this.bZ_ = (this.bZ_ || "") + childValue;
|
|
55
|
-
} else if (child.aa_ || child.a__) {
|
|
56
|
-
this.cl_ = true;
|
|
57
55
|
} else {
|
|
58
56
|
throw TypeError();
|
|
59
57
|
}
|
|
60
58
|
} else {
|
|
61
|
-
var lastChild = this.
|
|
59
|
+
var lastChild = this.cg_;
|
|
62
60
|
|
|
63
61
|
child.bT_ = this;
|
|
64
62
|
|
|
@@ -68,14 +66,14 @@ VNode.prototype = {
|
|
|
68
66
|
this.bW_ = child;
|
|
69
67
|
}
|
|
70
68
|
|
|
71
|
-
this.
|
|
69
|
+
this.cg_ = child;
|
|
72
70
|
}
|
|
73
71
|
|
|
74
72
|
return child;
|
|
75
73
|
},
|
|
76
74
|
|
|
77
75
|
ca_: function finishChild() {
|
|
78
|
-
if (this.
|
|
76
|
+
if (this.cf_ === this.ce_ && this.bT_) {
|
|
79
77
|
return this.bT_.ca_();
|
|
80
78
|
} else {
|
|
81
79
|
return this;
|
|
@@ -3,20 +3,20 @@ var VNode = require("./VNode");
|
|
|
3
3
|
|
|
4
4
|
function VText(value, ownerComponent) {
|
|
5
5
|
this.bQ_(-1 /* no children */, ownerComponent);
|
|
6
|
-
this.
|
|
6
|
+
this.cj_ = value;
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
VText.prototype = {
|
|
10
|
-
|
|
10
|
+
ci_: true,
|
|
11
11
|
|
|
12
12
|
bS_: 3,
|
|
13
13
|
|
|
14
14
|
bP_: function (host) {
|
|
15
|
-
return (host.ownerDocument || host).createTextNode(this.
|
|
15
|
+
return (host.ownerDocument || host).createTextNode(this.cj_);
|
|
16
16
|
},
|
|
17
17
|
|
|
18
18
|
bJ_: function () {
|
|
19
|
-
return new VText(this.
|
|
19
|
+
return new VText(this.cj_);
|
|
20
20
|
}
|
|
21
21
|
};
|
|
22
22
|
|
|
@@ -44,7 +44,7 @@ exports.t = runtime.t = function (typeName) {
|
|
|
44
44
|
instance.P_(input, out);
|
|
45
45
|
};
|
|
46
46
|
|
|
47
|
-
instance.
|
|
47
|
+
instance.ck_ = true;
|
|
48
48
|
instance.am_();
|
|
49
49
|
instance._t_ = false;
|
|
50
50
|
|
|
@@ -78,7 +78,7 @@ registry._C_ = function (typeName, id) {
|
|
|
78
78
|
if (instances) {
|
|
79
79
|
instances.add(instance);
|
|
80
80
|
instance.once("destroy", function () {
|
|
81
|
-
if (!instance.
|
|
81
|
+
if (!instance.ck_) {
|
|
82
82
|
instances.delete(instance);
|
|
83
83
|
}
|
|
84
84
|
});
|
|
@@ -80,8 +80,8 @@ function createFragmentNode(startNode, nextNode, parentNode) {
|
|
|
80
80
|
|
|
81
81
|
function beginFragmentNode(startNode, parentNode) {
|
|
82
82
|
var fragment = createFragmentNode(startNode, null, parentNode);
|
|
83
|
-
fragment.
|
|
84
|
-
fragment.
|
|
83
|
+
fragment.cl_ = function (nextNode) {
|
|
84
|
+
fragment.cl_ = null;
|
|
85
85
|
insertBefore(
|
|
86
86
|
fragment.endNode,
|
|
87
87
|
nextNode,
|
|
@@ -92,4 +92,4 @@ function beginFragmentNode(startNode, parentNode) {
|
|
|
92
92
|
}
|
|
93
93
|
|
|
94
94
|
exports._h_ = createFragmentNode;
|
|
95
|
-
exports.
|
|
95
|
+
exports.cm_ = beginFragmentNode;
|
|
@@ -11,9 +11,8 @@ var KeySequence = require("../../components/KeySequence");
|
|
|
11
11
|
var VElement = require("../vdom").br_;
|
|
12
12
|
var fragment = require("./fragment");
|
|
13
13
|
var helpers = require("./helpers");
|
|
14
|
-
var
|
|
15
|
-
var
|
|
16
|
-
var morphAttrs = VElement.ce_;
|
|
14
|
+
var virtualizeElement = VElement.cc_;
|
|
15
|
+
var morphAttrs = VElement.cd_;
|
|
17
16
|
var keysByDOMNode = domData._G_;
|
|
18
17
|
var componentByDOMNode = domData._l_;
|
|
19
18
|
var vElementByDOMNode = domData._H_;
|
|
@@ -21,11 +20,11 @@ var detachedByDOMNode = domData.aT_;
|
|
|
21
20
|
|
|
22
21
|
var insertBefore = helpers.bc_;
|
|
23
22
|
var insertAfter = helpers.bd_;
|
|
24
|
-
var nextSibling = helpers.
|
|
23
|
+
var nextSibling = helpers.ch_;
|
|
25
24
|
var firstChild = helpers.ay_;
|
|
26
25
|
var removeChild = helpers.be_;
|
|
27
26
|
var createFragmentNode = fragment._h_;
|
|
28
|
-
var beginFragmentNode = fragment.
|
|
27
|
+
var beginFragmentNode = fragment.cm_;
|
|
29
28
|
|
|
30
29
|
var ELEMENT_NODE = 1;
|
|
31
30
|
var TEXT_NODE = 3;
|
|
@@ -162,7 +161,7 @@ function morphdom(fromNode, toNode, host, componentsContext) {
|
|
|
162
161
|
var fromComponent;
|
|
163
162
|
|
|
164
163
|
outer: while (curToNodeChild) {
|
|
165
|
-
toNextSibling = curToNodeChild.
|
|
164
|
+
toNextSibling = curToNodeChild.ch_;
|
|
166
165
|
curToNodeType = curToNodeChild.bS_;
|
|
167
166
|
curToNodeKey = curToNodeChild.bR_;
|
|
168
167
|
|
|
@@ -598,11 +597,11 @@ function morphdom(fromNode, toNode, host, componentsContext) {
|
|
|
598
597
|
toNextSibling.bS_ === TEXT_NODE)
|
|
599
598
|
{
|
|
600
599
|
fromNextSibling = curFromNodeChild.splitText(
|
|
601
|
-
curToNodeChild.
|
|
600
|
+
curToNodeChild.cj_.length
|
|
602
601
|
);
|
|
603
602
|
}
|
|
604
|
-
if (curFromNodeChild.nodeValue !== curToNodeChild.
|
|
605
|
-
curFromNodeChild.nodeValue = curToNodeChild.
|
|
603
|
+
if (curFromNodeChild.nodeValue !== curToNodeChild.cj_) {
|
|
604
|
+
curFromNodeChild.nodeValue = curToNodeChild.cj_;
|
|
606
605
|
}
|
|
607
606
|
}
|
|
608
607
|
}
|
|
@@ -636,10 +635,10 @@ function morphdom(fromNode, toNode, host, componentsContext) {
|
|
|
636
635
|
}
|
|
637
636
|
|
|
638
637
|
// We have processed all of the "to nodes".
|
|
639
|
-
if (fromNode.
|
|
638
|
+
if (fromNode.cl_) {
|
|
640
639
|
// If we are in an unfinished fragment, we have reached the end of the nodes
|
|
641
640
|
// we were matching up and need to end the fragment
|
|
642
|
-
fromNode.
|
|
641
|
+
fromNode.cl_(curFromNodeChild);
|
|
643
642
|
} else {
|
|
644
643
|
// If curFromNodeChild is non-null then we still have some from nodes
|
|
645
644
|
// left over that need to be removed
|
|
@@ -680,8 +679,9 @@ function morphdom(fromNode, toNode, host, componentsContext) {
|
|
|
680
679
|
|
|
681
680
|
function morphEl(fromEl, vFromEl, toEl, parentComponent) {
|
|
682
681
|
var nodeName = toEl.bY_;
|
|
683
|
-
|
|
684
682
|
var constId = toEl.c__;
|
|
683
|
+
vElementByDOMNode.set(fromEl, toEl);
|
|
684
|
+
|
|
685
685
|
if (constId !== undefined && vFromEl.c__ === constId) {
|
|
686
686
|
return;
|
|
687
687
|
}
|
|
@@ -692,14 +692,15 @@ function morphdom(fromNode, toNode, host, componentsContext) {
|
|
|
692
692
|
return;
|
|
693
693
|
}
|
|
694
694
|
|
|
695
|
-
if (nodeName
|
|
695
|
+
if (nodeName === "textarea") {
|
|
696
|
+
var newValue = toEl.bZ_ || "";
|
|
697
|
+
var oldValue = vFromEl.bZ_ || "";
|
|
698
|
+
if (oldValue !== newValue) {
|
|
699
|
+
fromEl.value = newValue;
|
|
700
|
+
}
|
|
701
|
+
} else {
|
|
696
702
|
morphChildren(fromEl, toEl, parentComponent);
|
|
697
703
|
}
|
|
698
|
-
|
|
699
|
-
var specialElHandler = specialElHandlers[nodeName];
|
|
700
|
-
if (specialElHandler !== undefined) {
|
|
701
|
-
specialElHandler(fromEl, toEl);
|
|
702
|
-
}
|
|
703
704
|
} // END: morphEl(...)
|
|
704
705
|
|
|
705
706
|
// eslint-disable-next-line no-constant-condition
|
|
@@ -19,7 +19,7 @@ function virtualizeChildNodes(node, vdomParent, ownerComponent) {
|
|
|
19
19
|
function virtualize(node, ownerComponent) {
|
|
20
20
|
switch (node.nodeType) {
|
|
21
21
|
case 1:
|
|
22
|
-
return VElement.
|
|
22
|
+
return VElement.cc_(node, virtualizeChildNodes, ownerComponent);
|
|
23
23
|
case 3:
|
|
24
24
|
return new VText(node.nodeValue, ownerComponent);
|
|
25
25
|
case 11:
|
|
@@ -78,5 +78,5 @@ exports.br_ = VElement;
|
|
|
78
78
|
exports.bt_ = VText;
|
|
79
79
|
exports.bu_ = VComponent;
|
|
80
80
|
exports.bv_ = VFragment;
|
|
81
|
-
exports.
|
|
81
|
+
exports.cc_ = virtualize;
|
|
82
82
|
exports.bw_ = virtualizeHTML;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "marko",
|
|
3
|
-
"version": "5.32.
|
|
3
|
+
"version": "5.32.12",
|
|
4
4
|
"description": "UI Components + streaming, async, high performance, HTML templating for Node.js and the browser.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"front-end",
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
},
|
|
66
66
|
"dependencies": {
|
|
67
67
|
"@marko/compiler": "^5.34.7",
|
|
68
|
-
"@marko/translator-default": "^5.31.
|
|
68
|
+
"@marko/translator-default": "^5.31.17",
|
|
69
69
|
"app-module-path": "^2.2.0",
|
|
70
70
|
"argly": "^1.2.0",
|
|
71
71
|
"browser-refresh-client": "1.1.4",
|
|
@@ -22,28 +22,51 @@ var FLAG_SIMPLE_ATTRS = 1;
|
|
|
22
22
|
var FLAG_CUSTOM_ELEMENT = 2;
|
|
23
23
|
var FLAG_SPREAD_ATTRS = 4;
|
|
24
24
|
|
|
25
|
-
var defineProperty = Object.defineProperty;
|
|
26
|
-
|
|
27
25
|
var ATTR_HREF = "href";
|
|
28
|
-
var EMPTY_OBJECT = Object.freeze(
|
|
26
|
+
var EMPTY_OBJECT = Object.freeze(Object.create(null));
|
|
27
|
+
var specialElHandlers = {
|
|
28
|
+
option: {
|
|
29
|
+
selected: function (fromEl, value) {
|
|
30
|
+
fromEl.selected = value !== undefined;
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
input: {
|
|
34
|
+
value: function (fromEl, value) {
|
|
35
|
+
fromEl.value = value === undefined ? "" : value;
|
|
36
|
+
},
|
|
37
|
+
checked: function (fromEl, value) {
|
|
38
|
+
fromEl.checked = value !== undefined;
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
};
|
|
29
42
|
|
|
30
|
-
function
|
|
43
|
+
function normalizeValue(value) {
|
|
31
44
|
if (value === true) {
|
|
32
45
|
return "";
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (value == null || value === false) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
switch (typeof value) {
|
|
53
|
+
case "string":
|
|
54
|
+
return value;
|
|
55
|
+
case "object":
|
|
56
|
+
switch (value.toString) {
|
|
57
|
+
case Object.prototype.toString:
|
|
58
|
+
case Array.prototype.toString:
|
|
59
|
+
// eslint-disable-next-line no-constant-condition
|
|
60
|
+
if ("MARKO_DEBUG") {
|
|
61
|
+
complain(
|
|
62
|
+
"Relying on JSON.stringify for attribute values is deprecated, in future versions of Marko these will be cast to strings instead.",
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
return JSON.stringify(value);
|
|
66
|
+
case RegExp.prototype.toString:
|
|
67
|
+
return value.source;
|
|
68
|
+
}
|
|
69
|
+
break;
|
|
47
70
|
}
|
|
48
71
|
|
|
49
72
|
return value + "";
|
|
@@ -57,22 +80,6 @@ function assign(a, b) {
|
|
|
57
80
|
}
|
|
58
81
|
}
|
|
59
82
|
|
|
60
|
-
function setAttribute(el, namespaceURI, name, value) {
|
|
61
|
-
if (namespaceURI === null) {
|
|
62
|
-
el.setAttribute(name, value);
|
|
63
|
-
} else {
|
|
64
|
-
el.setAttributeNS(namespaceURI, name, value);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
function removeAttribute(el, namespaceURI, name) {
|
|
69
|
-
if (namespaceURI === null) {
|
|
70
|
-
el.removeAttribute(name);
|
|
71
|
-
} else {
|
|
72
|
-
el.removeAttributeNS(namespaceURI, name);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
83
|
function VElementClone(other) {
|
|
77
84
|
this.___firstChildInternal = other.___firstChildInternal;
|
|
78
85
|
this.___parentNode = null;
|
|
@@ -177,19 +184,11 @@ VElement.prototype = {
|
|
|
177
184
|
assign(el, attributes);
|
|
178
185
|
} else {
|
|
179
186
|
for (var attrName in attributes) {
|
|
180
|
-
var attrValue = attributes[attrName];
|
|
181
|
-
|
|
182
|
-
if (attrValue !== false && attrValue != null) {
|
|
183
|
-
var type = typeof attrValue;
|
|
184
|
-
|
|
185
|
-
if (type !== "string") {
|
|
186
|
-
// Special attributes aren't copied to the real DOM. They are only
|
|
187
|
-
// kept in the virtual attributes map
|
|
188
|
-
attrValue = convertAttrValue(type, attrValue);
|
|
189
|
-
}
|
|
187
|
+
var attrValue = normalizeValue(attributes[attrName]);
|
|
190
188
|
|
|
189
|
+
if (attrValue !== undefined) {
|
|
191
190
|
if (attrName == ATTR_XLINK_HREF) {
|
|
192
|
-
|
|
191
|
+
el.setAttributeNS(NS_XLINK, ATTR_HREF, attrValue);
|
|
193
192
|
} else {
|
|
194
193
|
el.setAttribute(attrName, attrValue);
|
|
195
194
|
}
|
|
@@ -197,7 +196,7 @@ VElement.prototype = {
|
|
|
197
196
|
}
|
|
198
197
|
|
|
199
198
|
if (tagName === "textarea") {
|
|
200
|
-
el.defaultValue =
|
|
199
|
+
el.defaultValue = this.___valueInternal;
|
|
201
200
|
}
|
|
202
201
|
}
|
|
203
202
|
|
|
@@ -217,39 +216,7 @@ VElement.prototype = {
|
|
|
217
216
|
|
|
218
217
|
inherit(VElement, VNode);
|
|
219
218
|
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
["checked", "selected", "disabled"].forEach(function (name) {
|
|
223
|
-
defineProperty(proto, name, {
|
|
224
|
-
get: function () {
|
|
225
|
-
var value = this.___attributes[name];
|
|
226
|
-
return value !== false && value != null;
|
|
227
|
-
},
|
|
228
|
-
});
|
|
229
|
-
});
|
|
230
|
-
|
|
231
|
-
defineProperty(proto, "___value", {
|
|
232
|
-
get: function () {
|
|
233
|
-
var value = this.___valueInternal;
|
|
234
|
-
if (value == null) {
|
|
235
|
-
value = this.___attributes.value;
|
|
236
|
-
}
|
|
237
|
-
return value != null && value !== false
|
|
238
|
-
? value + ""
|
|
239
|
-
: this.___attributes.type === "checkbox" ||
|
|
240
|
-
this.___attributes.type === "radio"
|
|
241
|
-
? "on"
|
|
242
|
-
: "";
|
|
243
|
-
},
|
|
244
|
-
});
|
|
245
|
-
|
|
246
|
-
VElement.___removePreservedAttributes = function (attrs) {
|
|
247
|
-
// By default this static method is a no-op, but if there are any
|
|
248
|
-
// compiled components that have "no-update" attributes then
|
|
249
|
-
// `preserve-attrs.js` will be imported and this method will be replaced
|
|
250
|
-
// with a method that actually does something
|
|
251
|
-
return attrs;
|
|
252
|
-
};
|
|
219
|
+
VElementClone.prototype = VElement.prototype;
|
|
253
220
|
|
|
254
221
|
function virtualizeElement(node, virtualizeChildNodes, ownerComponent) {
|
|
255
222
|
var attributes = node.attributes;
|
|
@@ -303,20 +270,15 @@ function virtualizeElement(node, virtualizeChildNodes, ownerComponent) {
|
|
|
303
270
|
VElement.___virtualize = virtualizeElement;
|
|
304
271
|
|
|
305
272
|
VElement.___morphAttrs = function (fromEl, vFromEl, toEl) {
|
|
306
|
-
var removePreservedAttributes = VElement.___removePreservedAttributes;
|
|
307
|
-
|
|
308
273
|
var fromFlags = vFromEl.___flags;
|
|
309
274
|
var toFlags = toEl.___flags;
|
|
310
|
-
|
|
311
|
-
vElementByDOMNode.set(fromEl, toEl);
|
|
312
|
-
|
|
313
275
|
var attrs = toEl.___attributes;
|
|
314
|
-
var props = toEl.___properties;
|
|
315
276
|
|
|
316
277
|
if (toFlags & FLAG_CUSTOM_ELEMENT) {
|
|
317
278
|
return assign(fromEl, attrs);
|
|
318
279
|
}
|
|
319
280
|
|
|
281
|
+
var props = toEl.___properties;
|
|
320
282
|
var attrName;
|
|
321
283
|
|
|
322
284
|
// We use expando properties to associate the previous HTML
|
|
@@ -329,16 +291,12 @@ VElement.___morphAttrs = function (fromEl, vFromEl, toEl) {
|
|
|
329
291
|
|
|
330
292
|
var oldAttrs = vFromEl.___attributes;
|
|
331
293
|
|
|
332
|
-
if (oldAttrs) {
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
return;
|
|
339
|
-
} else {
|
|
340
|
-
oldAttrs = removePreservedAttributes(oldAttrs, props);
|
|
341
|
-
}
|
|
294
|
+
if (oldAttrs === attrs) {
|
|
295
|
+
// For constant attributes the same object will be provided
|
|
296
|
+
// every render and we can use that to our advantage to
|
|
297
|
+
// not waste time diffing a constant, immutable attribute
|
|
298
|
+
// map.
|
|
299
|
+
return;
|
|
342
300
|
}
|
|
343
301
|
|
|
344
302
|
var attrValue;
|
|
@@ -356,36 +314,32 @@ VElement.___morphAttrs = function (fromEl, vFromEl, toEl) {
|
|
|
356
314
|
return;
|
|
357
315
|
}
|
|
358
316
|
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
// so it's as if they never existed.
|
|
363
|
-
attrs = removePreservedAttributes(attrs, props, true);
|
|
364
|
-
|
|
365
|
-
var namespaceURI;
|
|
317
|
+
var preserve = (props && props.pa) || EMPTY_OBJECT;
|
|
318
|
+
var specialAttrs = specialElHandlers[toEl.___nodeName] || EMPTY_OBJECT;
|
|
319
|
+
var specialAttr;
|
|
366
320
|
|
|
367
321
|
// Loop over all of the attributes in the attribute map and compare
|
|
368
322
|
// them to the value in the old map. However, if the value is
|
|
369
323
|
// null/undefined/false then we want to remove the attribute
|
|
370
324
|
for (attrName in attrs) {
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
if (
|
|
385
|
-
|
|
325
|
+
if (
|
|
326
|
+
!preserve[attrName] &&
|
|
327
|
+
normalizeValue(oldAttrs[attrName]) !==
|
|
328
|
+
(attrValue = normalizeValue(attrs[attrName]))
|
|
329
|
+
) {
|
|
330
|
+
if ((specialAttr = specialAttrs[attrName])) {
|
|
331
|
+
specialAttr(fromEl, attrValue);
|
|
332
|
+
} else if (attrName === ATTR_XLINK_HREF) {
|
|
333
|
+
if (attrValue === undefined) {
|
|
334
|
+
fromEl.removeAttributeNS(NS_XLINK, ATTR_HREF);
|
|
335
|
+
} else {
|
|
336
|
+
fromEl.setAttributeNS(NS_XLINK, ATTR_HREF, attrValue);
|
|
337
|
+
}
|
|
338
|
+
} else if (attrValue === undefined) {
|
|
339
|
+
fromEl.removeAttribute(attrName);
|
|
340
|
+
} else {
|
|
341
|
+
fromEl.setAttribute(attrName, attrValue);
|
|
386
342
|
}
|
|
387
|
-
|
|
388
|
-
setAttribute(fromEl, namespaceURI, attrName, attrValue);
|
|
389
343
|
}
|
|
390
344
|
}
|
|
391
345
|
|
|
@@ -402,7 +356,9 @@ VElement.___morphAttrs = function (fromEl, vFromEl, toEl) {
|
|
|
402
356
|
if (toEl.___key === null || fromFlags & FLAG_SPREAD_ATTRS) {
|
|
403
357
|
for (attrName in oldAttrs) {
|
|
404
358
|
if (!(attrName in attrs)) {
|
|
405
|
-
if (
|
|
359
|
+
if ((specialAttr = specialAttrs[attrName])) {
|
|
360
|
+
specialAttr(fromEl, undefined);
|
|
361
|
+
} else if (attrName === ATTR_XLINK_HREF) {
|
|
406
362
|
fromEl.removeAttributeNS(ATTR_XLINK_HREF, ATTR_HREF);
|
|
407
363
|
} else {
|
|
408
364
|
fromEl.removeAttribute(attrName);
|
|
@@ -52,8 +52,6 @@ VNode.prototype = {
|
|
|
52
52
|
if (child.___Text) {
|
|
53
53
|
var childValue = child.___nodeValue;
|
|
54
54
|
this.___valueInternal = (this.___valueInternal || "") + childValue;
|
|
55
|
-
} else if (child.___preserve || child.___preserveBody) {
|
|
56
|
-
this.___preserveTextAreaValue = true;
|
|
57
55
|
} else {
|
|
58
56
|
throw TypeError();
|
|
59
57
|
}
|
|
@@ -11,7 +11,6 @@ var KeySequence = require("../../components/KeySequence");
|
|
|
11
11
|
var VElement = require("../vdom").___VElement;
|
|
12
12
|
var fragment = require("./fragment");
|
|
13
13
|
var helpers = require("./helpers");
|
|
14
|
-
var specialElHandlers = require("./specialElHandlers");
|
|
15
14
|
var virtualizeElement = VElement.___virtualize;
|
|
16
15
|
var morphAttrs = VElement.___morphAttrs;
|
|
17
16
|
var keysByDOMNode = domData.___keyByDOMNode;
|
|
@@ -680,8 +679,9 @@ function morphdom(fromNode, toNode, host, componentsContext) {
|
|
|
680
679
|
|
|
681
680
|
function morphEl(fromEl, vFromEl, toEl, parentComponent) {
|
|
682
681
|
var nodeName = toEl.___nodeName;
|
|
683
|
-
|
|
684
682
|
var constId = toEl.___constId;
|
|
683
|
+
vElementByDOMNode.set(fromEl, toEl);
|
|
684
|
+
|
|
685
685
|
if (constId !== undefined && vFromEl.___constId === constId) {
|
|
686
686
|
return;
|
|
687
687
|
}
|
|
@@ -692,14 +692,15 @@ function morphdom(fromNode, toNode, host, componentsContext) {
|
|
|
692
692
|
return;
|
|
693
693
|
}
|
|
694
694
|
|
|
695
|
-
if (nodeName
|
|
695
|
+
if (nodeName === "textarea") {
|
|
696
|
+
var newValue = toEl.___valueInternal || "";
|
|
697
|
+
var oldValue = vFromEl.___valueInternal || "";
|
|
698
|
+
if (oldValue !== newValue) {
|
|
699
|
+
fromEl.value = newValue;
|
|
700
|
+
}
|
|
701
|
+
} else {
|
|
696
702
|
morphChildren(fromEl, toEl, parentComponent);
|
|
697
703
|
}
|
|
698
|
-
|
|
699
|
-
var specialElHandler = specialElHandlers[nodeName];
|
|
700
|
-
if (specialElHandler !== undefined) {
|
|
701
|
-
specialElHandler(fromEl, toEl);
|
|
702
|
-
}
|
|
703
704
|
} // END: morphEl(...)
|
|
704
705
|
|
|
705
706
|
// eslint-disable-next-line no-constant-condition
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
"use strict";function syncBooleanAttrProp(fromEl, toEl, name) {
|
|
2
|
-
if (fromEl[name] !== toEl[name]) {
|
|
3
|
-
fromEl[name] = toEl[name];
|
|
4
|
-
if (fromEl[name]) {
|
|
5
|
-
fromEl.setAttribute(name, "");
|
|
6
|
-
} else {
|
|
7
|
-
fromEl.removeAttribute(name, "");
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
function forEachOption(el, fn, i) {
|
|
13
|
-
var curChild = el.ay_;
|
|
14
|
-
|
|
15
|
-
while (curChild) {
|
|
16
|
-
if (curChild.bY_ === "option") {
|
|
17
|
-
fn(curChild, ++i);
|
|
18
|
-
} else {
|
|
19
|
-
i = forEachOption(curChild, fn, i);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
curChild = curChild.ci_;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
return i;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// We use a JavaScript class to benefit from fast property lookup
|
|
29
|
-
function SpecialElHandlers() {}
|
|
30
|
-
SpecialElHandlers.prototype = {
|
|
31
|
-
/**
|
|
32
|
-
* Needed for IE. Apparently IE doesn't think that "selected" is an
|
|
33
|
-
* attribute when reading over the attributes using selectEl.attributes
|
|
34
|
-
*/
|
|
35
|
-
option: function (fromEl, toEl) {
|
|
36
|
-
syncBooleanAttrProp(fromEl, toEl, "selected");
|
|
37
|
-
},
|
|
38
|
-
button: function (fromEl, toEl) {
|
|
39
|
-
syncBooleanAttrProp(fromEl, toEl, "disabled");
|
|
40
|
-
},
|
|
41
|
-
/**
|
|
42
|
-
* The "value" attribute is special for the <input> element since it sets
|
|
43
|
-
* the initial value. Changing the "value" attribute without changing the
|
|
44
|
-
* "value" property will have no effect since it is only used to the set the
|
|
45
|
-
* initial value. Similar for the "checked" attribute, and "disabled".
|
|
46
|
-
*/
|
|
47
|
-
input: function (fromEl, toEl) {
|
|
48
|
-
syncBooleanAttrProp(fromEl, toEl, "checked");
|
|
49
|
-
syncBooleanAttrProp(fromEl, toEl, "disabled");
|
|
50
|
-
|
|
51
|
-
if (fromEl.value != toEl.e_) {
|
|
52
|
-
fromEl.value = toEl.e_;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
if (fromEl.hasAttribute("value") && !toEl.cb_("value")) {
|
|
56
|
-
fromEl.removeAttribute("value");
|
|
57
|
-
}
|
|
58
|
-
},
|
|
59
|
-
|
|
60
|
-
textarea: function (fromEl, toEl) {
|
|
61
|
-
if (toEl.cl_) {
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
var newValue = toEl.e_;
|
|
66
|
-
if (fromEl.value != newValue) {
|
|
67
|
-
fromEl.value = newValue;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
var firstChild = fromEl.firstChild;
|
|
71
|
-
if (firstChild) {
|
|
72
|
-
// Needed for IE. Apparently IE sets the placeholder as the
|
|
73
|
-
// node value and vise versa. This ignores an empty update.
|
|
74
|
-
var oldValue = firstChild.nodeValue;
|
|
75
|
-
|
|
76
|
-
if (
|
|
77
|
-
oldValue == newValue ||
|
|
78
|
-
!newValue && oldValue == fromEl.placeholder)
|
|
79
|
-
{
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
firstChild.nodeValue = newValue;
|
|
84
|
-
}
|
|
85
|
-
},
|
|
86
|
-
select: function (fromEl, toEl) {
|
|
87
|
-
if (!toEl.cb_("multiple")) {
|
|
88
|
-
var selected = 0;
|
|
89
|
-
forEachOption(
|
|
90
|
-
toEl,
|
|
91
|
-
function (option, i) {
|
|
92
|
-
if (option.cb_("selected")) {
|
|
93
|
-
selected = i;
|
|
94
|
-
}
|
|
95
|
-
},
|
|
96
|
-
-1
|
|
97
|
-
);
|
|
98
|
-
|
|
99
|
-
if (fromEl.selectedIndex !== selected) {
|
|
100
|
-
fromEl.selectedIndex = selected;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
module.exports = new SpecialElHandlers();
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
"use strict";var extend = require("raptor-util/extend");
|
|
2
|
-
|
|
3
|
-
function removePreservedAttributes(attrs, props) {
|
|
4
|
-
var preservedAttrs = props && props.pa;
|
|
5
|
-
if (preservedAttrs) {
|
|
6
|
-
attrs = extend({}, attrs);
|
|
7
|
-
preservedAttrs.forEach(function (preservedAttrName) {
|
|
8
|
-
delete attrs[preservedAttrName];
|
|
9
|
-
});
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
return attrs;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
require("./VElement").cc_ = removePreservedAttributes;
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
function syncBooleanAttrProp(fromEl, toEl, name) {
|
|
2
|
-
if (fromEl[name] !== toEl[name]) {
|
|
3
|
-
fromEl[name] = toEl[name];
|
|
4
|
-
if (fromEl[name]) {
|
|
5
|
-
fromEl.setAttribute(name, "");
|
|
6
|
-
} else {
|
|
7
|
-
fromEl.removeAttribute(name, "");
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
function forEachOption(el, fn, i) {
|
|
13
|
-
var curChild = el.___firstChild;
|
|
14
|
-
|
|
15
|
-
while (curChild) {
|
|
16
|
-
if (curChild.___nodeName === "option") {
|
|
17
|
-
fn(curChild, ++i);
|
|
18
|
-
} else {
|
|
19
|
-
i = forEachOption(curChild, fn, i);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
curChild = curChild.___nextSibling;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
return i;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// We use a JavaScript class to benefit from fast property lookup
|
|
29
|
-
function SpecialElHandlers() {}
|
|
30
|
-
SpecialElHandlers.prototype = {
|
|
31
|
-
/**
|
|
32
|
-
* Needed for IE. Apparently IE doesn't think that "selected" is an
|
|
33
|
-
* attribute when reading over the attributes using selectEl.attributes
|
|
34
|
-
*/
|
|
35
|
-
option: function (fromEl, toEl) {
|
|
36
|
-
syncBooleanAttrProp(fromEl, toEl, "selected");
|
|
37
|
-
},
|
|
38
|
-
button: function (fromEl, toEl) {
|
|
39
|
-
syncBooleanAttrProp(fromEl, toEl, "disabled");
|
|
40
|
-
},
|
|
41
|
-
/**
|
|
42
|
-
* The "value" attribute is special for the <input> element since it sets
|
|
43
|
-
* the initial value. Changing the "value" attribute without changing the
|
|
44
|
-
* "value" property will have no effect since it is only used to the set the
|
|
45
|
-
* initial value. Similar for the "checked" attribute, and "disabled".
|
|
46
|
-
*/
|
|
47
|
-
input: function (fromEl, toEl) {
|
|
48
|
-
syncBooleanAttrProp(fromEl, toEl, "checked");
|
|
49
|
-
syncBooleanAttrProp(fromEl, toEl, "disabled");
|
|
50
|
-
|
|
51
|
-
if (fromEl.value != toEl.___value) {
|
|
52
|
-
fromEl.value = toEl.___value;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
if (fromEl.hasAttribute("value") && !toEl.___hasAttribute("value")) {
|
|
56
|
-
fromEl.removeAttribute("value");
|
|
57
|
-
}
|
|
58
|
-
},
|
|
59
|
-
|
|
60
|
-
textarea: function (fromEl, toEl) {
|
|
61
|
-
if (toEl.___preserveTextAreaValue) {
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
var newValue = toEl.___value;
|
|
66
|
-
if (fromEl.value != newValue) {
|
|
67
|
-
fromEl.value = newValue;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
var firstChild = fromEl.firstChild;
|
|
71
|
-
if (firstChild) {
|
|
72
|
-
// Needed for IE. Apparently IE sets the placeholder as the
|
|
73
|
-
// node value and vise versa. This ignores an empty update.
|
|
74
|
-
var oldValue = firstChild.nodeValue;
|
|
75
|
-
|
|
76
|
-
if (
|
|
77
|
-
oldValue == newValue ||
|
|
78
|
-
(!newValue && oldValue == fromEl.placeholder)
|
|
79
|
-
) {
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
firstChild.nodeValue = newValue;
|
|
84
|
-
}
|
|
85
|
-
},
|
|
86
|
-
select: function (fromEl, toEl) {
|
|
87
|
-
if (!toEl.___hasAttribute("multiple")) {
|
|
88
|
-
var selected = 0;
|
|
89
|
-
forEachOption(
|
|
90
|
-
toEl,
|
|
91
|
-
function (option, i) {
|
|
92
|
-
if (option.___hasAttribute("selected")) {
|
|
93
|
-
selected = i;
|
|
94
|
-
}
|
|
95
|
-
},
|
|
96
|
-
-1,
|
|
97
|
-
);
|
|
98
|
-
|
|
99
|
-
if (fromEl.selectedIndex !== selected) {
|
|
100
|
-
fromEl.selectedIndex = selected;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
},
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
module.exports = new SpecialElHandlers();
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
var extend = require("raptor-util/extend");
|
|
2
|
-
|
|
3
|
-
function removePreservedAttributes(attrs, props) {
|
|
4
|
-
var preservedAttrs = props && props.pa;
|
|
5
|
-
if (preservedAttrs) {
|
|
6
|
-
attrs = extend({}, attrs);
|
|
7
|
-
preservedAttrs.forEach(function (preservedAttrName) {
|
|
8
|
-
delete attrs[preservedAttrName];
|
|
9
|
-
});
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
return attrs;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
require("./VElement").___removePreservedAttributes = removePreservedAttributes;
|