Skip to content

Commit 2e33830

Browse files
authored
Revert "Store xml namespace attributes for later serialization" (#595)
* Revert "Bump rcdom/xml5lib-tests from `9a7ca89` to `a6d626e` (#589)" This reverts commit e9b044c. * Revert "Store xml namespace attributes for later serialization (#586)" This reverts commit 1d8748b. * Publish xml5ever 0.22.1. Signed-off-by: Josh Matthews <[email protected]> --------- Signed-off-by: Josh Matthews <[email protected]>
1 parent 5132547 commit 2e33830

File tree

5 files changed

+37
-47
lines changed

5 files changed

+37
-47
lines changed

rcdom/tests/xml-driver.rs

-36
Original file line numberDiff line numberDiff line change
@@ -99,39 +99,3 @@ 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/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "xml5ever"
3-
version = "0.22.0"
3+
version = "0.22.1"
44
authors = ["The xml5ever project developers"]
55
license = "MIT OR Apache-2.0"
66
repository = "https://github.com/servo/html5ever"

xml5ever/src/serialize/mod.rs

+18
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,24 @@ 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+
}
152170
for (name, value) in attrs {
153171
self.writer.write_all(b" ")?;
154172
self.qual_attr_name(name)?;

xml5ever/src/tree_builder/mod.rs

+17-9
Original file line numberDiff line numberDiff line change
@@ -333,17 +333,25 @@ where
333333
// List of already present namespace local name attribute pairs.
334334
let mut present_attrs: HashSet<(Namespace, LocalName)> = Default::default();
335335

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

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

0 commit comments

Comments
 (0)