Wed, 31 Dec 2014 13:27:57 +0100
Ignore runtime configuration files generated during quality assurance.
1 function updateDocumentSourceMaps(source) {
2 const nsIDOMNode = Components.interfaces.nsIDOMNode;
4 const nsISAXXMLReader = Components.interfaces.nsISAXXMLReader;
5 const saxReader = Components.classes["@mozilla.org/saxparser/xmlreader;1"]
6 .createInstance(nsISAXXMLReader);
7 try {
8 saxReader.setFeature("http://xml.org/sax/features/namespace-prefixes", true);
9 saxReader.setFeature("http://xml.org/sax/features/namespace", true);
10 }
11 catch (e) {
12 // do nothing, we'll accept it as it is.
13 }
14 var parseErrorLog = [];
16 /* XXX ajvincent Because throwing an exception doesn't stop parsing, we need
17 * to record errors and handle them after the parsing is finished.
18 */
19 function do_parse_check(aCondition, aMsg) {
20 if (!aCondition)
21 parseErrorLog[parseErrorLog.length] = aMsg;
22 }
24 var contentHandler = {
25 startDocument: function startDocument() {
26 },
28 endDocument: function endDocument() {
29 },
31 handleAttributes: function handleAttributes(aAttributes) {
32 for (var i = 0; i < aAttributes.length; i++) {
33 var attrNamespaceURI = aAttributes.getURI(i);
34 var attrLocalName = aAttributes.getLocalName(i);
35 var attrNodeName = aAttributes.getQName(i);
36 var value = aAttributes.getValue(i);
37 do_parse_check(attrLocalName, "Missing attribute local name");
38 do_parse_check(attrNodeName, "Missing attribute node name");
39 }
40 },
42 startElement: function startElement(aNamespaceURI, aLocalName, aNodeName, aAttributes) {
43 do_parse_check(aLocalName, "Missing element local name (startElement)");
44 do_parse_check(aNodeName, "Missing element node name (startElement)");
45 do_parse_check(aAttributes, "Missing element attributes");
46 this.handleAttributes(aAttributes);
47 },
49 endElement: function endElement(aNamespaceURI, aLocalName, aNodeName) {
50 do_parse_check(aLocalName, "Missing element local name (endElement)");
51 do_parse_check(aNodeName, "Missing element node name (endElement)");
52 },
54 inCDataSection: false,
56 characters: function characters(aData) {
57 },
59 processingInstruction: function processingInstruction(aTarget, aData) {
60 do_parse_check(aTarget, "Missing processing instruction target");
61 },
63 ignorableWhitespace: function ignorableWhitespace(aWhitespace) {
64 },
66 startPrefixMapping: function startPrefixMapping(aPrefix, aURI) {
67 },
69 endPrefixMapping: function endPrefixMapping(aPrefix) {
70 }
71 };
73 var lexicalHandler = {
74 comment: function comment(aContents) {
75 },
77 startDTD: function startDTD(aName, aPublicId, aSystemId) {
78 do_parse_check(aName, "Missing DTD name");
79 },
81 endDTD: function endDTD() {
82 },
84 startCDATA: function startCDATA() {
85 },
87 endCDATA: function endCDATA() {
88 },
90 startEntity: function startEntity(aName) {
91 do_parse_check(aName, "Missing entity name (startEntity)");
92 },
94 endEntity: function endEntity(aName) {
95 do_parse_check(aName, "Missing entity name (endEntity)");
96 }
97 };
99 var dtdHandler = {
100 notationDecl: function notationDecl(aName, aPublicId, aSystemId) {
101 do_parse_check(aName, "Missing notation name");
102 },
104 unparsedEntityDecl:
105 function unparsedEntityDecl(aName, aPublicId, aSystemId, aNotationName) {
106 do_parse_check(aName, "Missing entity name (unparsedEntityDecl)");
107 }
108 };
110 var errorHandler = {
111 error: function error(aLocator, aError) {
112 do_parse_check(!aError, "XML error");
113 },
115 fatalError: function fatalError(aLocator, aError) {
116 do_parse_check(!aError, "XML fatal error");
117 },
119 ignorableWarning: function ignorableWarning(aLocator, aError) {
120 do_parse_check(!aError, "XML ignorable warning");
121 }
122 };
124 saxReader.contentHandler = contentHandler;
125 saxReader.lexicalHandler = lexicalHandler;
126 saxReader.dtdHandler = dtdHandler;
127 saxReader.errorHandler = errorHandler;
129 saxReader.parseFromString(source, "application/xml");
131 // Just in case it leaks.
132 saxReader.contentHandler = null;
133 saxReader.lexicalHandler = null;
134 saxReader.dtdHandler = null;
135 saxReader.errorHandler = null;
137 return parseErrorLog;
138 }
140 function do_check_true_with_dump(aCondition, aParseLog) {
141 if (!aCondition) {
142 dump(aParseLog.join("\n"));
143 }
144 do_check_true(aCondition);
145 }
147 function run_test() {
148 var src;
149 src = "<!DOCTYPE foo>\n<!-- all your foo are belong to bar -->";
150 src += "<foo id='foo'>\n<?foo wooly bully?>\nfoo";
151 src += "<![CDATA[foo fighters]]></foo>\n";
152 var parseErrorLog = updateDocumentSourceMaps(src);
154 if (parseErrorLog.length > 0) {
155 dump(parseErrorLog.join("\n"));
156 }
157 do_check_true_with_dump(parseErrorLog.length == 0, parseErrorLog);
159 // End tag isn't well-formed.
160 src = "<!DOCTYPE foo>\n<!-- all your foo are belong to bar -->";
161 src += "<foo id='foo'>\n<?foo wooly bully?>\nfoo";
162 src += "<![CDATA[foo fighters]]></foo\n";
164 parseErrorLog = updateDocumentSourceMaps(src);
166 do_check_true_with_dump(parseErrorLog.length == 1 && parseErrorLog[0] == "XML fatal error", parseErrorLog);
167 }