From 2ef143745753d3600b6135e7ecdee7c603799d71 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Fri, 3 Jun 2016 01:26:01 +0200 Subject: [PATCH 1/2] Replace HTMLScriptElement::mark_script_already_started by set_script_already_started --- components/script/dom/htmlscriptelement.rs | 6 +++--- components/script/parse/html.rs | 2 +- components/script/parse/xml.rs | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index edd2152844e3..ec212affa616 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -538,8 +538,8 @@ impl HTMLScriptElement { is_js } - pub fn mark_already_started(&self) { - self.already_started.set(true); + pub fn set_already_started(&self, already_started: bool) { + self.already_started.set(already_started); } fn dispatch_event(&self, @@ -599,7 +599,7 @@ impl VirtualMethods for HTMLScriptElement { // https://html.spec.whatwg.org/multipage/#already-started if self.already_started.get() { - copy.downcast::().unwrap().mark_already_started(); + copy.downcast::().unwrap().set_already_started(true); } } } diff --git a/components/script/parse/html.rs b/components/script/parse/html.rs index a16f35a77144..87aa7a6b2938 100644 --- a/components/script/parse/html.rs +++ b/components/script/parse/html.rs @@ -150,7 +150,7 @@ impl<'a> TreeSink for servohtmlparser::Sink { fn mark_script_already_started(&mut self, node: JS) { let script = node.downcast::(); - script.map(|script| script.mark_already_started()); + script.map(|script| script.set_already_started(true)); } fn complete_script(&mut self, node: JS) -> NextParserState { diff --git a/components/script/parse/xml.rs b/components/script/parse/xml.rs index 3dd0f89f03d2..ee0959d04ef8 100644 --- a/components/script/parse/xml.rs +++ b/components/script/parse/xml.rs @@ -107,7 +107,7 @@ impl<'a> TreeSink for servoxmlparser::Sink { fn mark_script_already_started(&mut self, node: Self::Handle) { let script = node.downcast::(); if let Some(script) = script { - script.mark_already_started(); + script.set_already_started(true); } } From 5ab7f54762bade4d5c67dca0103f8f9b115baa30 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Sun, 29 May 2016 03:28:37 +0200 Subject: [PATCH 2/2] Implement Range::createContextualFragment --- components/script/dom/element.rs | 1 - components/script/dom/range.rs | 41 +++++++++++++++++++ components/script/dom/webidls/Range.webidl | 6 +-- .../createContextualFragment.html.ini | 24 ----------- .../load-events-networkState.html.ini | 2 +- ...nt-handler-attributes-body-window.html.ini | 1 + .../Opera/script_scheduling/119.html.ini | 5 --- .../conformance/quickCheckAPI-G_I.html.ini | 1 - .../copy-tex-image-2d-formats.html.ini | 5 +++ .../textures/texture-npot-video.html.ini | 1 - .../textures/texture-npot.html.ini | 2 +- .../uniforms/uniform-default-values.html.ini | 1 - 12 files changed, 52 insertions(+), 38 deletions(-) delete mode 100644 tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/119.html.ini diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 2d92c5995e39..e99e31fe4934 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -130,7 +130,6 @@ impl Element { create_element(name, prefix, document, creator) } - pub fn new_inherited(local_name: Atom, namespace: Namespace, prefix: Option, document: &Document) -> Element { diff --git a/components/script/dom/range.rs b/components/script/dom/range.rs index 93e2d4606bc8..bde5515238b2 100644 --- a/components/script/dom/range.rs +++ b/components/script/dom/range.rs @@ -22,6 +22,9 @@ use dom::bindings::weakref::{WeakRef, WeakRefVec}; use dom::characterdata::CharacterData; use dom::document::Document; use dom::documentfragment::DocumentFragment; +use dom::element::Element; +use dom::htmlbodyelement::HTMLBodyElement; +use dom::htmlscriptelement::HTMLScriptElement; use dom::node::{Node, UnbindContext}; use dom::text::Text; use heapsize::HeapSizeOf; @@ -893,6 +896,44 @@ impl RangeMethods for Range { // Step 6. s } + + // https://dvcs.w3.org/hg/innerhtml/raw-file/tip/index.html#extensions-to-the-range-interface + fn CreateContextualFragment(&self, fragment: DOMString) -> Fallible> { + // Step 1. + let node = self.StartContainer(); + let element = match node.type_id() { + NodeTypeId::Document(_) | NodeTypeId::DocumentFragment => None, + NodeTypeId::Element(_) => Some(node), + NodeTypeId::CharacterData(CharacterDataTypeId::Comment) | + NodeTypeId::CharacterData(CharacterDataTypeId::Text) => node.GetParentNode(), + NodeTypeId::CharacterData(CharacterDataTypeId::ProcessingInstruction) | + NodeTypeId::DocumentType => unreachable!(), + }; + + // Step 2. + let should_create_body = element.as_ref().map_or(true, |elem| { + let elem = elem.downcast::().unwrap(); + elem.local_name() == &atom!("html") && elem.html_element_in_html_document() + }); + let element: Root = if should_create_body { + Root::upcast(HTMLBodyElement::new(atom!("body"), None, &self.StartContainer().owner_doc())) + } else { + Root::upcast(element.unwrap()) + }; + + // Step 3. + let fragment_node = try!(element.parse_fragment(fragment)); + + // Step 4. + for node in fragment_node.upcast::().traverse_preorder() { + if let Some(script) = node.downcast::() { + script.set_already_started(false); + } + } + + // Step 5. + Ok(fragment_node) + } } #[derive(JSTraceable)] diff --git a/components/script/dom/webidls/Range.webidl b/components/script/dom/webidls/Range.webidl index 1b49656378e7..b4d5303ab2f1 100644 --- a/components/script/dom/webidls/Range.webidl +++ b/components/script/dom/webidls/Range.webidl @@ -76,9 +76,9 @@ interface Range { // https://dvcs.w3.org/hg/innerhtml/raw-file/tip/index.html#extensions-to-the-range-interface partial interface Range { - // [NewObject, Throws] - // DocumentFragment createContextualFragment(DOMString fragment); -};// + [NewObject, Throws] + DocumentFragment createContextualFragment(DOMString fragment); +}; // http://dev.w3.org/csswg/cssom-view/#extensions-to-the-range-interface partial interface Range { diff --git a/tests/wpt/metadata/domparsing/createContextualFragment.html.ini b/tests/wpt/metadata/domparsing/createContextualFragment.html.ini index 3425974106cf..7e563a9b869a 100644 --- a/tests/wpt/metadata/domparsing/createContextualFragment.html.ini +++ b/tests/wpt/metadata/domparsing/createContextualFragment.html.ini @@ -1,35 +1,11 @@ [createContextualFragment.html] type: testharness - [Must not throw INVALID_STATE_ERR for a detached node.] - expected: FAIL - - [Simple test with paragraphs] - expected: FAIL - - [Don't auto-create when applied to ] - expected: FAIL - [