Make ServoParser::pending_input hold onto a BufferQueue

This commit is contained in:
Anthony Ramine 2016-11-16 16:28:30 +01:00
parent 22aebdf5d4
commit a3da819d10
7 changed files with 68 additions and 73 deletions

View file

@ -34,22 +34,19 @@ use js::jsapi::JSTracer;
use servo_url::ServoUrl;
use std::borrow::Cow;
use std::io::{self, Write};
use super::{FragmentContext, Sink};
#[derive(HeapSizeOf, JSTraceable)]
#[must_root]
pub struct Tokenizer {
#[ignore_heap_size_of = "Defined in html5ever"]
inner: HtmlTokenizer<TreeBuilder<JS<Node>, Sink>>,
#[ignore_heap_size_of = "Defined in html5ever"]
input_buffer: BufferQueue,
}
impl Tokenizer {
pub fn new(
document: &Document,
url: ServoUrl,
fragment_context: Option<FragmentContext>)
fragment_context: Option<super::FragmentContext>)
-> Self {
let sink = Sink {
base_url: url,
@ -80,27 +77,17 @@ impl Tokenizer {
Tokenizer {
inner: inner,
input_buffer: BufferQueue::new(),
}
}
pub fn feed(&mut self, input: String) {
self.input_buffer.push_back(input.into());
self.run();
}
#[allow(unrooted_must_root)]
pub fn run(&mut self) {
while let TokenizerResult::Script(script) = self.inner.feed(&mut self.input_buffer) {
let script = Root::from_ref(script.downcast::<HTMLScriptElement>().unwrap());
if !script.prepare() {
break;
}
pub fn feed(&mut self, input: &mut BufferQueue) -> Result<(), Root<HTMLScriptElement>> {
match self.inner.feed(input) {
TokenizerResult::Done => Ok(()),
TokenizerResult::Script(script) => Err(Root::from_ref(script.downcast().unwrap())),
}
}
pub fn end(&mut self) {
assert!(self.input_buffer.is_empty());
self.inner.end();
}
@ -128,6 +115,13 @@ impl JSTraceable for HtmlTokenizer<TreeBuilder<JS<Node>, Sink>> {
}
}
#[derive(JSTraceable, HeapSizeOf)]
#[must_root]
struct Sink {
base_url: ServoUrl,
document: JS<Document>,
}
impl<'a> TreeSink for Sink {
type Output = Self;
fn finish(self) -> Self { self }