codemirror / dev

Development repository for the CodeMirror editor project
https://codemirror.net/
Other
5.44k stars 343 forks source link

Multiple tooltips cause plugin crash on codemirror/view ^6.24.0 #1367

Closed valtzu closed 2 months ago

valtzu commented 2 months ago

Describe the issue

@codemirror/view version 6.24.0 breaks a scenario where you have multiple tooltips and then write some specific input. See reproduction link for the case – it is a combination of cursor & hover tooltip example.

CodeMirror plugin crashed: DOMException: Failed to execute 'insertBefore' on 'Node': The node before which the new node is to be inserted is not a child of this node.
    at ViewPlugin.fromClass.eventObservers.scroll.createTooltip (https://codemirror.net/try/mods/@codemirror-view.js:9469:29)
    at TooltipViewManager.createTooltipView (https://codemirror.net/try/mods/@codemirror-view.js:9393:81)
    at TooltipViewManager.update (https://codemirror.net/try/mods/@codemirror-view.js:9330:40)
    at ViewPlugin.fromClass.eventObservers.scroll.update (https://codemirror.net/try/mods/@codemirror-view.js:9436:36)
    at PluginInstance.update (https://codemirror.net/try/mods/@codemirror-view.js:2477:32)
    at EditorView.updatePlugins (https://codemirror.net/try/mods/@codemirror-view.js:7291:29)
    at EditorView.update (https://codemirror.net/try/mods/@codemirror-view.js:7189:22)
    at EditorView.dispatchTransactions (https://codemirror.net/try/mods/@codemirror-view.js:7093:28)
    at EditorView.dispatch (https://codemirror.net/try/mods/@codemirror-view.js:7115:14)
    at applyDOMChange (https://codemirror.net/try/mods/@codemirror-view.js:6381:18)
console.<computed> @ sandbox.js:48

Likely breaking commit: https://github.com/codemirror/view/commit/9d13d5ecb65a197031be9a50f1c7441b7ccc0941

Browser and platform

PC Chrome on Linux

Reproduction link

https://codemirror.net/try/?c=aW1wb3J0IHtTdGF0ZUZpZWxkLCBFZGl0b3JTdGF0ZX0gZnJvbSAiQGNvZGVtaXJyb3Ivc3RhdGUiCmltcG9ydCB7YmFzaWNTZXR1cH0gZnJvbSAiY29kZW1pcnJvciIKaW1wb3J0IHtqYXZhc2NyaXB0fSBmcm9tICJAY29kZW1pcnJvci9sYW5nLWphdmFzY3JpcHQiCmltcG9ydCB7c2hvd1Rvb2x0aXAsIGhvdmVyVG9vbHRpcCwgRWRpdG9yVmlld30gZnJvbSAiQGNvZGVtaXJyb3IvdmlldyIKCmNvbnN0IHdvcmRIb3ZlciA9IGhvdmVyVG9vbHRpcCgodmlldywgcG9zLCBzaWRlKSA9PiB7CiAgICBsZXQge2Zyb20sIHRvLCB0ZXh0fSA9IHZpZXcuc3RhdGUuZG9jLmxpbmVBdChwb3MpOwogICAgbGV0IHN0YXJ0ID0gcG9zLCBlbmQgPSBwb3M7CiAgICB3aGlsZSAoc3RhcnQgPiBmcm9tICYmIC9cdy8udGVzdCh0ZXh0W3N0YXJ0IC0gZnJvbSAtIDFdKSkgc3RhcnQtLTsKICAgIHdoaWxlIChlbmQgPCB0byAmJiAvXHcvLnRlc3QodGV4dFtlbmQgLSBmcm9tXSkpIGVuZCsrOwogICAgaWYgKHN0YXJ0ID09IHBvcyAmJiBzaWRlIDwgMCB8fCBlbmQgPT0gcG9zICYmIHNpZGUgPiAwKQogICAgICByZXR1cm4gbnVsbAogICAgcmV0dXJuIHsKICAgICAgcG9zOiBzdGFydCwKICAgICAgZW5kLAogICAgICBhYm92ZTogZmFsc2UsCiAgICAgIGNyZWF0ZSh2aWV3KSB7CiAgICAgICAgbGV0IGRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgIGRvbS50ZXh0Q29udGVudCA9IHRleHQuc2xpY2Uoc3RhcnQgLSBmcm9tLCBlbmQgLSBmcm9tKTsKICAgICAgICByZXR1cm4ge2RvbX0KICAgICAgfQogICAgfQogIH0pOwoKY29uc3QgY3Vyc29yVG9vbHRpcEJhc2VUaGVtZSA9IEVkaXRvclZpZXcuYmFzZVRoZW1lKHsKICAiLmNtLXRvb2x0aXAuY20tdG9vbHRpcC1jdXJzb3IiOiB7CiAgICBiYWNrZ3JvdW5kQ29sb3I6ICIjNjZiIiwKICAgIGNvbG9yOiAid2hpdGUiLAogICAgYm9yZGVyOiAibm9uZSIsCiAgICBwYWRkaW5nOiAiMnB4IDdweCIsCiAgICBib3JkZXJSYWRpdXM6ICI0cHgiLAogICAgIiYgLmNtLXRvb2x0aXAtYXJyb3c6YmVmb3JlIjogewogICAgICBib3JkZXJUb3BDb2xvcjogIiM2NmIiCiAgICB9LAogICAgIiYgLmNtLXRvb2x0aXAtYXJyb3c6YWZ0ZXIiOiB7CiAgICAgIGJvcmRlclRvcENvbG9yOiAidHJhbnNwYXJlbnQiCiAgICB9CiAgfQp9KQoKY29uc3QgY3Vyc29yVG9vbHRpcEZpZWxkID0gU3RhdGVGaWVsZC5kZWZpbmUoewogIGNyZWF0ZTogZ2V0Q3Vyc29yVG9vbHRpcHMsCgogIHVwZGF0ZSh0b29sdGlwcywgdHIpIHsKICAgIGlmICghdHIuZG9jQ2hhbmdlZCAmJiAhdHIuc2VsZWN0aW9uKSByZXR1cm4gdG9vbHRpcHMKICAgIHJldHVybiBnZXRDdXJzb3JUb29sdGlwcyh0ci5zdGF0ZSkKICB9LAoKICBwcm92aWRlOiBmID0+IHNob3dUb29sdGlwLmNvbXB1dGVOKFtmXSwgc3RhdGUgPT4gc3RhdGUuZmllbGQoZikpCn0pCgpmdW5jdGlvbiBnZXRDdXJzb3JUb29sdGlwcyhzdGF0ZSkgewogIHJldHVybiBzdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzCiAgICAuZmlsdGVyKHJhbmdlID0+IHJhbmdlLmVtcHR5ICYmIHJhbmdlLmZyb20gJSAyKQogICAgLm1hcChyYW5nZSA9PiB7CiAgICAgIGxldCBsaW5lID0gc3RhdGUuZG9jLmxpbmVBdChyYW5nZS5oZWFkKQogICAgICBsZXQgdGV4dCA9IGxpbmUubnVtYmVyICsgIjoiICsgKHJhbmdlLmhlYWQgLSBsaW5lLmZyb20pCiAgICAgIHJldHVybiB7CiAgICAgICAgcG9zOiByYW5nZS5oZWFkLAogICAgICAgIGFib3ZlOiBmYWxzZSwKICAgICAgICBzdHJpY3RTaWRlOiB0cnVlLAogICAgICAgIGFycm93OiB0cnVlLAogICAgICAgIGNyZWF0ZTogKCkgPT4gewogICAgICAgICAgbGV0IGRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgICBkb20uY2xhc3NOYW1lID0gImNtLXRvb2x0aXAtY3Vyc29yIgogICAgICAgICAgZG9tLnRleHRDb250ZW50ID0gdGV4dAogICAgICAgICAgcmV0dXJuIHtkb219CiAgICAgICAgfQogICAgICB9CiAgICB9KQp9CgpuZXcgRWRpdG9yVmlldyh7CiAgZG9jOiAiY29uc29sZS5sb2coJ2hlbGxvJylcbi8vXi0tIGFkZCB0ciBhcyAybmQgcGFyYW1ldGVyIChub24tcXVvdGVkIHdpdGggc3BhY2UgYWZ0ZXIgY29tbWEpIiwKICBleHRlbnNpb25zOiBbYmFzaWNTZXR1cCwgamF2YXNjcmlwdCgpLCBjdXJzb3JUb29sdGlwRmllbGQsIHdvcmRIb3Zlcl0sCiAgcGFyZW50OiBkb2N1bWVudC5ib2R5Cn0pCgoK

marijnh commented 2 months ago

Attached patch should fix this.

valtzu commented 2 months ago

Thanks! Amazing response time :smile: :100:

I confirm it's working with 6.26.3.