From 0a5e7018ae68d3addec4dcd88305db04e7690891 Mon Sep 17 00:00:00 2001 From: Leo Horie Date: Sun, 10 Aug 2014 23:04:38 -0400 Subject: [PATCH 1/3] mathml namespace --- mithril.js | 1 + 1 file changed, 1 insertion(+) diff --git a/mithril.js b/mithril.js index e6cd8721..017d7652 100644 --- a/mithril.js +++ b/mithril.js @@ -158,6 +158,7 @@ Mithril = m = new function app(window, undefined) { var node, isNew = cached.nodes.length === 0 if (data.attrs.xmlns) namespace = data.attrs.xmlns else if (data.tag === "svg") namespace = "http://www.w3.org/2000/svg" + else if (data.tag === "math") namespace = "http://www.w3.org/1998/Math/MathML" if (isNew) { node = namespace === undefined ? window.document.createElement(data.tag) : window.document.createElementNS(namespace, data.tag) cached = { From 60939592f7cc06f9b7bf120c4853bb3df70cfff8 Mon Sep 17 00:00:00 2001 From: Leo Horie Date: Sun, 10 Aug 2014 23:18:06 -0400 Subject: [PATCH 2/3] defensive code against ultra rare bug --- mithril.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mithril.js b/mithril.js index 017d7652..44530755 100644 --- a/mithril.js +++ b/mithril.js @@ -107,7 +107,7 @@ Mithril = m = new function app(window, undefined) { } if (change.action == MOVE) { - if (parentElement.childNodes[change.index] !== change.element) { + if (parentElement.childNodes[change.index] !== change.element && change.element !== null) { parentElement.insertBefore(change.element, parentElement.childNodes[change.index]) } newCached[change.index] = cached[change.from] @@ -175,7 +175,7 @@ Mithril = m = new function app(window, undefined) { setAttributes(node, data.tag, data.attrs, cached.attrs, namespace) cached.children = build(node, data.tag, undefined, undefined, data.children, cached.children, false, 0, data.attrs.contenteditable ? node : editable, namespace, configs) cached.nodes.intact = true - if (shouldReattach === true) parentElement.insertBefore(node, parentElement.childNodes[index] || null) + if (shouldReattach === true && node !== null) parentElement.insertBefore(node, parentElement.childNodes[index] || null) } //schedule configs to be called. They are called after `build` finishes running if (typeof data.attrs["config"] === "function") { From e60a9542b2e75d248e4580547382bf6cde40bc5d Mon Sep 17 00:00:00 2001 From: Leo Horie Date: Mon, 11 Aug 2014 20:54:35 -0400 Subject: [PATCH 3/3] fix ie8 empty-text-node-in-input issue --- mithril.js | 6 +++--- tests/mithril-tests.js | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/mithril.js b/mithril.js index 44530755..1dab993d 100644 --- a/mithril.js +++ b/mithril.js @@ -55,7 +55,7 @@ Mithril = m = new function app(window, undefined) { var end = offset + (dataType == "[object Array]" ? data : cached.nodes).length clear(parentCache.nodes.slice(offset, end), parentCache.slice(offset, end)) } - else clear(cached.nodes, cached) + else if (cached.nodes) clear(cached.nodes, cached) } cached = new data.constructor cached.nodes = [] @@ -164,7 +164,7 @@ Mithril = m = new function app(window, undefined) { cached = { tag: data.tag, //process children before attrs so that select.value works correctly - children: data.children !== undefined ? build(node, data.tag, undefined, undefined, data.children, cached.children, true, 0, data.attrs.contenteditable ? node : editable, namespace, configs) : undefined, + children: data.children !== undefined ? build(node, data.tag, undefined, undefined, data.children, cached.children, true, 0, data.attrs.contenteditable ? node : editable, namespace, configs) : [], attrs: setAttributes(node, data.tag, data.attrs, {}, namespace), nodes: [node] } @@ -173,7 +173,7 @@ Mithril = m = new function app(window, undefined) { else { node = cached.nodes[0] setAttributes(node, data.tag, data.attrs, cached.attrs, namespace) - cached.children = build(node, data.tag, undefined, undefined, data.children, cached.children, false, 0, data.attrs.contenteditable ? node : editable, namespace, configs) + cached.children = data.children !== undefined ? build(node, data.tag, undefined, undefined, data.children, cached.children, false, 0, data.attrs.contenteditable ? node : editable, namespace, configs) : [] cached.nodes.intact = true if (shouldReattach === true && node !== null) parentElement.insertBefore(node, parentElement.childNodes[index] || null) } diff --git a/tests/mithril-tests.js b/tests/mithril-tests.js index 7e6ebbda..64a093a0 100644 --- a/tests/mithril-tests.js +++ b/tests/mithril-tests.js @@ -685,6 +685,20 @@ function testMithril(mock) { m.render(root, m("ul", [m("li", {key: 0}), m("li", {key: 1}), m("li", {key: 2}), m("li", {key: 3}), m("li", {key: 4}), m("li", {key: 5})])) return root.childNodes[0].childNodes.map(function(n) {return n.key}).join("") == "012345" }) + test(function() { + //https://github.com/lhorie/mithril.js/issues/157 + var root = mock.document.createElement("div") + m.render(root, m("input", {value: "a"})) + m.render(root, m("input", {value: "aa"})) + return root.childNodes[0].childNodes.length == 0 + }) + test(function() { + //https://github.com/lhorie/mithril.js/issues/157 + var root = mock.document.createElement("div") + m.render(root, m("br", {class: "a"})) + m.render(root, m("br", {class: "aa"})) + return root.childNodes[0].childNodes.length == 0 + }) //end m.render //m.redraw