diff options
author | ronak <ronak@localhost.localdomain> | 2015-12-03 17:30:17 -0500 |
---|---|---|
committer | Josh Matthews <josh@joshmatthews.net> | 2015-12-04 16:37:13 -0500 |
commit | d38a1a0d032dfeabd5451c96f85280fd1fa1b830 (patch) | |
tree | 8f290554341c7f40ebd79fc2c2796be7ef7ba68c /components/script/dom | |
parent | 9d3b915cace62d1e6aaa22572a992316894edf76 (diff) | |
download | servo-d38a1a0d032dfeabd5451c96f85280fd1fa1b830.tar.gz servo-d38a1a0d032dfeabd5451c96f85280fd1fa1b830.zip |
Create and invoke XML parser for XML documents.
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/servohtmlparser.rs | 6 | ||||
-rw-r--r-- | components/script/dom/servoxmlparser.rs | 62 |
2 files changed, 61 insertions, 7 deletions
diff --git a/components/script/dom/servohtmlparser.rs b/components/script/dom/servohtmlparser.rs index 500fd46d6e6..6584dbe5cb5 100644 --- a/components/script/dom/servohtmlparser.rs +++ b/components/script/dom/servohtmlparser.rs @@ -268,7 +268,10 @@ impl AsyncResponseListener for ParserContext { let parser = parser.r(); let win = parser.window(); self.parser = Some(match parser { - ParserRef::HTML(parser) => TrustedParser::HTML(Trusted::new(win.get_cx(), parser, self.script_chan.clone())), + ParserRef::HTML(parser) => TrustedParser::HTML( + Trusted::new(win.get_cx(), + parser, + self.script_chan.clone())), ParserRef::XML(parser) => TrustedParser::XML(Trusted::new(win.get_cx(), parser, self.script_chan.clone())), }); @@ -288,6 +291,7 @@ impl AsyncResponseListener for ParserContext { parser.set_plaintext_state(); }, Some(ContentType(Mime(TopLevel::Text, SubLevel::Html, _))) => {}, // Handle text/html + Some(ContentType(Mime(TopLevel::Text, SubLevel::Xml, _))) => {}, // Handle text/xml Some(ContentType(Mime(toplevel, sublevel, _))) => { if toplevel.as_str() == "application" && sublevel.as_str() == "xhtml+xml" { // Handle xhtml (application/xhtml+xml). diff --git a/components/script/dom/servoxmlparser.rs b/components/script/dom/servoxmlparser.rs index 9075dd5f2eb..4f4b4be7d3e 100644 --- a/components/script/dom/servoxmlparser.rs +++ b/components/script/dom/servoxmlparser.rs @@ -3,8 +3,10 @@ * 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::global::GlobalRef; use dom::bindings::js::{JS, Root}; -use dom::bindings::reflector::Reflector; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::bindings::trace::JSTraceable; use dom::document::Document; use dom::node::Node; @@ -87,7 +89,30 @@ impl<'a> Parser for &'a ServoXMLParser { } impl ServoXMLParser { - pub fn new() { + #[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 { + reflector_: Reflector::new(), + tokenizer: DOMRefCell::new(tok), + pending_input: DOMRefCell::new(vec!()), + document: JS::from_ref(document), + suspended: Cell::new(false), + last_chunk_received: Cell::new(false), + pipeline: pipeline, + }; + + reflect_dom_object(box parser, GlobalRef::Window(document.window()), + ServoXMLParserBinding::Wrap) } pub fn window(&self) -> &Window { @@ -95,19 +120,44 @@ impl ServoXMLParser { } pub fn resume(&self) { - panic!() + assert!(self.suspended.get()); + self.suspended.set(false); + self.parse_sync(); } pub fn suspend(&self) { - panic!() + assert!(!self.suspended.get()); + self.suspended.set(true); } pub fn is_suspended(&self) -> bool { - panic!() + self.suspended.get() } pub fn parse_sync(&self) { - panic!() + // This parser will continue to parse while there is either pending input or + // the parser remains unsuspended. + loop { + self.document.reflow_if_reflow_timer_expired(); + let mut pending_input = self.pending_input.borrow_mut(); + if !pending_input.is_empty() { + let chunk = pending_input.remove(0); + self.tokenizer.borrow_mut().feed(chunk.into()); + } + + // Document parsing is blocked on an external resource. + if self.suspended.get() { + return; + } + + if pending_input.is_empty() { + break; + } + } + + if self.last_chunk_received.get() { + self.finish(); + } } pub fn pending_input(&self) -> &DOMRefCell<Vec<String>> { |