diff options
Diffstat (limited to 'components/script/dom/servoxmlparser.rs')
-rw-r--r-- | components/script/dom/servoxmlparser.rs | 185 |
1 files changed, 0 insertions, 185 deletions
diff --git a/components/script/dom/servoxmlparser.rs b/components/script/dom/servoxmlparser.rs deleted file mode 100644 index 919dcfdb946..00000000000 --- a/components/script/dom/servoxmlparser.rs +++ /dev/null @@ -1,185 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -use dom::bindings::cell::DOMRefCell; -use dom::bindings::codegen::Bindings::ServoXMLParserBinding; -use dom::bindings::inheritance::Castable; -use dom::bindings::js::{JS, Root}; -use dom::bindings::reflector::reflect_dom_object; -use dom::bindings::trace::JSTraceable; -use dom::document::Document; -use dom::globalscope::GlobalScope; -use dom::node::Node; -use dom::servoparser::ServoParser; -use dom::window::Window; -use js::jsapi::JSTracer; -use msg::constellation_msg::PipelineId; -use parse::{Parser, ParserRef}; -use profile_traits::time::{ProfilerCategory, TimerMetadata}; -use profile_traits::time::{TimerMetadataFrameType, TimerMetadataReflowType, profile}; -use script_thread::ScriptThread; -use std::cell::Cell; -use url::Url; -use xml5ever::tokenizer; -use xml5ever::tree_builder::{self, XmlTreeBuilder}; - -pub type Tokenizer = tokenizer::XmlTokenizer<XmlTreeBuilder<JS<Node>, Sink>>; - -#[must_root] -#[derive(JSTraceable, HeapSizeOf)] -pub struct Sink { - pub base_url: Option<Url>, - pub document: JS<Document>, -} - -#[must_root] -#[dom_struct] -pub struct ServoXMLParser { - servoparser: ServoParser, - #[ignore_heap_size_of = "Defined in xml5ever"] - tokenizer: DOMRefCell<Tokenizer>, - /// True if this parser should avoid passing any further data to the tokenizer. - suspended: Cell<bool>, -} - -impl<'a> Parser for &'a ServoXMLParser { - fn parse_chunk(self, input: String) { - self.upcast().document().set_current_parser(Some(ParserRef::XML(self))); - self.upcast().push_input_chunk(input); - if !self.is_suspended() { - self.parse_sync(); - } - } - - fn finish(self) { - assert!(!self.suspended.get()); - assert!(!self.upcast().has_pending_input()); - - self.tokenizer.borrow_mut().end(); - debug!("finished parsing"); - - self.upcast().document().set_current_parser(None); - - if let Some(pipeline) = self.upcast().pipeline() { - ScriptThread::parsing_complete(pipeline); - } - } -} - -impl ServoXMLParser { - #[allow(unrooted_must_root)] - pub fn new(base_url: Option<Url>, document: &Document, pipeline: Option<PipelineId>) - -> Root<ServoXMLParser> { - let sink = Sink { - base_url: base_url, - document: JS::from_ref(document), - }; - - let tb = XmlTreeBuilder::new(sink); - - let tok = tokenizer::XmlTokenizer::new(tb, Default::default()); - - let parser = ServoXMLParser { - servoparser: ServoParser::new_inherited(document, pipeline, false), - tokenizer: DOMRefCell::new(tok), - suspended: Cell::new(false), - }; - - reflect_dom_object(box parser, document.window(), ServoXMLParserBinding::Wrap) - } - - pub fn window(&self) -> &Window { - self.upcast().document().window() - } - - pub fn resume(&self) { - assert!(self.suspended.get()); - self.suspended.set(false); - self.parse_sync(); - } - - pub fn suspend(&self) { - assert!(!self.suspended.get()); - self.suspended.set(true); - } - - pub fn is_suspended(&self) -> bool { - self.suspended.get() - } - - pub fn parse_sync(&self) { - let metadata = TimerMetadata { - url: self.upcast().document().url().as_str().into(), - iframe: TimerMetadataFrameType::RootWindow, - incremental: TimerMetadataReflowType::FirstReflow, - }; - profile(ProfilerCategory::ScriptParseXML, - Some(metadata), - self.upcast().document().window().upcast::<GlobalScope>().time_profiler_chan().clone(), - || self.do_parse_sync()) - } - - fn do_parse_sync(&self) { - // This parser will continue to parse while there is either pending input or - // the parser remains unsuspended. - loop { - self.upcast().document().reflow_if_reflow_timer_expired(); - if let Some(chunk) = self.upcast().take_next_input_chunk() { - self.tokenizer.borrow_mut().feed(chunk.into()); - } else { - self.tokenizer.borrow_mut().run(); - } - - // Document parsing is blocked on an external resource. - if self.suspended.get() { - return; - } - - if !self.upcast().has_pending_input() { - break; - } - } - - if self.upcast().last_chunk_received() { - self.finish(); - } - } - - pub fn set_plaintext_state(&self) { - //self.tokenizer.borrow_mut().set_plaintext_state() - } - - pub fn end_tokenizer(&self) { - self.tokenizer.borrow_mut().end() - } - - pub fn tokenizer(&self) -> &DOMRefCell<Tokenizer> { - &self.tokenizer - } -} - -struct Tracer { - trc: *mut JSTracer, -} - -impl tree_builder::Tracer for Tracer { - type Handle = JS<Node>; - #[allow(unrooted_must_root)] - fn trace_handle(&self, node: JS<Node>) { - node.trace(self.trc); - } -} - -impl JSTraceable for Tokenizer { - fn trace(&self, trc: *mut JSTracer) { - let tracer = Tracer { - trc: trc, - }; - let tracer = &tracer as &tree_builder::Tracer<Handle=JS<Node>>; - - let tree_builder = self.sink(); - tree_builder.trace_handles(tracer); - tree_builder.sink().trace(trc); - } -} |