Unbreak m.trust (#2516)
* Actually return the check from `maybeSetContentEditable` Lots of code paths relied on it being a boolean. When I created the abstraction, I apparently forgot to make sure it returned the result. * Don't forget to copy instance state over * Update changelog [skip ci] * Fix changelog issue [skip ci]
This commit is contained in:
parent
bcf427a3be
commit
30ad45caa1
5 changed files with 84 additions and 3 deletions
|
|
@ -17,7 +17,8 @@
|
||||||
|
|
||||||
### Upcoming...
|
### Upcoming...
|
||||||
|
|
||||||
- Fix `ospec require` with relative paths
|
- Fix double-rendering of trusted content within `contenteditable` elements ([#2516](https://github.com/MithrilJS/mithril.js/pull/2516) [@isiahmeadows](https://github.com/isiahmeadows))
|
||||||
|
- Fix error on `m.trust` updating ([#2516](https://github.com/MithrilJS/mithril.js/pull/2516) [@isiahmeadows](https://github.com/isiahmeadows))
|
||||||
|
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@
|
||||||
- [1.3 and earlier](#13-and-earlier)
|
- [1.3 and earlier](#13-and-earlier)
|
||||||
|
|
||||||
### Upcoming...
|
### Upcoming...
|
||||||
|
- Fix `require` with relative paths
|
||||||
|
|
||||||
### 4.0.0
|
### 4.0.0
|
||||||
- Pull ESM support out
|
- Pull ESM support out
|
||||||
|
|
|
||||||
|
|
@ -434,7 +434,11 @@ module.exports = function($window) {
|
||||||
removeHTML(parent, old)
|
removeHTML(parent, old)
|
||||||
createHTML(parent, vnode, ns, nextSibling)
|
createHTML(parent, vnode, ns, nextSibling)
|
||||||
}
|
}
|
||||||
else vnode.dom = old.dom, vnode.domSize = old.domSize
|
else {
|
||||||
|
vnode.dom = old.dom
|
||||||
|
vnode.domSize = old.domSize
|
||||||
|
vnode.instance = old.instance
|
||||||
|
}
|
||||||
}
|
}
|
||||||
function updateFragment(parent, old, vnode, hooks, nextSibling, ns) {
|
function updateFragment(parent, old, vnode, hooks, nextSibling, ns) {
|
||||||
updateNodes(parent, old.children, vnode.children, hooks, nextSibling, ns)
|
updateNodes(parent, old.children, vnode.children, hooks, nextSibling, ns)
|
||||||
|
|
@ -608,13 +612,14 @@ module.exports = function($window) {
|
||||||
if (vnode.attrs == null || (
|
if (vnode.attrs == null || (
|
||||||
vnode.attrs.contenteditable == null && // attribute
|
vnode.attrs.contenteditable == null && // attribute
|
||||||
vnode.attrs.contentEditable == null // property
|
vnode.attrs.contentEditable == null // property
|
||||||
)) return
|
)) return false
|
||||||
var children = vnode.children
|
var children = vnode.children
|
||||||
if (children != null && children.length === 1 && children[0].tag === "<") {
|
if (children != null && children.length === 1 && children[0].tag === "<") {
|
||||||
var content = children[0].children
|
var content = children[0].children
|
||||||
if (vnode.dom.innerHTML !== content) vnode.dom.innerHTML = content
|
if (vnode.dom.innerHTML !== content) vnode.dom.innerHTML = content
|
||||||
}
|
}
|
||||||
else if (vnode.text != null || children != null && children.length !== 0) throw new Error("Child node of a contenteditable must be trusted")
|
else if (vnode.text != null || children != null && children.length !== 0) throw new Error("Child node of a contenteditable must be trusted")
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
//remove
|
//remove
|
||||||
|
|
|
||||||
|
|
@ -81,4 +81,14 @@ o.spec("createHTML", function() {
|
||||||
o(vnode.dom.nextSibling.nodeName).equals("text")
|
o(vnode.dom.nextSibling.nodeName).equals("text")
|
||||||
o(vnode.dom.nextSibling.namespaceURI).equals("http://www.w3.org/2000/svg")
|
o(vnode.dom.nextSibling.namespaceURI).equals("http://www.w3.org/2000/svg")
|
||||||
})
|
})
|
||||||
|
o("creates the dom correctly with a contenteditable parent", function() {
|
||||||
|
var div = {tag: "div", attrs: {contenteditable: true}, children: [{tag: "<", children: "<a></a>"}]}
|
||||||
|
|
||||||
|
render(root, div)
|
||||||
|
var tags = []
|
||||||
|
for (var i = 0; i < div.dom.childNodes.length; i++) {
|
||||||
|
tags.push(div.dom.childNodes[i].nodeName)
|
||||||
|
}
|
||||||
|
o(tags).deepEquals(["A"])
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -47,4 +47,68 @@ o.spec("updateHTML", function() {
|
||||||
o(updated.domSize).equals(0)
|
o(updated.domSize).equals(0)
|
||||||
o(root.childNodes.length).equals(0)
|
o(root.childNodes.length).equals(0)
|
||||||
})
|
})
|
||||||
|
function childKeysOf(elem, key) {
|
||||||
|
var keys = key.split(".")
|
||||||
|
var result = []
|
||||||
|
for (var i = 0; i < elem.childNodes.length; i++) {
|
||||||
|
var child = elem.childNodes[i]
|
||||||
|
for (var j = 0; j < keys.length; j++) child = child[keys[j]]
|
||||||
|
result.push(child)
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
o("updates the dom correctly with a contenteditable parent", function() {
|
||||||
|
var div = {tag: "div", attrs: {contenteditable: true}, children: [{tag: "<", children: "<a></a>"}]}
|
||||||
|
|
||||||
|
render(root, div)
|
||||||
|
o(childKeysOf(div.dom, "nodeName")).deepEquals(["A"])
|
||||||
|
})
|
||||||
|
o("updates dom with multiple text children", function() {
|
||||||
|
var vnode = [{tag: "#", children: "a"}, {tag: "<", children: "<a></a>"}, {tag: "<", children: "<b></b>"}]
|
||||||
|
var replacement = [{tag: "#", children: "a"}, {tag: "<", children: "<c></c>"}, {tag: "<", children: "<d></d>"}]
|
||||||
|
|
||||||
|
render(root, vnode)
|
||||||
|
render(root, replacement)
|
||||||
|
|
||||||
|
o(childKeysOf(root, "nodeName")).deepEquals(["#text", "C", "D"])
|
||||||
|
})
|
||||||
|
o("updates dom with multiple text children in other parents", function() {
|
||||||
|
var vnode = [
|
||||||
|
{tag: "div", attrs: {}, children: [{tag: "#", children: "a"}, {tag: "<", children: "<a></a>"}]},
|
||||||
|
{tag: "div", attrs: {}, children: [{tag: "#", children: "b"}, {tag: "<", children: "<b></b>"}]},
|
||||||
|
]
|
||||||
|
var replacement = [
|
||||||
|
{tag: "div", attrs: {}, children: [{tag: "#", children: "c"}, {tag: "<", children: "<c></c>"}]},
|
||||||
|
{tag: "div", attrs: {}, children: [{tag: "#", children: "d"}, {tag: "<", children: "<d></d>"}]},
|
||||||
|
]
|
||||||
|
|
||||||
|
render(root, vnode)
|
||||||
|
render(root, replacement)
|
||||||
|
|
||||||
|
o(childKeysOf(root, "nodeName")).deepEquals(["DIV", "DIV"])
|
||||||
|
o(childKeysOf(root.childNodes[0], "nodeName")).deepEquals(["#text", "C"])
|
||||||
|
o(root.childNodes[0].firstChild.nodeValue).equals("c")
|
||||||
|
o(childKeysOf(root.childNodes[1], "nodeName")).deepEquals(["#text", "D"])
|
||||||
|
o(root.childNodes[1].firstChild.nodeValue).equals("d")
|
||||||
|
})
|
||||||
|
o("correctly diffs if followed by another trusted vnode", function() {
|
||||||
|
render(root, [
|
||||||
|
{tag: "<", children: "<span>A</span>"},
|
||||||
|
{tag: "<", children: "<span>A</span>"},
|
||||||
|
])
|
||||||
|
o(childKeysOf(root, "nodeName")).deepEquals(["SPAN", "SPAN"])
|
||||||
|
o(childKeysOf(root, "firstChild.nodeValue")).deepEquals(["A", "A"])
|
||||||
|
render(root, [
|
||||||
|
{tag: "<", children: "<span>B</span>"},
|
||||||
|
{tag: "<", children: "<span>A</span>"},
|
||||||
|
])
|
||||||
|
o(childKeysOf(root, "nodeName")).deepEquals(["SPAN", "SPAN"])
|
||||||
|
o(childKeysOf(root, "firstChild.nodeValue")).deepEquals(["B", "A"])
|
||||||
|
render(root, [
|
||||||
|
{tag: "<", children: "<span>B</span>"},
|
||||||
|
{tag: "<", children: "<span>B</span>"},
|
||||||
|
])
|
||||||
|
o(childKeysOf(root, "nodeName")).deepEquals(["SPAN", "SPAN"])
|
||||||
|
o(childKeysOf(root, "firstChild.nodeValue")).deepEquals(["B", "B"])
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue