From 5ab7f54762bade4d5c67dca0103f8f9b115baa30 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Sun, 29 May 2016 03:28:37 +0200 Subject: [PATCH] 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 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 - [