From ba678d451b80d5074170406d42a374f2231e8a9e Mon Sep 17 00:00:00 2001 From: "caillon%returnzero.com" Date: Wed, 11 Sep 2002 01:36:28 +0000 Subject: [PATCH] 166947 - Copy XML (on node context menu) should encode character entities r=timeless sr=bzbarsky --- .../resources/content/viewers/dom/dom.js | 48 +++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/extensions/inspector/resources/content/viewers/dom/dom.js b/extensions/inspector/resources/content/viewers/dom/dom.js index 4898558993af..639cda106c66 100644 --- a/extensions/inspector/resources/content/viewers/dom/dom.js +++ b/extensions/inspector/resources/content/viewers/dom/dom.js @@ -44,6 +44,7 @@ //////////// global variables ///////////////////// var viewer; +var gEntityConverter; //////////// global constants //////////////////// @@ -357,7 +358,7 @@ DOMViewer.prototype = for (i = 0; i < aNode.attributes.length; ++i) { var a = aNode.attributes[i]; - var attr = " " + a.localName + "=\"" + a.nodeValue + "\""; + var attr = " " + a.localName + '="' + unicodeToEntity(a.nodeValue) + '"'; if (line.length + attr.length > 80) { s += line + (i < aNode.attributes.length-1 ? "\n"+attrIndent : ""); line = ""; @@ -376,9 +377,9 @@ DOMViewer.prototype = s += indent + "\n"; } } else if (aNode.nodeType == Node.TEXT_NODE) { - s += aNode.nodeValue; + s += unicodeToEntity(aNode.data); } else if (aNode.nodeType == Node.COMMENT_NODE) { - s += line + "\n"; + s += line + "\n"; } return s; @@ -946,3 +947,44 @@ function dumpDOM2(aNode) dump(DOMViewer.prototype.toXML(aNode)); } +function unicodeToEntity(text) +{ + if (!gEntityConverter) { + try { + gEntityConverter = Components.classes["@mozilla.org/intl/entityconverter;1"] + .createInstance(Components.interfaces.nsIEntityConverter); + } catch (ex) { } + } + var entityVersion = Components.interfaces.nsIEntityConverter.html40 | + Components.interfaces.nsIEntityConverter.mathml20; + + var str = ''; + for (var i = 0; i < text.length; ++i) { + if ((text.charCodeAt(i) > 0x7F) && gEntityConverter) { + try { + str += gEntityConverter.ConvertToEntity(text[i], entityVersion); + } catch (ex) { + str += text[i]; + } + continue; + } + switch (text[i]) { + case '<': + str += "<"; + break; + case '>': + str += ">"; + break; + case '&': + str += "&"; + break; + case '"': + str += """; + break; + default: + str += text[i]; + break; + } + } + return str; +}