diff --git a/src/browser/ui/dom/setInnerHTML.js b/src/browser/ui/dom/setInnerHTML.js index e7c5888aaf9..ef246f48861 100644 --- a/src/browser/ui/dom/setInnerHTML.js +++ b/src/browser/ui/dom/setInnerHTML.js @@ -36,6 +36,21 @@ var setInnerHTML = function(node, html) { }; if (ExecutionEnvironment.canUseDOM) { + if (document.contentType === "application/xhtml+xml") { + // XML mode: Turn HTML into valid XML before setting innerHTML + setInnerHTML = function(node, html) { + var dom = new DOMParser().parseFromString(html, 'text/html'); + node.innerHTML = new XMLSerializer().serializeToString(dom.body).replace(/^
]*>/, '').replace(/<\/body>$/, ''); + }; + } + else if (document.xmlVersion) { + // Safari: Same thing, different API + setInnerHTML = function(node, html) { + var dom = document.implementation.createHTMLDocument(''); + dom.body.innerHTML = html; + node.innerHTML = new XMLSerializer().serializeToString(dom.body).replace(/^]*>/, '').replace(/<\/body>$/, ''); + }; + } // IE8: When updating a just created node with innerHTML only leading // whitespace is removed. When updating an existing node with innerHTML // whitespace in root TextNodes is also collapsed.