Implement Range::createContextualFragment

This commit is contained in:
Guillaume Gomez 2016-05-29 03:28:37 +02:00
parent 2ef1437457
commit 5ab7f54762
12 changed files with 52 additions and 38 deletions

View file

@ -130,7 +130,6 @@ impl Element {
create_element(name, prefix, document, creator)
}
pub fn new_inherited(local_name: Atom,
namespace: Namespace, prefix: Option<DOMString>,
document: &Document) -> Element {

View file

@ -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<Root<DocumentFragment>> {
// 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::<Element>().unwrap();
elem.local_name() == &atom!("html") && elem.html_element_in_html_document()
});
let element: Root<Node> = 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::<Node>().traverse_preorder() {
if let Some(script) = node.downcast::<HTMLScriptElement>() {
script.set_already_started(false);
}
}
// Step 5.
Ok(fragment_node)
}
}
#[derive(JSTraceable)]

View file

@ -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 {