marko 5.32.10 → 5.32.11

Sign up to get free protection for your applications and to get access to all the features.
@@ -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 convertAttrValue(type, value) {
43
+ function normalizeValue(value) {
31
44
  if (value === true) {
32
45
  return "";
33
- } else if (type == "object") {
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
- return JSON.stringify(value);
44
- case RegExp.prototype.toString:
45
- return value.source;
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
- setAttribute(el, NS_XLINK, ATTR_HREF, attrValue);
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 = el.value = this.e_;
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
- var proto = VElementClone.prototype = VElement.prototype;
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.cd_ = virtualizeElement;
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
- if (oldAttrs === attrs) {
334
- // For constant attributes the same object will be provided
335
- // every render and we can use that to our advantage to
336
- // not waste time diffing a constant, immutable attribute
337
- // map.
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
- // In some cases we only want to set an attribute value for the first
360
- // render or we don't want certain attributes to be touched. To support
361
- // that use case we delete out all of the preserved attributes
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
- attrValue = attrs[attrName];
372
- namespaceURI = null;
373
-
374
- if (attrName === ATTR_XLINK_HREF) {
375
- namespaceURI = NS_XLINK;
376
- attrName = ATTR_HREF;
377
- }
378
-
379
- if (attrValue == null || attrValue === false) {
380
- removeAttribute(fromEl, namespaceURI, attrName);
381
- } else if (oldAttrs[attrName] !== attrValue) {
382
- var type = typeof attrValue;
383
-
384
- if (type !== "string") {
385
- attrValue = convertAttrValue(type, attrValue);
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 (attrName === ATTR_XLINK_HREF) {
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.cf_ = finalChildCount;
7
- this.cg_ = 0;
6
+ this.ce_ = finalChildCount;
7
+ this.cf_ = 0;
8
8
  this.bW_ = null;
9
- this.ch_ = null;
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.ci_;
24
+ return nestedFirstChild || firstChild.ch_;
25
25
  }
26
26
 
27
27
  return firstChild;
28
28
  },
29
29
 
30
- get ci_() {
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.ci_;
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.ci_;
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.cg_++;
49
+ this.cf_++;
50
50
 
51
51
  if (this.bY_ === "textarea") {
52
- if (child.cj_) {
53
- var childValue = child.ck_;
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.ch_;
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.ch_ = child;
69
+ this.cg_ = child;
72
70
  }
73
71
 
74
72
  return child;
75
73
  },
76
74
 
77
75
  ca_: function finishChild() {
78
- if (this.cg_ === this.cf_ && this.bT_) {
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.ck_ = value;
6
+ this.cj_ = value;
7
7
  }
8
8
 
9
9
  VText.prototype = {
10
- cj_: true,
10
+ ci_: true,
11
11
 
12
12
  bS_: 3,
13
13
 
14
14
  bP_: function (host) {
15
- return (host.ownerDocument || host).createTextNode(this.ck_);
15
+ return (host.ownerDocument || host).createTextNode(this.cj_);
16
16
  },
17
17
 
18
18
  bJ_: function () {
19
- return new VText(this.ck_);
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.cm_ = true;
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.cm_) {
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.cn_ = function (nextNode) {
84
- fragment.cn_ = null;
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.co_ = beginFragmentNode;
95
+ exports.cm_ = beginFragmentNode;
@@ -37,6 +37,6 @@ function removeChild(node) {
37
37
 
38
38
  exports.bc_ = insertBefore;
39
39
  exports.bd_ = insertAfter;
40
- exports.ci_ = nextSibling;
40
+ exports.ch_ = nextSibling;
41
41
  exports.ay_ = firstChild;
42
42
  exports.be_ = removeChild;
@@ -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 specialElHandlers = require("./specialElHandlers");
15
- var virtualizeElement = VElement.cd_;
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.ci_;
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.co_;
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.ci_;
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.ck_.length
600
+ curToNodeChild.cj_.length
602
601
  );
603
602
  }
604
- if (curFromNodeChild.nodeValue !== curToNodeChild.ck_) {
605
- curFromNodeChild.nodeValue = curToNodeChild.ck_;
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.cn_) {
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.cn_(curFromNodeChild);
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 !== "textarea") {
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.cd_(node, virtualizeChildNodes, ownerComponent);
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.cd_ = virtualize;
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.10",
3
+ "version": "5.32.11",
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.15",
68
+ "@marko/translator-default": "^5.31.16",
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 convertAttrValue(type, value) {
43
+ function normalizeValue(value) {
31
44
  if (value === true) {
32
45
  return "";
33
- } else if (type == "object") {
34
- switch (value.toString) {
35
- case Object.prototype.toString:
36
- case Array.prototype.toString:
37
- // eslint-disable-next-line no-constant-condition
38
- if ("MARKO_DEBUG") {
39
- complain(
40
- "Relying on JSON.stringify for attribute values is deprecated, in future versions of Marko these will be cast to strings instead.",
41
- );
42
- }
43
- return JSON.stringify(value);
44
- case RegExp.prototype.toString:
45
- return value.source;
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
- setAttribute(el, NS_XLINK, ATTR_HREF, attrValue);
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 = el.value = this.___value;
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
- var proto = (VElementClone.prototype = VElement.prototype);
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
- if (oldAttrs === attrs) {
334
- // For constant attributes the same object will be provided
335
- // every render and we can use that to our advantage to
336
- // not waste time diffing a constant, immutable attribute
337
- // map.
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
- // In some cases we only want to set an attribute value for the first
360
- // render or we don't want certain attributes to be touched. To support
361
- // that use case we delete out all of the preserved attributes
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
- attrValue = attrs[attrName];
372
- namespaceURI = null;
373
-
374
- if (attrName === ATTR_XLINK_HREF) {
375
- namespaceURI = NS_XLINK;
376
- attrName = ATTR_HREF;
377
- }
378
-
379
- if (attrValue == null || attrValue === false) {
380
- removeAttribute(fromEl, namespaceURI, attrName);
381
- } else if (oldAttrs[attrName] !== attrValue) {
382
- var type = typeof attrValue;
383
-
384
- if (type !== "string") {
385
- attrValue = convertAttrValue(type, attrValue);
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 (attrName === ATTR_XLINK_HREF) {
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 !== "textarea") {
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;