diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 2d92c5995e3..e99e31fe493 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 93e2d4606bc..bde5515238b 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 1b49656378e..b4d5303ab2f 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 3425974106c..7e563a9b869 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 - [