Skip to content

Commit

Permalink
Fix a bug in drawing of overlapping decorations
Browse files Browse the repository at this point in the history
FIX: Fix a bug where overlapping inline decorations would get drawn
incorrectly (and even corrupt the drawing of unrelated content).

Closes ProseMirror/prosemirror#1105
  • Loading branch information
marijnh committed Nov 18, 2020
1 parent 0016027 commit c2ff9c3
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 6 deletions.
12 changes: 6 additions & 6 deletions src/viewdesc.js
Original file line number Diff line number Diff line change
Expand Up @@ -910,19 +910,19 @@ function computeOuterDeco(outerDeco, node, needsWrap) {
let top = needsWrap ? noDeco[0] : new OuterDecoLevel, result = [top]

for (let i = 0; i < outerDeco.length; i++) {
let attrs = outerDeco[i].type.attrs, cur = top
let attrs = outerDeco[i].type.attrs
if (!attrs) continue
if (attrs.nodeName)
result.push(cur = new OuterDecoLevel(attrs.nodeName))
result.push(top = new OuterDecoLevel(attrs.nodeName))

for (let name in attrs) {
let val = attrs[name]
if (val == null) continue
if (needsWrap && result.length == 1)
result.push(cur = top = new OuterDecoLevel(node.isInline ? "span" : "div"))
if (name == "class") cur.class = (cur.class ? cur.class + " " : "") + val
else if (name == "style") cur.style = (cur.style ? cur.style + ";" : "") + val
else if (name != "nodeName") cur[name] = val
result.push(top = new OuterDecoLevel(node.isInline ? "span" : "div"))
if (name == "class") top.class = (top.class ? top.class + " " : "") + val
else if (name == "style") top.style = (top.style ? top.style + ";" : "") + val
else if (name != "nodeName") top[name] = val
}
}

Expand Down
9 changes: 9 additions & 0 deletions test/test-draw-decoration.js
Original file line number Diff line number Diff line change
Expand Up @@ -462,4 +462,13 @@ describe("Decoration drawing", () => {
ist(Array.prototype.map.call(styled, n => n.textContent).join(), "bc,def,gh")
ist(styled[1].parentNode.nodeName, "STRONG")
})

it("can handle nodeName decoration overlapping with classes", () => {
let view = tempEditor({
doc: doc(p("one two three")),
plugins: [decoPlugin([Decoration.inline(2, 13, {class: "foo"}),
Decoration.inline(5, 8, {nodeName: "em"})])]
})
ist(view.dom.firstChild.innerHTML, 'o<span class="foo">ne </span><em class="foo">two</em><span class="foo"> thre</span>e')
})
})

0 comments on commit c2ff9c3

Please sign in to comment.