aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/parse
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/parse')
-rw-r--r--components/script/parse/html.rs109
-rw-r--r--components/script/parse/mod.rs4
2 files changed, 23 insertions, 90 deletions
diff --git a/components/script/parse/html.rs b/components/script/parse/html.rs
index 80885acf300..a9e125f7da9 100644
--- a/components/script/parse/html.rs
+++ b/components/script/parse/html.rs
@@ -4,7 +4,7 @@
#![allow(unsafe_code, unrooted_must_root)]
-use document_loader::{DocumentLoader, LoadType};
+use document_loader::DocumentLoader;
use dom::attr::AttrHelpers;
use dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods;
use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods;
@@ -32,13 +32,10 @@ use dom::servohtmlparser::{ServoHTMLParser, FragmentContext};
use dom::text::Text;
use parse::Parser;
-use encoding::all::UTF_8;
-use encoding::types::{Encoding, DecoderTrap};
+use encoding::types::Encoding;
-use net_traits::{ProgressMsg, LoadResponse};
+use msg::constellation_msg::PipelineId;
use util::str::DOMString;
-use util::task_state;
-use util::task_state::IN_HTML_PARSER;
use std::borrow::Cow;
use std::io::{self, Write};
use url::Url;
@@ -49,14 +46,6 @@ use html5ever::serialize::TraversalScope::{IncludeNode, ChildrenOnly};
use html5ever::tree_builder::{TreeSink, QuirksMode, NodeOrText, AppendNode, AppendText, NextParserState};
use string_cache::QualName;
-use hyper::header::ContentType;
-use hyper::mime::{Mime, TopLevel, SubLevel};
-
-pub enum HTMLInput {
- InputString(String),
- InputUrl(LoadResponse),
-}
-
trait SinkHelpers {
fn get_or_create(&self, child: NodeOrText<JS<Node>>) -> Temporary<Node>;
}
@@ -183,7 +172,9 @@ impl<'a> TreeSink for servohtmlparser::Sink {
fn complete_script(&mut self, node: JS<Node>) -> NextParserState {
let node: Root<Node> = node.root();
let script: Option<JSRef<HTMLScriptElement>> = HTMLScriptElementCast::to_ref(node.r());
- script.map(|script| script.prepare());
+ if let Some(script) = script {
+ return script.prepare();
+ }
NextParserState::Continue
}
@@ -272,80 +263,22 @@ impl<'a> Serializable for JSRef<'a, Node> {
}
}
+pub enum ParseContext<'a> {
+ Fragment(FragmentContext<'a>),
+ Owner(Option<PipelineId>),
+}
+
pub fn parse_html(document: JSRef<Document>,
- input: HTMLInput,
+ input: String,
url: &Url,
- fragment_context: Option<FragmentContext>) {
- let parser = match fragment_context {
- None => ServoHTMLParser::new(Some(url.clone()), document).root(),
- Some(fc) => ServoHTMLParser::new_for_fragment(Some(url.clone()), document, fc).root(),
- };
- let parser: JSRef<ServoHTMLParser> = parser.r();
-
- let nested_parse = task_state::get().contains(task_state::IN_HTML_PARSER);
- if !nested_parse {
- task_state::enter(IN_HTML_PARSER);
- }
-
- fn parse_progress(document: JSRef<Document>, parser: JSRef<ServoHTMLParser>, url: &Url, load_response: &LoadResponse) {
- for msg in load_response.progress_port.iter() {
- match msg {
- ProgressMsg::Payload(data) => {
- // FIXME: use Vec<u8> (html5ever #34)
- let data = UTF_8.decode(&data, DecoderTrap::Replace).unwrap();
- parser.parse_chunk(data);
- }
- ProgressMsg::Done(Err(err)) => {
- debug!("Failed to load page URL {}, error: {}", url.serialize(), err);
- // TODO(Savago): we should send a notification to callers #5463.
- break;
- }
- ProgressMsg::Done(Ok(())) => {
- document.finish_load(LoadType::PageSource(url.clone()));
- break;
- }
- }
- }
- };
-
- match input {
- HTMLInput::InputString(s) => {
- parser.parse_chunk(s);
- }
- HTMLInput::InputUrl(load_response) => {
- match load_response.metadata.content_type {
- Some(ContentType(Mime(TopLevel::Image, _, _))) => {
- let page = format!("<html><body><img src='{}' /></body></html>", url.serialize());
- parser.parse_chunk(page);
- document.finish_load(LoadType::PageSource(url.clone()));
- },
- Some(ContentType(Mime(TopLevel::Text, SubLevel::Plain, _))) => {
- // FIXME: When servo/html5ever#109 is fixed remove <plaintext> usage and
- // replace with fix from that issue.
-
- // text/plain documents require setting the tokenizer into PLAINTEXT mode.
- // This is done by using a <plaintext> element as the html5ever tokenizer
- // provides no other way to change to that state.
- // Spec for text/plain handling is:
- // https://html.spec.whatwg.org/multipage/#read-text
- let page = format!("<pre>\u{000A}<plaintext>");
- parser.parse_chunk(page);
- parse_progress(document, parser, url, &load_response);
- },
- _ => {
- parse_progress(document, parser, url, &load_response);
- }
- }
- }
- }
-
- parser.finish();
-
- if !nested_parse {
- task_state::exit(IN_HTML_PARSER);
- }
-
- debug!("finished parsing");
+ context: ParseContext) {
+ let parser = match context {
+ ParseContext::Owner(owner) =>
+ ServoHTMLParser::new(Some(url.clone()), document, owner),
+ ParseContext::Fragment(fc) =>
+ ServoHTMLParser::new_for_fragment(Some(url.clone()), document, fc),
+ }.root();
+ parser.r().parse_chunk(input);
}
// https://html.spec.whatwg.org/multipage/#parsing-html-fragments
@@ -376,7 +309,7 @@ pub fn parse_html_fragment(context_node: JSRef<Node>,
context_elem: context_node,
form_elem: form.r(),
};
- parse_html(document.r(), HTMLInput::InputString(input), &url, Some(fragment_context));
+ parse_html(document.r(), input, &url, ParseContext::Fragment(fragment_context));
// Step 14.
let root_element = document.r().GetDocumentElement().expect("no document element").root();
diff --git a/components/script/parse/mod.rs b/components/script/parse/mod.rs
index 6111f196053..fa93dbc157f 100644
--- a/components/script/parse/mod.rs
+++ b/components/script/parse/mod.rs
@@ -5,6 +5,6 @@
pub mod html;
pub trait Parser {
- fn parse_chunk(&self,input: String);
- fn finish(&self);
+ fn parse_chunk(self, input: String);
+ fn finish(self);
}