From 1b86c51b0ce7f37c52a87d880c9f7fc1c87fd36a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=90=E9=B3=B3?= Date: Mon, 8 Sep 2014 10:19:42 +0800 Subject: [PATCH 1/6] setInnerHTML for XHTML documents When running under XML mode, normalize the incoming HTML in setInnerHTML. --- src/browser/ui/dom/setInnerHTML.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/browser/ui/dom/setInnerHTML.js b/src/browser/ui/dom/setInnerHTML.js index e7c5888aaf9..7f236afb7ae 100644 --- a/src/browser/ui/dom/setInnerHTML.js +++ b/src/browser/ui/dom/setInnerHTML.js @@ -35,6 +35,14 @@ var setInnerHTML = function(node, html) { node.innerHTML = html; }; +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); + }; +} + if (ExecutionEnvironment.canUseDOM) { // IE8: When updating a just created node with innerHTML only leading // whitespace is removed. When updating an existing node with innerHTML From 8e20b8deff7c4b336dd4e7b9fe141c602c4c4257 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=90=E9=B3=B3?= Date: Mon, 8 Sep 2014 10:25:24 +0800 Subject: [PATCH 2/6] Move the test inside canUseDOM --- src/browser/ui/dom/setInnerHTML.js | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/browser/ui/dom/setInnerHTML.js b/src/browser/ui/dom/setInnerHTML.js index 7f236afb7ae..abab059ff2c 100644 --- a/src/browser/ui/dom/setInnerHTML.js +++ b/src/browser/ui/dom/setInnerHTML.js @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0d * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -35,15 +35,14 @@ var setInnerHTML = function(node, html) { node.innerHTML = html; }; -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); - }; -} - 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); + }; + } // 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. From 9f33b6b86eef7f9a2ed31fc5036e64404ce33089 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=90=E9=B3=B3?= Date: Mon, 8 Sep 2014 10:53:59 +0800 Subject: [PATCH 3/6] Typo --- src/browser/ui/dom/setInnerHTML.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/browser/ui/dom/setInnerHTML.js b/src/browser/ui/dom/setInnerHTML.js index abab059ff2c..7a047aa685d 100644 --- a/src/browser/ui/dom/setInnerHTML.js +++ b/src/browser/ui/dom/setInnerHTML.js @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0d + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, From 1274f2fb32c9a92a910aa5ea1ebe08db6c6b060a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=90=E9=B3=B3?= Date: Mon, 8 Sep 2014 20:56:16 +0800 Subject: [PATCH 4/6] Update the tweak to work on Safari As suggested by @alexeyraspopov --- src/browser/ui/dom/setInnerHTML.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/browser/ui/dom/setInnerHTML.js b/src/browser/ui/dom/setInnerHTML.js index 7a047aa685d..7d067df7bcd 100644 --- a/src/browser/ui/dom/setInnerHTML.js +++ b/src/browser/ui/dom/setInnerHTML.js @@ -43,6 +43,14 @@ if (ExecutionEnvironment.canUseDOM) { node.innerHTML = new XMLSerializer().serializeToString(dom); }; } + 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); + }; + } // 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. From b901438041f5d98e3ead90c4a9b83ec70d2d3e94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=90=E9=B3=B3?= Date: Mon, 8 Sep 2014 20:59:38 +0800 Subject: [PATCH 5/6] Uniformly use .body As suggested by @alexeyraspopov here: https://github.com/alexeyraspopov/dom-parser/blob/master/index.js#L18 --- src/browser/ui/dom/setInnerHTML.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/browser/ui/dom/setInnerHTML.js b/src/browser/ui/dom/setInnerHTML.js index 7d067df7bcd..ef74c48c785 100644 --- a/src/browser/ui/dom/setInnerHTML.js +++ b/src/browser/ui/dom/setInnerHTML.js @@ -40,7 +40,7 @@ if (ExecutionEnvironment.canUseDOM) { // 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); + node.innerHTML = new XMLSerializer().serializeToString(dom).body; }; } else if (document.xmlVersion) { From cadc94c7d032c3fa7d59be08ef6b246283599cc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=90=E9=B3=B3?= Date: Tue, 9 Sep 2014 03:27:34 +0800 Subject: [PATCH 6/6] Remove ... around innerHTML --- src/browser/ui/dom/setInnerHTML.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/browser/ui/dom/setInnerHTML.js b/src/browser/ui/dom/setInnerHTML.js index ef74c48c785..ef246f48861 100644 --- a/src/browser/ui/dom/setInnerHTML.js +++ b/src/browser/ui/dom/setInnerHTML.js @@ -40,7 +40,7 @@ if (ExecutionEnvironment.canUseDOM) { // 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; + node.innerHTML = new XMLSerializer().serializeToString(dom.body).replace(/^]*>/, '').replace(/<\/body>$/, ''); }; } else if (document.xmlVersion) { @@ -48,7 +48,7 @@ if (ExecutionEnvironment.canUseDOM) { setInnerHTML = function(node, html) { var dom = document.implementation.createHTMLDocument(''); dom.body.innerHTML = html; - node.innerHTML = new XMLSerializer().serializeToString(dom.body); + node.innerHTML = new XMLSerializer().serializeToString(dom.body).replace(/^]*>/, '').replace(/<\/body>$/, ''); }; } // IE8: When updating a just created node with innerHTML only leading