From d88b147d666eac80130f70d539072f0c892ec20d Mon Sep 17 00:00:00 2001 From: Jovi De Croock Date: Thu, 16 Jul 2026 17:57:28 +0200 Subject: [PATCH] Fix DocumentFragment missing createElementNS --- src/diff/index.js | 4 +++- test/browser/render.test.jsx | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/diff/index.js b/src/diff/index.js index 9ef5b04596..a90846088f 100644 --- a/src/diff/index.js +++ b/src/diff/index.js @@ -529,7 +529,9 @@ function diffElementNodes( return doc.createTextNode(newProps); } - dom = doc.createElementNS(namespace, nodeType, newProps.is && newProps); + dom = doc.createElementNS + ? doc.createElementNS(namespace, nodeType, newProps.is && newProps) + : doc.createElement(nodeType); // we are creating a new node, so we can assume this is a new subtree (in // case we are hydrating), this deopts the hydrate diff --git a/test/browser/render.test.jsx b/test/browser/render.test.jsx index 91e7074f8f..e77bcf367e 100644 --- a/test/browser/render.test.jsx +++ b/test/browser/render.test.jsx @@ -2093,5 +2093,24 @@ describe('render()', () => { expect(rootCreateElementSpy).not.toBeCalled(); expect(iframeCreateElementSpy).toBeCalled(); }); + + it('falls back to createElement when createElementNS is unavailable', () => { + const iframe = document.createElement('iframe'); + scratch.appendChild(iframe); + + const iframeDocument = iframe.contentDocument; + const iframeCreateElementSpy = vi.spyOn(iframeDocument, 'createElement'); + Object.defineProperty(iframeDocument, 'createElementNS', { + configurable: true, + value: undefined + }); + + const iframeBody = iframeDocument.getElementsByTagName('body')[0]; + + render(
, iframeBody); + + expect(iframeDocument.body.innerHTML).to.equal('
'); + expect(iframeCreateElementSpy).toBeCalledWith('div'); + }); }); });