Skip to content

Commit 040a4dd

Browse files
author
bors-servo
authored
Auto merge of #386 - servo:private-rcdom, r=nox
Extract RcDom into its own crate with no support guarantees The RcDom implementation was never intended as anything more than a test-only implementation. This work extracts it into a separate crate that contains a README that lays out what sort of support and maintenance guarantees anybody choosing to rely on it can expect (read: none). Fixes #385.
2 parents cf07a98 + 9b90752 commit 040a4dd

File tree

19 files changed

+96
-39
lines changed

19 files changed

+96
-39
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@
22
members = [
33
"markup5ever",
44
"html5ever",
5+
"rcdom",
56
"xml5ever"
67
]

html5ever/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ serde_json = "1.0"
3737
rustc-test = "0.3"
3838
typed-arena = "1.3.0"
3939
criterion = "0.3"
40+
markup5ever_rcdom = { version = "0.1", path = "../rcdom" }
4041

4142
[build-dependencies]
4243
quote = "1"

html5ever/examples/html2html.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,16 @@
1616
//! where htmlparser-1.4.jar comes from http://about.validator.nu/htmlparser/
1717
1818
extern crate html5ever;
19+
extern crate markup5ever_rcdom as rcdom;
1920

2021
use std::default::Default;
2122
use std::io::{self, Write};
2223

2324
use html5ever::driver::ParseOpts;
24-
use html5ever::rcdom::RcDom;
2525
use html5ever::tendril::TendrilSink;
2626
use html5ever::tree_builder::TreeBuilderOpts;
2727
use html5ever::{parse_document, serialize};
28+
use rcdom::{RcDom, SerializableHandle};
2829

