diff --git a/html5ever/Cargo.toml b/html5ever/Cargo.toml index d0a0e520..ee88da27 100644 --- a/html5ever/Cargo.toml +++ b/html5ever/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "html5ever" -version = "0.32.1" +version = "0.33.0" authors = [ "The html5ever Project Developers" ] license = "MIT OR Apache-2.0" repository = "https://github.com/servo/html5ever" diff --git a/html5ever/src/driver.rs b/html5ever/src/driver.rs index 1f66ebca..752311e0 100644 --- a/html5ever/src/driver.rs +++ b/html5ever/src/driver.rs @@ -61,12 +61,19 @@ pub fn parse_fragment( opts: ParseOpts, context_name: QualName, context_attrs: Vec, + context_element_allows_scripting: bool, ) -> Parser where Sink: TreeSink, { let context_elem = create_element(&sink, context_name, context_attrs); - parse_fragment_for_element(sink, opts, context_elem, None) + parse_fragment_for_element( + sink, + opts, + context_elem, + context_element_allows_scripting, + None, + ) } /// Like `parse_fragment`, but with an existing context element @@ -75,19 +82,23 @@ pub fn parse_fragment_for_element( sink: Sink, opts: ParseOpts, context_element: Sink::Handle, + context_element_allows_scripting: bool, form_element: Option, ) -> Parser where Sink: TreeSink, { - let tb = TreeBuilder::new_for_fragment(sink, context_element, form_element, opts.tree_builder); - let tok_opts = TokenizerOpts { - initial_state: Some(tb.tokenizer_state_for_context_elem()), + let tree_builder = + TreeBuilder::new_for_fragment(sink, context_element, form_element, opts.tree_builder); + let tokenizer_options = TokenizerOpts { + initial_state: Some( + tree_builder.tokenizer_state_for_context_elem(context_element_allows_scripting), + ), ..opts.tokenizer }; - let tok = Tokenizer::new(tb, tok_opts); + let tokenizer = Tokenizer::new(tree_builder, tokenizer_options); Parser { - tokenizer: tok, + tokenizer, input_buffer: BufferQueue::default(), } } diff --git a/html5ever/src/tree_builder/mod.rs b/html5ever/src/tree_builder/mod.rs index c432e58d..a884ba3f 100644 --- a/html5ever/src/tree_builder/mod.rs +++ b/html5ever/src/tree_builder/mod.rs @@ -223,7 +223,10 @@ where // https://html.spec.whatwg.org/multipage/#concept-frag-parse-context // Step 4. Set the state of the HTML parser's tokenization stage as follows: - pub fn tokenizer_state_for_context_elem(&self) -> tok_state::State { + pub fn tokenizer_state_for_context_elem( + &self, + context_element_allows_scripting: bool, + ) -> tok_state::State { let context_elem = self.context_elem.borrow(); let elem = context_elem.as_ref().expect("no context element"); let elem_name = self.sink.elem_name(elem); @@ -246,7 +249,7 @@ where local_name!("script") => tok_state::RawData(tok_state::ScriptData), local_name!("noscript") => { - if self.opts.scripting_enabled { + if context_element_allows_scripting { tok_state::RawData(tok_state::Rawtext) } else { tok_state::Data diff --git a/rcdom/Cargo.toml b/rcdom/Cargo.toml index 1b9815a4..bcac05fd 100644 --- a/rcdom/Cargo.toml +++ b/rcdom/Cargo.toml @@ -16,7 +16,7 @@ path = "lib.rs" [dependencies] tendril = "0.4" -html5ever = { version = "0.32", path = "../html5ever" } +html5ever = { version = "0.33", path = "../html5ever" } markup5ever = { version = "0.16", path = "../markup5ever" } xml5ever = { version = "0.23", path = "../xml5ever" } diff --git a/rcdom/tests/html-serializer.rs b/rcdom/tests/html-serializer.rs index 720fc6f1..b9f9f855 100644 --- a/rcdom/tests/html-serializer.rs +++ b/rcdom/tests/html-serializer.rs @@ -94,6 +94,7 @@ fn parse_and_serialize(input: StrTendril) -> StrTendril { ParseOpts::default(), QualName::new(None, ns!(html), local_name!("body")), vec![], + true, ) .one(input); let inner: SerializableHandle = dom.document.children.borrow()[0].clone().into(); @@ -252,6 +253,7 @@ fn deep_tree() { ParseOpts::default(), QualName::new(None, ns!(html), local_name!("div")), vec![], + true, ); let src = "".repeat(60_000); let dom = parser.one(src); diff --git a/rcdom/tests/html-tree-builder.rs b/rcdom/tests/html-tree-builder.rs index 510ec00d..0ba6d086 100644 --- a/rcdom/tests/html-tree-builder.rs +++ b/rcdom/tests/html-tree-builder.rs @@ -225,7 +225,7 @@ fn make_test_desc_with_scripting_flag( } }, Some(ref context) => { - let dom = parse_fragment(RcDom::default(), opts, context.clone(), vec![]) + let dom = parse_fragment(RcDom::default(), opts, context.clone(), vec![], true) .one(data.clone()); // fragment case: serialize children of the html element // rather than children of the document