diff options
Diffstat (limited to 'src/components/script/dom/htmlserializer.rs')
-rw-r--r-- | src/components/script/dom/htmlserializer.rs | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/src/components/script/dom/htmlserializer.rs b/src/components/script/dom/htmlserializer.rs index ebda79fe416..817f84f91a6 100644 --- a/src/components/script/dom/htmlserializer.rs +++ b/src/components/script/dom/htmlserializer.rs @@ -81,10 +81,10 @@ fn serialize_text(text: &JSRef<Text>, html: &mut StrBuf) { "noembed" | "noframes" | "plaintext" | "noscript" if elem.deref().namespace == namespace::HTML => html.push_str(text.deref().characterdata.data), - _ => html.push_str(escape(text.deref().characterdata.data, false)) + _ => escape(text.deref().characterdata.data, false, html) } } - _ => html.push_str(escape(text.deref().characterdata.data, false)) + _ => escape(text.deref().characterdata.data, false, html) } } @@ -151,18 +151,19 @@ fn serialize_attr(attr: &JSRef<Attr>, html: &mut StrBuf) { html.push_str(attr.deref().name); }; html.push_str("=\""); - html.push_str(escape(attr.deref().value, true)); + escape(attr.deref().value, true, html); html.push_char('"'); } -fn escape(string: &str, attr_mode: bool) -> ~str { - let replaced = string.replace("&", "&").replace("\xA0", " "); - match attr_mode { - true => { - replaced.replace("\"", """) - }, - false => { - replaced.replace("<", "<").replace(">", ">") +fn escape(string: &str, attr_mode: bool, html: &mut StrBuf) { + for c in string.chars() { + match c { + '&' => html.push_str("&"), + '\xA0' => html.push_str(" "), + '"' if attr_mode => html.push_str("""), + '<' if !attr_mode => html.push_str("<"), + '>' if !attr_mode => html.push_str(">"), + c => html.push_char(c), } } } |