OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2012 Apple Inc. All rights
reserved. | 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2012 Apple Inc. All rights
reserved. |
3 * Copyright (C) 2009, 2010 Google Inc. All rights reserved. | 3 * Copyright (C) 2009, 2010 Google Inc. All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
171 // or createContextualFragment. It does not necessarily align with | 171 // or createContextualFragment. It does not necessarily align with |
172 // which elements should be serialized w/o end tags. | 172 // which elements should be serialized w/o end tags. |
173 return toHTMLElement(node).ieForbidsInsertHTML(); | 173 return toHTMLElement(node).ieForbidsInsertHTML(); |
174 } | 174 } |
175 | 175 |
176 void MarkupFormatter::appendEndMarkup(StringBuilder& result, const Element& elem
ent) | 176 void MarkupFormatter::appendEndMarkup(StringBuilder& result, const Element& elem
ent) |
177 { | 177 { |
178 if (shouldSelfClose(element) || (!element.hasChildren() && elementCannotHave
EndTag(element))) | 178 if (shouldSelfClose(element) || (!element.hasChildren() && elementCannotHave
EndTag(element))) |
179 return; | 179 return; |
180 | 180 |
181 result.appendLiteral("</"); | 181 result.append("</"); |
182 result.append(element.tagQName().toString()); | 182 result.append(element.tagQName().toString()); |
183 result.append('>'); | 183 result.append('>'); |
184 } | 184 } |
185 | 185 |
186 void MarkupFormatter::appendAttributeValue(StringBuilder& result, const String&
attribute, bool documentIsHTML) | 186 void MarkupFormatter::appendAttributeValue(StringBuilder& result, const String&
attribute, bool documentIsHTML) |
187 { | 187 { |
188 appendCharactersReplacingEntities(result, attribute, 0, attribute.length(), | 188 appendCharactersReplacingEntities(result, attribute, 0, attribute.length(), |
189 documentIsHTML ? EntityMaskInHTMLAttributeValue : EntityMaskInAttributeV
alue); | 189 documentIsHTML ? EntityMaskInHTMLAttributeValue : EntityMaskInAttributeV
alue); |
190 } | 190 } |
191 | 191 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
227 AtomicString foundURI = namespaces.get(lookupKey); | 227 AtomicString foundURI = namespaces.get(lookupKey); |
228 if (foundURI != namespaceURI) { | 228 if (foundURI != namespaceURI) { |
229 namespaces.set(lookupKey, namespaceURI); | 229 namespaces.set(lookupKey, namespaceURI); |
230 result.append(' '); | 230 result.append(' '); |
231 result.append(xmlnsAtom.getString()); | 231 result.append(xmlnsAtom.getString()); |
232 if (!prefix.isEmpty()) { | 232 if (!prefix.isEmpty()) { |
233 result.append(':'); | 233 result.append(':'); |
234 result.append(prefix); | 234 result.append(prefix); |
235 } | 235 } |
236 | 236 |
237 result.appendLiteral("=\""); | 237 result.append("=\""); |
238 appendAttributeValue(result, namespaceURI, false); | 238 appendAttributeValue(result, namespaceURI, false); |
239 result.append('"'); | 239 result.append('"'); |
240 } | 240 } |
241 } | 241 } |
242 | 242 |
243 void MarkupFormatter::appendText(StringBuilder& result, Text& text) | 243 void MarkupFormatter::appendText(StringBuilder& result, Text& text) |
244 { | 244 { |
245 const String& str = text.data(); | 245 const String& str = text.data(); |
246 appendCharactersReplacingEntities(result, str, 0, str.length(), entityMaskFo
rText(text)); | 246 appendCharactersReplacingEntities(result, str, 0, str.length(), entityMaskFo
rText(text)); |
247 } | 247 } |
248 | 248 |
249 void MarkupFormatter::appendComment(StringBuilder& result, const String& comment
) | 249 void MarkupFormatter::appendComment(StringBuilder& result, const String& comment
) |
250 { | 250 { |
251 // FIXME: Comment content is not escaped, but XMLSerializer (and possibly ot
her callers) should raise an exception if it includes "-->". | 251 // FIXME: Comment content is not escaped, but XMLSerializer (and possibly ot
her callers) should raise an exception if it includes "-->". |
252 result.appendLiteral("<!--"); | 252 result.append("<!--"); |
253 result.append(comment); | 253 result.append(comment); |
254 result.appendLiteral("-->"); | 254 result.append("-->"); |
255 } | 255 } |
256 | 256 |
257 void MarkupFormatter::appendXMLDeclaration(StringBuilder& result, const Document
& document) | 257 void MarkupFormatter::appendXMLDeclaration(StringBuilder& result, const Document
& document) |
258 { | 258 { |
259 if (!document.hasXMLDeclaration()) | 259 if (!document.hasXMLDeclaration()) |
260 return; | 260 return; |
261 | 261 |
262 result.appendLiteral("<?xml version=\""); | 262 result.append("<?xml version=\""); |
263 result.append(document.xmlVersion()); | 263 result.append(document.xmlVersion()); |
264 const String& encoding = document.xmlEncoding(); | 264 const String& encoding = document.xmlEncoding(); |
265 if (!encoding.isEmpty()) { | 265 if (!encoding.isEmpty()) { |
266 result.appendLiteral("\" encoding=\""); | 266 result.append("\" encoding=\""); |
267 result.append(encoding); | 267 result.append(encoding); |
268 } | 268 } |
269 if (document.xmlStandaloneStatus() != Document::StandaloneUnspecified) { | 269 if (document.xmlStandaloneStatus() != Document::StandaloneUnspecified) { |
270 result.appendLiteral("\" standalone=\""); | 270 result.append("\" standalone=\""); |
271 if (document.xmlStandalone()) | 271 if (document.xmlStandalone()) |
272 result.appendLiteral("yes"); | 272 result.append("yes"); |
273 else | 273 else |
274 result.appendLiteral("no"); | 274 result.append("no"); |
275 } | 275 } |
276 | 276 |
277 result.appendLiteral("\"?>"); | 277 result.append("\"?>"); |
278 } | 278 } |
279 | 279 |
280 void MarkupFormatter::appendDocumentType(StringBuilder& result, const DocumentTy
pe& n) | 280 void MarkupFormatter::appendDocumentType(StringBuilder& result, const DocumentTy
pe& n) |
281 { | 281 { |
282 if (n.name().isEmpty()) | 282 if (n.name().isEmpty()) |
283 return; | 283 return; |
284 | 284 |
285 result.appendLiteral("<!DOCTYPE "); | 285 result.append("<!DOCTYPE "); |
286 result.append(n.name()); | 286 result.append(n.name()); |
287 if (!n.publicId().isEmpty()) { | 287 if (!n.publicId().isEmpty()) { |
288 result.appendLiteral(" PUBLIC \""); | 288 result.append(" PUBLIC \""); |
289 result.append(n.publicId()); | 289 result.append(n.publicId()); |
290 result.append('"'); | 290 result.append('"'); |
291 if (!n.systemId().isEmpty()) { | 291 if (!n.systemId().isEmpty()) { |
292 result.appendLiteral(" \""); | 292 result.append(" \""); |
293 result.append(n.systemId()); | 293 result.append(n.systemId()); |
294 result.append('"'); | 294 result.append('"'); |
295 } | 295 } |
296 } else if (!n.systemId().isEmpty()) { | 296 } else if (!n.systemId().isEmpty()) { |
297 result.appendLiteral(" SYSTEM \""); | 297 result.append(" SYSTEM \""); |
298 result.append(n.systemId()); | 298 result.append(n.systemId()); |
299 result.append('"'); | 299 result.append('"'); |
300 } | 300 } |
301 result.append('>'); | 301 result.append('>'); |
302 } | 302 } |
303 | 303 |
304 void MarkupFormatter::appendProcessingInstruction(StringBuilder& result, const S
tring& target, const String& data) | 304 void MarkupFormatter::appendProcessingInstruction(StringBuilder& result, const S
tring& target, const String& data) |
305 { | 305 { |
306 // FIXME: PI data is not escaped, but XMLSerializer (and possibly other call
ers) this should raise an exception if it includes "?>". | 306 // FIXME: PI data is not escaped, but XMLSerializer (and possibly other call
ers) this should raise an exception if it includes "?>". |
307 result.appendLiteral("<?"); | 307 result.append("<?"); |
308 result.append(target); | 308 result.append(target); |
309 result.append(' '); | 309 result.append(' '); |
310 result.append(data); | 310 result.append(data); |
311 result.appendLiteral("?>"); | 311 result.append("?>"); |
312 } | 312 } |
313 | 313 |
314 void MarkupFormatter::appendOpenTag(StringBuilder& result, const Element& elemen
t, Namespaces* namespaces) | 314 void MarkupFormatter::appendOpenTag(StringBuilder& result, const Element& elemen
t, Namespaces* namespaces) |
315 { | 315 { |
316 result.append('<'); | 316 result.append('<'); |
317 result.append(element.tagQName().toString()); | 317 result.append(element.tagQName().toString()); |
318 if (!serializeAsHTMLDocument(element) && namespaces && shouldAddNamespaceEle
ment(element, *namespaces)) | 318 if (!serializeAsHTMLDocument(element) && namespaces && shouldAddNamespaceEle
ment(element, *namespaces)) |
319 appendNamespace(result, element.prefix(), element.namespaceURI(), *names
paces); | 319 appendNamespace(result, element.prefix(), element.namespaceURI(), *names
paces); |
320 } | 320 } |
321 | 321 |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
390 } else { | 390 } else { |
391 result.append('"'); | 391 result.append('"'); |
392 appendAttributeValue(result, attribute.value(), documentIsHTML); | 392 appendAttributeValue(result, attribute.value(), documentIsHTML); |
393 result.append('"'); | 393 result.append('"'); |
394 } | 394 } |
395 } | 395 } |
396 | 396 |
397 void MarkupFormatter::appendCDATASection(StringBuilder& result, const String& se
ction) | 397 void MarkupFormatter::appendCDATASection(StringBuilder& result, const String& se
ction) |
398 { | 398 { |
399 // FIXME: CDATA content is not escaped, but XMLSerializer (and possibly othe
r callers) should raise an exception if it includes "]]>". | 399 // FIXME: CDATA content is not escaped, but XMLSerializer (and possibly othe
r callers) should raise an exception if it includes "]]>". |
400 result.appendLiteral("<![CDATA["); | 400 result.append("<![CDATA["); |
401 result.append(section); | 401 result.append(section); |
402 result.appendLiteral("]]>"); | 402 result.append("]]>"); |
403 } | 403 } |
404 | 404 |
405 bool MarkupFormatter::shouldAddNamespaceElement(const Element& element, Namespac
es& namespaces) const | 405 bool MarkupFormatter::shouldAddNamespaceElement(const Element& element, Namespac
es& namespaces) const |
406 { | 406 { |
407 // Don't add namespace attribute if it is already defined for this elem. | 407 // Don't add namespace attribute if it is already defined for this elem. |
408 const AtomicString& prefix = element.prefix(); | 408 const AtomicString& prefix = element.prefix(); |
409 if (prefix.isEmpty()) { | 409 if (prefix.isEmpty()) { |
410 if (element.hasAttribute(xmlnsAtom)) { | 410 if (element.hasAttribute(xmlnsAtom)) { |
411 namespaces.set(emptyAtom, element.namespaceURI()); | 411 namespaces.set(emptyAtom, element.namespaceURI()); |
412 return false; | 412 return false; |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
465 } | 465 } |
466 | 466 |
467 bool MarkupFormatter::serializeAsHTMLDocument(const Node& node) const | 467 bool MarkupFormatter::serializeAsHTMLDocument(const Node& node) const |
468 { | 468 { |
469 if (m_serializationType == SerializationType::ForcedXML) | 469 if (m_serializationType == SerializationType::ForcedXML) |
470 return false; | 470 return false; |
471 return node.document().isHTMLDocument(); | 471 return node.document().isHTMLDocument(); |
472 } | 472 } |
473 | 473 |
474 } // namespace blink | 474 } // namespace blink |
OLD | NEW |