2930
fn main() {
3031
let opts = ParseOpts {
@@ -45,7 +46,8 @@ fn main() {
4546
.write_all(b"<!DOCTYPE html>\n")
4647
.ok()
4748
.expect("writing DOCTYPE failed");
48-
serialize(&mut io::stdout(), &dom.document, Default::default())
49+
let document: SerializableHandle = dom.document.clone().into();
50+
serialize(&mut io::stdout(), &document, Default::default())
4951
.ok()
5052
.expect("serialization failed");
5153
}

html5ever/examples/print-rcdom.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,16 @@
99

1010
#[macro_use]
1111
extern crate html5ever;
12+
extern crate markup5ever_rcdom as rcdom;
1213

1314
use std::default::Default;
1415
use std::io;
1516
use std::iter::repeat;
1617
use std::string::String;
1718

1819
use html5ever::parse_document;
19-
use html5ever::rcdom::{Handle, NodeData, RcDom};
2020
use html5ever::tendril::TendrilSink;
21+
use rcdom::{Handle, NodeData, RcDom};
2122

2223
// This is not proper HTML serialization, of course.
2324

html5ever/src/driver.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -137,18 +137,20 @@ impl<Sink: TreeSink> Parser<Sink> {
137137

138138
#[cfg(test)]
139139
mod tests {
140+
extern crate markup5ever_rcdom;
140141
use super::*;
141-
use crate::rcdom::RcDom;
142+
use self::markup5ever_rcdom::{RcDom, SerializableHandle};
142143
use crate::serialize::serialize;
143-
use crate::tendril::TendrilSink;
144+
use tendril::TendrilSink;
144145

145146
#[test]
146147
fn from_utf8() {
147148
let dom = parse_document(RcDom::default(), ParseOpts::default())
148149
.from_utf8()
149150
.one("<title>Test".as_bytes());
150151
let mut serialized = Vec::new();
151-
serialize(&mut serialized, &dom.document, Default::default()).unwrap();
152+
let document: SerializableHandle = dom.document.clone().into();
153+
serialize(&mut serialized, &document, Default::default()).unwrap();
152154
assert_eq!(
153155
String::from_utf8(serialized).unwrap().replace(" ", ""),
154156
"<html><head><title>Test</title></head><body></body></html>"

html5ever/src/tree_builder/mod.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1683,9 +1683,10 @@ where
16831683
#[cfg(test)]
16841684
#[allow(non_snake_case)]
16851685
mod test {
1686-
use crate::interface::{AppendNode, AppendText, NodeOrText};
1687-
use crate::interface::{ElementFlags, Tracer, TreeSink};
1688-
use crate::interface::{LimitedQuirks, NoQuirks, Quirks, QuirksMode};
1686+
extern crate markup5ever_rcdom as rcdom;
1687+
use markup5ever::interface::{AppendNode, AppendText, NodeOrText};
1688+
use markup5ever::interface::{ElementFlags, Tracer, TreeSink};
1689+
use markup5ever::interface::{LimitedQuirks, NoQuirks, Quirks, QuirksMode};
16891690

16901691
use super::types::*;
16911692

@@ -1698,6 +1699,7 @@ mod test {
16981699
use crate::tokenizer::states as tok_state;
16991700
use crate::tokenizer::{Doctype, StartTag, Tag, TokenSink};
17001701
use crate::tokenizer::{Tokenizer, TokenizerOpts};
1702+
use crate::driver::*;
17011703

17021704
use crate::util::str::is_ascii_whitespace;
17031705

@@ -1708,9 +1710,8 @@ mod test {
17081710
use std::mem::replace;
17091711

17101712
use super::{TreeBuilder, TreeBuilderOpts};
1711-
use crate::driver::*;
1712-
use crate::{Attribute, local_name, namespace_url, ns};
1713-
use crate::rcdom::{Handle, Node, NodeData, RcDom};
1713+
use markup5ever::{Attribute, local_name, namespace_url, ns};
1714+
use self::rcdom::{Handle, Node, NodeData, RcDom};
17141715

17151716
pub struct LineCountingDOM {
17161717
pub line_vec: Vec<(QualName, u64)>,

html5ever/tests/serializer.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,16 @@
99

1010
#[macro_use]
1111
extern crate html5ever;
12+
extern crate markup5ever_rcdom as rcdom;
1213

1314
use std::default::Default;
1415

1516
use html5ever::driver::ParseOpts;
16-
use html5ever::rcdom::RcDom;
1717
use html5ever::serialize::{Serialize, SerializeOpts, Serializer, TraversalScope};
1818
use html5ever::tendril::{SliceExt, StrTendril, TendrilSink};
1919
use html5ever::tokenizer::{TagKind, Token, TokenSink, TokenSinkResult, Tokenizer};
2020
use html5ever::{parse_document, parse_fragment, serialize, QualName};
21+
use rcdom::{RcDom, SerializableHandle};
2122

2223
use std::io;
2324

@@ -98,10 +99,10 @@ fn parse_and_serialize(input: StrTendril) -> StrTendril {
9899
vec![],
99100
)
100101
.one(input);
101-
let inner = &dom.document.children.borrow()[0];
102+
let inner: SerializableHandle = dom.document.children.borrow()[0].clone().into();
102103

103104
let mut result = vec![];
104-
serialize(&mut result, inner, Default::default()).unwrap();
105+
serialize(&mut result, &inner, Default::default()).unwrap();
105106
StrTendril::try_from_byte_slice(&result).unwrap()
106107
}
107108

@@ -242,7 +243,8 @@ fn doctype() {
242243
let dom = parse_document(RcDom::default(), ParseOpts::default()).one("<!doctype html>");
243244
dom.document.children.borrow_mut().truncate(1); // Remove <html>
244245
let mut result = vec![];
245-
serialize(&mut result, &dom.document, Default::default()).unwrap();
246+
let document: SerializableHandle = dom.document.clone().into();
247+
serialize(&mut result, &document, Default::default()).unwrap();
246248
assert_eq!(String::from_utf8(result).unwrap(), "<!DOCTYPE html>");
247249
}
248250

@@ -259,6 +261,7 @@ fn deep_tree() {
259261
let document = &dom.document;
260262
let opts = SerializeOpts::default();
261263
let mut ret_val = Vec::new();
262-
serialize(&mut ret_val, document, opts)
264+
let document: SerializableHandle = dom.document.clone().into();
265+
serialize(&mut ret_val, &document, opts)
263266
.expect("Writing to a string shouldn't fail (expect on OOM)");
264267
}

html5ever/tests/tree_builder.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
// option. This file may not be copied, modified, or distributed
88
// except according to those terms.
99

10+
extern crate markup5ever_rcdom as rcdom;
1011
extern crate rustc_test as test;
1112
#[macro_use]
1213
extern crate html5ever;
@@ -24,10 +25,10 @@ use std::path::Path;
2425
use std::{env, fs, io};
2526
use test::{DynTestName, TestDesc, TestDescAndFn, TestFn};
2627

27-
use html5ever::rcdom::{Handle, NodeData, RcDom};
2828
use html5ever::tendril::{StrTendril, TendrilSink};
2929
use html5ever::{parse_document, parse_fragment, ParseOpts};
3030
use html5ever::{LocalName, QualName};
31+
use rcdom::{Handle, NodeData, RcDom};
3132

3233
fn parse_tests<It: Iterator<Item = String>>(mut lines: It) -> Vec<HashMap<String, String>> {
3334
let mut tests = vec![];

markup5ever/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,5 @@ serde = "1.0"
2626
serde_derive = "1.0"
2727
serde_json = "1.0"
2828

29+
[dev-dependencies]
30+
markup5ever_rcdom = { version = "0.1", path = "../rcdom" }

markup5ever/interface/tree_builder.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,10 @@ pub struct ElementFlags {
8383
///
8484
/// ```
8585
/// # #[macro_use] extern crate markup5ever;
86+
/// # extern crate markup5ever_rcdom as rcdom;
8687
///
8788
/// # fn main() {
88-
/// use markup5ever::{rcdom, QualName, Attribute};
89+
/// use markup5ever::{QualName, Attribute};
8990
/// use markup5ever::interface::create_element;
9091
///
9192
/// let mut dom = rcdom::RcDom::default();

markup5ever/lib.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ include!(concat!(env!("OUT_DIR"), "/generated.rs"));
3535
pub mod data;
3636
#[macro_use]
3737
pub mod interface;
38-
pub mod rcdom;
3938
pub mod serialize;
4039
mod util {
4140
pub mod buffer_queue;

rcdom/Cargo.toml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
[package]
2+
name = "markup5ever_rcdom"
3+
version = "0.1.0"
4+
authors = [ "The html5ever Project Developers" ]
5+
license = "MIT / Apache-2.0"
6+
repository = "https://github.com/servo/html5ever"
7+
description = "Basic, unsupported DOM structure for use by tests in html5ever/xml5ever"
8+
readme = "README.md"
9+
documentation = "https://docs.rs/markup5ever_rcdom"
10+
categories = [ "parser-implementations", "web-programming" ]
11+
12+
[lib]
13+
path = "lib.rs"
14+
15+
[dependencies]
16+
tendril = "0.4"
17+
markup5ever = { version = "0.10", path = "../markup5ever" }

rcdom/README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# markup5ever_rcdom
2+
3+
This crate is built for the express purpose of writing automated tests for the `html5ever`
4+
and `xml5ever` crates. It is not intended to be a production-quality DOM implementation,
5+
and has not been fuzzed or tested against arbitrary, malicious, or nontrivial inputs. No maintenance
6+
or support for any such issues will be provided. If you use this DOM implementation in a production,
7+
user-facing system, you do so at your own risk.

markup5ever/rcdom.rs renamed to rcdom/lib.rs

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@
3636
//! [tree structure]: https://en.wikipedia.org/wiki/Tree_(data_structure)
3737
//! [dom wiki]: https://en.wikipedia.org/wiki/Document_Object_Model
3838
39+
extern crate markup5ever;
40+
extern crate tendril;
41+
3942
use std::borrow::Cow;
4043
use std::cell::{Cell, RefCell};
4144
use std::collections::HashSet;
@@ -47,14 +50,14 @@ use std::rc::{Rc, Weak};
4750

4851
use tendril::StrTendril;
4952

50-
use crate::interface::tree_builder;
51-
use crate::interface::tree_builder::{ElementFlags, NodeOrText, QuirksMode, TreeSink};
52-
use crate::serialize::TraversalScope;
53-
use crate::serialize::TraversalScope::{ChildrenOnly, IncludeNode};
54-
use crate::serialize::{Serialize, Serializer};
55-
use crate::Attribute;
56-
use crate::ExpandedName;
57-
use crate::QualName;
53+
use markup5ever::interface::tree_builder;
54+
use markup5ever::interface::tree_builder::{ElementFlags, NodeOrText, QuirksMode, TreeSink};
55+
use markup5ever::serialize::TraversalScope;
56+
use markup5ever::serialize::TraversalScope::{ChildrenOnly, IncludeNode};
57+
use markup5ever::serialize::{Serialize, Serializer};
58+
use markup5ever::Attribute;
59+
use markup5ever::ExpandedName;
60+
use markup5ever::QualName;
5861

5962
/// The different kinds of nodes in the DOM.
6063
#[derive(Debug)]
@@ -433,14 +436,22 @@ enum SerializeOp {
433436
Close(QualName)
434437
}
435438

436-
impl Serialize for Handle {
439+
pub struct SerializableHandle(Handle);
440+
441+
impl From<Handle> for SerializableHandle {
442+
fn from(h: Handle) -> SerializableHandle {
443+
SerializableHandle(h)
444+
}
445+
}
446+
447+
impl Serialize for SerializableHandle {
437448
fn serialize<S>(&self, serializer: &mut S, traversal_scope: TraversalScope) -> io::Result<()>
438449
where
439450
S: Serializer,
440451
{
441452
let mut ops = match traversal_scope {
442-
IncludeNode => vec![SerializeOp::Open(self.clone())],
443-
ChildrenOnly(_) => self
453+
IncludeNode => vec![SerializeOp::Open(self.0.clone())],
454+
ChildrenOnly(_) => self.0
444455
.children
445456
.borrow()
446457
.iter()

xml5ever/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ markup5ever = {version = "0.10", path = "../markup5ever" }
3030
serde_json = "1.0"
3131
rustc-test = "0.3"
3232
criterion = "0.2"
33+
markup5ever_rcdom = {version = "0.1", path = "../rcdom" }
3334

3435
[[bench]]
3536
name = "xml5ever"

xml5ever/examples/hello_xml.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,13 @@
88
//! xml5ever = "0.2.0"
99
//! tendril = "0.1.3"
1010
//! ```
11+
extern crate markup5ever_rcdom as rcdom;
1112
extern crate xml5ever;
1213

1314
use std::default::Default;
1415

16+
use rcdom::{NodeData, RcDom};
1517
use xml5ever::driver::parse_document;
16-
use xml5ever::rcdom::{NodeData, RcDom};
1718
use xml5ever::tendril::TendrilSink;
1819
use xml5ever::tree_builder::TreeSink;
1920

xml5ever/examples/xml_tree_printer.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,15 @@
88
//! xml5ever = "0.2.0"
99
//! tendril = "0.1.3"
1010
//! ```
11+
extern crate markup5ever_rcdom as rcdom;
1112
extern crate xml5ever;
1213

1314
use std::default::Default;
1415
use std::io;
1516
use std::string::String;
1617

18+
use rcdom::{Handle, NodeData, RcDom};
1719
use xml5ever::driver::parse_document;
18-
use xml5ever::rcdom::{Handle, NodeData, RcDom};
1920
use xml5ever::tendril::TendrilSink;
2021

2122
fn walk(prefix: &str, handle: &Handle) {

xml5ever/src/driver.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,11 @@ impl<Sink: TreeSink> XmlParser<Sink> {
8989

9090
#[cfg(test)]
9191
mod tests {
92+
extern crate markup5ever_rcdom;
9293
use super::*;
93-
use crate::rcdom::RcDom;
94+
use self::markup5ever_rcdom::{RcDom, SerializableHandle};
9495
use crate::serialize::serialize;
95-
use crate::tendril::TendrilSink;
96+
use tendril::TendrilSink;
9697

9798
#[test]
9899
fn el_ns_serialize() {
@@ -170,16 +171,18 @@ mod tests {
170171

171172
fn assert_eq_serialization(text: &'static str, dom: RcDom) {
172173
let mut serialized = Vec::new();
173-
serialize(&mut serialized, &dom.document, Default::default()).unwrap();
174+
let document: SerializableHandle = dom.document.clone().into();
175+
serialize(&mut serialized, &document, Default::default()).unwrap();
174176

175177
let dom_from_text = parse_document(RcDom::default(), XmlParseOpts::default())
176178
.from_utf8()
177179
.one(text.as_bytes());
178180

179181
let mut reserialized = Vec::new();
182+
let document: SerializableHandle = dom_from_text.document.clone().into();
180183
serialize(
181184
&mut reserialized,
182-
&dom_from_text.document,
185+
&document,
183186
Default::default(),
184187
)
185188
.unwrap();
@@ -192,7 +195,8 @@ mod tests {
192195

193196
fn assert_serialization(text: &'static str, dom: RcDom) {
194197
let mut serialized = Vec::new();
195-
serialize(&mut serialized, &dom.document, Default::default()).unwrap();
198+
let document: SerializableHandle = dom.document.clone().into();
199+
serialize(&mut serialized, &document, Default::default()).unwrap();
196200
assert_eq!(String::from_utf8(serialized).unwrap(), text);
197201
}
198202
}

0 commit comments

Comments
 (0)