Skip to content

Commit b7c5652

Browse files
authored
Merge pull request #770 from Sharktheone/document/handle
2 parents f843534 + df608f6 commit b7c5652

File tree

44 files changed

+734
-1719
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+734
-1719
lines changed

benches/tree_iterator.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use gosub_html5::document::fragment::DocumentFragmentImpl;
88
use gosub_html5::parser::Html5Parser;
99
use gosub_interface::config::{HasCssSystem, HasDocument, HasHtmlParser};
1010
use gosub_interface::document::DocumentBuilder;
11-
use gosub_interface::document_handle::DocumentHandle;
11+
1212
use gosub_shared::byte_stream::{ByteStream, Encoding};
1313
use gosub_shared::node::NodeId;
1414

@@ -38,12 +38,12 @@ fn wikipedia_main_page(c: &mut Criterion) {
3838
let mut stream = ByteStream::new(Encoding::UTF8, None);
3939
let _ = stream.read_from_file(html_file);
4040

41-
let doc_handle: DocumentHandle<Config> = DocumentBuilderImpl::new_document(None);
42-
let _ = Html5Parser::parse_document(&mut stream, doc_handle.clone(), None);
41+
let mut doc = <DocumentBuilderImpl as DocumentBuilder<Config>>::new_document(None);
42+
let _ = Html5Parser::<Config>::parse_document(&mut stream, &mut doc, None);
4343

4444
group.bench_function("wikipedia main page", |b| {
4545
b.iter(|| {
46-
let tree_iterator = TreeIterator::new(doc_handle.clone());
46+
let tree_iterator = TreeIterator::<Config>::new(&doc);
4747
let _ = tree_iterator.collect::<Vec<NodeId>>();
4848
})
4949
});
@@ -63,12 +63,12 @@ fn stackoverflow_home(c: &mut Criterion) {
6363
let mut bytestream = ByteStream::new(Encoding::UTF8, None);
6464
let _ = bytestream.read_from_file(html_file);
6565

66-
let doc_handle: DocumentHandle<Config> = DocumentBuilderImpl::new_document(None);
67-
let _ = Html5Parser::parse_document(&mut bytestream, doc_handle.clone(), None);
66+
let mut doc = <DocumentBuilderImpl as DocumentBuilder<Config>>::new_document(None);
67+
let _ = Html5Parser::<Config>::parse_document(&mut bytestream, &mut doc, None);
6868

6969
group.bench_function("stackoverflow home", |b| {
7070
b.iter(|| {
71-
let tree_iterator = TreeIterator::new(doc_handle.clone());
71+
let tree_iterator = TreeIterator::<Config>::new(&doc);
7272
let _ = tree_iterator.collect::<Vec<NodeId>>();
7373
})
7474
});

crates/gosub_css3/src/matcher/styling.rs

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use gosub_interface::config::HasDocument;
88
use gosub_interface::css3;
99
use gosub_interface::css3::{CssOrigin, CssPropertyMap};
1010
use gosub_interface::document::Document;
11-
use gosub_interface::document_handle::DocumentHandle;
11+
1212
use gosub_interface::node::ClassList;
1313
use gosub_interface::node::ElementDataType;
1414
use gosub_interface::node::Node;
@@ -20,12 +20,12 @@ use crate::system::Css3System;
2020

2121
// Matches a complete selector (all parts) against the given node(id)
2222
pub(crate) fn match_selector<C: HasDocument>(
23-
document: DocumentHandle<C>,
23+
document: &C::Document,
2424
node_id: NodeId,
2525
selector: &CssSelector,
2626
) -> (bool, Specificity) {
2727
for part in &selector.parts {
28-
if match_selector_parts(DocumentHandle::clone(&document), node_id, part) {
28+
if match_selector_parts::<C>(document, node_id, part) {
2929
return (true, Specificity::from(part.as_slice()));
3030
}
3131
}
@@ -44,13 +44,8 @@ fn consume<'a, T>(this: &mut &'a [T]) -> Option<&'a T> {
4444
}
4545

4646
/// Returns true when the given node matches the part(s)
47-
fn match_selector_parts<C: HasDocument>(
48-
handle: DocumentHandle<C>,
49-
node_id: NodeId,
50-
mut parts: &[CssSelectorPart],
51-
) -> bool {
52-
let binding = handle.get();
53-
let mut next_current_node = binding.node_by_id(node_id);
47+
fn match_selector_parts<C: HasDocument>(doc: &C::Document, node_id: NodeId, mut parts: &[CssSelectorPart]) -> bool {
48+
let mut next_current_node = doc.node_by_id(node_id);
5449
if next_current_node.is_none() {
5550
return false;
5651
}
@@ -64,7 +59,7 @@ fn match_selector_parts<C: HasDocument>(
6459
return false;
6560
}
6661

67-
if !match_selector_part::<C>(part, current_node, &*binding, &mut next_current_node, &mut parts) {
62+
if !match_selector_part::<C>(part, current_node, doc, &mut next_current_node, &mut parts) {
6863
return false;
6964
}
7065

crates/gosub_css3/src/system.rs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use crate::stylesheet::{CssDeclaration, CssValue, Specificity};
88
use crate::{load_default_useragent_stylesheet, Css3};
99
use gosub_interface::config::{HasDocument, HasRenderTree};
1010
use gosub_interface::css3::{CssOrigin, CssPropertyMap, CssSystem};
11-
use gosub_interface::document_handle::DocumentHandle;
11+
1212
use gosub_interface::node::{ElementDataType, Node, TextDataType};
1313
use gosub_interface::render_tree::{RenderTree, RenderTreeNode};
1414
use gosub_shared::config::ParserConfig;
@@ -35,7 +35,7 @@ impl CssSystem for Css3System {
3535
fn properties_from_node<C: HasDocument<CssSystem = Self>>(
3636
node: &C::Node,
3737
sheets: &[Self::Stylesheet],
38-
handle: DocumentHandle<C>,
38+
doc: &C::Document,
3939
id: NodeId,
4040
) -> Option<Self::PropertyMap> {
4141
let mut css_map_entry = CssProperties::new();
@@ -51,7 +51,7 @@ impl CssSystem for Css3System {
5151
for sheet in sheets {
5252
for rule in &sheet.rules {
5353
for selector in rule.selectors().iter() {
54-
let (matched, specificity) = match_selector(DocumentHandle::clone(&handle), id, selector);
54+
let (matched, specificity) = match_selector::<C>(doc, id, selector);
5555

5656
if !matched {
5757
continue;
@@ -66,7 +66,7 @@ impl CssSystem for Css3System {
6666
continue;
6767
};
6868

69-
let value = resolve_functions(&declaration.value, node, handle.clone());
69+
let value = resolve_functions::<C>(&declaration.value, node, doc);
7070

7171
let match_value = if let CssValue::List(value) = &value {
7272
&**value
@@ -239,7 +239,7 @@ pub fn node_is_unrenderable<C: HasDocument>(node: &C::Node) -> bool {
239239
false
240240
}
241241

242-
pub fn resolve_functions<C: HasDocument>(value: &CssValue, node: &C::Node, handle: DocumentHandle<C>) -> CssValue {
242+
pub fn resolve_functions<C: HasDocument>(value: &CssValue, node: &C::Node, doc: &C::Document) -> CssValue {
243243
fn resolve<C: HasDocument>(val: &CssValue, node: &C::Node, doc: &C::Document) -> CssValue {
244244
match val {
245245
CssValue::Function(func, values) => {
@@ -256,12 +256,10 @@ pub fn resolve_functions<C: HasDocument>(value: &CssValue, node: &C::Node, handl
256256
}
257257
}
258258

259-
let doc = handle.get();
260-
261259
if let CssValue::List(list) = value {
262-
let resolved = list.iter().map(|val| resolve::<C>(val, node, &*doc)).collect();
260+
let resolved = list.iter().map(|val| resolve::<C>(val, node, doc)).collect();
263261
CssValue::List(resolved)
264262
} else {
265-
resolve::<C>(value, node, &*doc)
263+
resolve::<C>(value, node, doc)
266264
}
267265
}

crates/gosub_html5/docs/parsing.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@ Next, we need to create a document, which will be the main object that will be f
1616
data that is generated during the parsing of the HTML. This also includes any stylesheets that are found, both internally and externally.
1717

1818
```rust
19-
let doc_handle = DocumentBuilderImpl::new_document();
19+
let doc = DocumentBuilderImpl::new_document();
2020
```
2121

22-
Note that a doc_handle itself isn't a document, but a HANDLE to a document (a `DocumentHandle`). Once we have our document handle, we can start the parser
22+
Once we have our document, we can start the parser
2323
by calling the `parse_document` method on the `Html5Parser` struct. This method will return a list of parse errors, if any.
2424

2525
```rust
26-
let parse_errors = Html5Parser::parse_document(&mut stream, doc_handle.clone(), None)?;
26+
let parse_errors = Html5Parser::parse_document(&mut stream, &mut doc, None)?;
2727

2828
for e in parse_errors {
2929
println!("Parse Error: {}", e.message);
Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use crate::node::HTML_NAMESPACE;
2-
use crate::DocumentHandle;
32
use gosub_interface::config::HasDocument;
43
use gosub_interface::document::DocumentBuilder;
54
use gosub_interface::document::{Document, DocumentType};
@@ -12,35 +11,28 @@ pub struct DocumentBuilderImpl {}
1211

1312
impl<C: HasDocument> DocumentBuilder<C> for DocumentBuilderImpl {
1413
/// Creates a new document with a document root node
15-
fn new_document(url: Option<Url>) -> DocumentHandle<C> {
14+
fn new_document(url: Option<Url>) -> C::Document {
1615
C::Document::new(DocumentType::HTML, url, None)
1716
}
1817

1918
/// Creates a new document fragment with the context as the root node
20-
fn new_document_fragment(context_node: &C::Node, quirks_mode: QuirksMode) -> DocumentHandle<C> {
21-
let handle = context_node.handle();
22-
19+
fn new_document_fragment(context_node: &C::Node, quirks_mode: QuirksMode) -> C::Document {
2320
// Create a new document with an HTML node as the root node
24-
let fragment_root_node = C::Document::new_element_node(
25-
handle.clone(),
26-
"html",
27-
Some(HTML_NAMESPACE),
28-
HashMap::new(),
29-
context_node.location(),
30-
);
31-
let mut fragment_handle = C::Document::new(DocumentType::HTML, None, Some(fragment_root_node));
21+
let fragment_root_node =
22+
C::Document::new_element_node("html", Some(HTML_NAMESPACE), HashMap::new(), context_node.location());
23+
let mut fragment = C::Document::new(DocumentType::HTML, None, Some(fragment_root_node));
3224

3325
// let context_node = context_node.clone();
3426
match quirks_mode {
3527
QuirksMode::Quirks => {
36-
fragment_handle.get_mut().set_quirks_mode(QuirksMode::Quirks);
28+
fragment.set_quirks_mode(QuirksMode::Quirks);
3729
}
3830
QuirksMode::LimitedQuirks => {
39-
fragment_handle.get_mut().set_quirks_mode(QuirksMode::LimitedQuirks);
31+
fragment.set_quirks_mode(QuirksMode::LimitedQuirks);
4032
}
4133
_ => {}
4234
}
4335

44-
fragment_handle
36+
fragment
4537
}
4638
}

0 commit comments

Comments
 (0)