elm / virtual-dom

The foundation of HTML and SVG in Elm.
https://package.elm-lang.org/packages/elm/virtual-dom/latest
BSD 3-Clause "New" or "Revised" License
209 stars 80 forks source link

Elm uses invalid value in `domNode.insertBefore` #161

Open malaire opened 4 years ago

malaire commented 4 years ago

This Elm bug is seen when compiling (with --debug and Elm 0.19.1) the default counter-example of Ellie locally, and then running it with IE 10. IE 10 gives error "Invalid argument" at main.js, line 3710, character 5

The error happens on domNode.insertBefore line in following code:

        case 7:
            var data = patch.s;
            var kids = data.e;
            var i = data.v;
            var theEnd = domNode.childNodes[i];
            for (; i < kids.length; i++)
            {
                domNode.insertBefore(_VirtualDom_render(kids[i], patch.u), theEnd);
            }
            return domNode;

Changing that line to following fixes this error:

                domNode.insertBefore(_VirtualDom_render(kids[i], patch.u), theEnd || null);

This confirms that Elm is using invalid value of theEnd, because only valid node or null is allowed there. So this is not a bug in IE 10, but a bug in Elm which is just seen in IE 10.

MDN documentation of insertBefore says:

referenceNode is not an optional parameter -- you must explicitly pass a Node or null. Failing to provide it or passing invalid values may behave differently in different browser versions.

malaire commented 4 years ago

Exact files used (just new project with elm init and direct copy from Ellie example). txt extension added as GitHub doesn't allow these otherwise.

elm.json.txt index.html.txt Main.elm.txt

ps. I don't have access to IE 10 for long enough to create better minimal example.

malaire commented 4 years ago

Testing with Firefox 68.2.0esr shows that just before the for-loop theEnd is undefined.

(So invalid value of theEnd is not limited to IE 10, it just doesn't cause problems e.g. in Firefox).

seanstrom commented 3 years ago

I'm also running into this issue where some implementations will prepend an element to the childNodes, or just throw an error, when given undefined as a value for the referenceNode.