10000 Store xml namespace attributes for later serialization (#586) · servo/html5ever@1d8748b · GitHub
[go: up one dir, main page]

Skip to content

Commit 1d8748b

Browse files
devongovettjdm
andauthored
Store xml namespace attributes for later serialization (#586)
* Store xml namespace attributes for later serialization. Signed-off-by: Josh Matthews <josh@joshmatthews.net> * Update xml5lib-tests --------- Signed-off-by: Josh Matthews <josh@joshmatthews.net> Co-authored-by: Josh Matthews <josh@joshmatthews.net>
1 parent 31a2c31 commit 1d8748b

File tree

4 files changed

+46
-36
lines changed

4 files changed

+46
-36
lines changed

rcdom/tests/xml-driver.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,3 +99,39 @@ fn assert_serialization(text: &'static str, dom: RcDom) {
9999
serialize::serialize(&mut serialized, &document, Default::default()).unwrap();
100100
assert_eq!(String::from_utf8(serialized).unwrap(), text);
101101
}
102+
103+
#[test]
104+
fn xmlns_on_root() {
105+
assert_serialization(
106+
r##"<svg xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg">
107+
<sodipodi:namedview>
108+
...
109+
</sodipodi:namedview>
110+
111+
<path d="..." sodipodi:nodetypes="cccc"></path>
112+
</svg>"##,
113+
driver::parse_document(RcDom::default(), Default::default())
114+
.from_utf8()
115+
.one(r##"<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd">
116+
<sodipodi:namedview>
117+
...
118+
</sodipodi:namedview>
119+
120+
<path d="..." sodipodi:nodetypes="cccc"/>
121+
</svg>"##.as_bytes()),
122+
);
123+
}
124+
125+
#[test]
126+
fn xmlns_applies_to_attr() {
127+
assert_serialization(
128+
r##"<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd">
129+
<path d="..." sodipodi:nodetypes="cccc"></path>
130+
</svg>"##,
131+
driver::parse_document(RcDom::default(), Default::default())
132+
.from_utf8()
133+
.one(r##"<svg xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg">
134+
<path d="..." sodipodi:nodetypes="cccc"/>
135+
</svg>"##.as_bytes()),
136+
);
137+
}

xml5ever/src/serialize/mod.rs

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -149,24 +149,6 @@ impl<Wr: Write> Serializer for XmlSerializer<Wr> {
149149

150150
self.writer.write_all(b"<")?;
151151
self.qual_name(&name)?;
152-
if let Some(current_namespace) = self.namespace_stack.0.last() {
153-
for (prefix, url_opt) in current_namespace.get_scope_iter() {
154-
self.writer.write_all(b" xmlns")?;
155-
if let Some(ref p) = *prefix {
156-
self.writer.write_all(b":")?;
157-
self.writer.write_all(p.as_bytes())?;
158-
}
159-
160-
self.writer.write_all(b"=\"")?;
161-
let url = if let Some(ref a) = *url_opt {
162-
a.as_bytes()
163-
} else {
164-
b""
165-
};
166-
self.writer.write_all(url)?;
167-
self.writer.write_all(b"\"")?;
168-
}
169-
}
170152
for (name, value) in attrs {
171153
self.writer.write_all(b" ")?;
172154
self.qual_attr_name(name)?;

xml5ever/src/tree_builder/mod.rs

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -338,25 +338,17 @@ where
338338
// List of already present namespace local name attribute pairs.
339339
let mut present_attrs: HashSet<(Namespace, LocalName)> = Default::default();
340340

341-
let mut new_attr = vec![];
342-
// First we extract all namespace declarations
343-
for attr in tag.attrs.iter_mut().filter(|attr| {
344-
attr.name.prefix == Some(namespace_prefix!("xmlns"))
341+
// We need to filter out any duplicate attributes.
342+
tag.attrs.retain_mut(|attr| {
343+
if attr.name.prefix == Some(namespace_prefix!("xmlns"))
345344
|| attr.name.local == local_name!("xmlns")
346-
}) {
347-
self.declare_ns(attr);
348-
}
349-
350-
// Then we bind those namespace declarations to attributes
351-
for attr in tag.attrs.iter_mut().filter(|attr| {
352-
attr.name.prefix != Some(namespace_prefix!("xmlns"))
353-
&& attr.name.local != local_name!("xmlns")
354-
}) {
355-
if self.bind_attr_qname(&mut present_attrs, &mut attr.name) {
356-
new_attr.push(attr.clone());
345+
{
346+
self.declare_ns(attr);
347+
true
348+
} else {
349+
self.bind_attr_qname(&mut present_attrs, &mut attr.name)
357350
}
358-
}
359-
tag.attrs = new_attr;
351+
});
360352

361353
// Then we bind the tags namespace.
362354
self.bind_qname(&mut tag.name);

0 commit comments

Comments
 (0)
0