aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMs2ger <ms2ger@gmail.com>2013-10-12 11:39:44 +0200
committerMs2ger <ms2ger@gmail.com>2013-10-12 15:14:09 +0200
commit438d121cd8cb3dbe26c3a2589a5d924d7e3cedff (patch)
treef67cdf6ce5fc0be4a9d1127c65cdae4ffa25a8c8
parentfc9fdf30a6b4b4437cfe7a624c52c9a8b5e5a645 (diff)
downloadservo-438d121cd8cb3dbe26c3a2589a5d924d7e3cedff.tar.gz
servo-438d121cd8cb3dbe26c3a2589a5d924d7e3cedff.zip
Implement DocumentFragment.
-rw-r--r--src/components/main/layout/box_builder.rs5
-rw-r--r--src/components/script/dom/bindings/codegen/Bindings.conf15
-rw-r--r--src/components/script/dom/bindings/codegen/Document.webidl4
-rw-r--r--src/components/script/dom/bindings/codegen/DocumentFragment.webidl9
-rw-r--r--src/components/script/dom/bindings/element.rs3
-rw-r--r--src/components/script/dom/bindings/node.rs7
-rw-r--r--src/components/script/dom/document.rs7
-rw-r--r--src/components/script/dom/documentfragment.rs28
-rw-r--r--src/components/script/dom/node.rs14
-rw-r--r--src/components/script/script.rc1
10 files changed, 78 insertions, 15 deletions
diff --git a/src/components/main/layout/box_builder.rs b/src/components/main/layout/box_builder.rs
index 9c8ba66d8a4..950370f06cb 100644
--- a/src/components/main/layout/box_builder.rs
+++ b/src/components/main/layout/box_builder.rs
@@ -27,6 +27,7 @@ use newcss::values::{CSSFloatNone, CSSFloatLeft, CSSFloatRight};
use layout::float_context::{FloatLeft, FloatRight};
use script::dom::node::{AbstractNode, CommentNodeTypeId, DoctypeNodeTypeId};
use script::dom::node::{ElementNodeTypeId, LayoutView, TextNodeTypeId};
+use script::dom::node::DocumentFragmentNodeTypeId;
use servo_util::range::Range;
use servo_util::tree::{TreeNodeRef, TreeNode};
use std::cell::Cell;
@@ -398,7 +399,9 @@ impl LayoutTreeBuilder {
ElementNodeTypeId(_) => CSSDisplayInline,
TextNodeTypeId => CSSDisplayInline,
- DoctypeNodeTypeId | CommentNodeTypeId => return NoGenerator,
+ DoctypeNodeTypeId |
+ DocumentFragmentNodeTypeId |
+ CommentNodeTypeId => return NoGenerator,
}
};
diff --git a/src/components/script/dom/bindings/codegen/Bindings.conf b/src/components/script/dom/bindings/codegen/Bindings.conf
index 7fb32fec79a..69ab8b0d50f 100644
--- a/src/components/script/dom/bindings/codegen/Bindings.conf
+++ b/src/components/script/dom/bindings/codegen/Bindings.conf
@@ -141,10 +141,16 @@ DOMInterfaces = {
},
'Document': {
- 'nativeType': 'AbstractDocument',
- 'pointerType': '',
- 'customTrace': 'trace',
- 'needsAbstract': ['title', 'createElement', 'createTextNode', 'createComment'],
+ 'nativeType': 'AbstractDocument',
+ 'pointerType': '',
+ 'customTrace': 'trace',
+ 'needsAbstract': [
+ 'createComment',
+ 'createDocumentFragment',
+ 'createElement',
+ 'createTextNode',
+ 'title',
+ ],
},
'DOMParser': {
@@ -568,6 +574,7 @@ def addHTMLElement(element, concrete=None, needsAbstract=[]):
}
addHTMLElement('Comment')
+addHTMLElement('DocumentFragment', concrete='DocumentFragment<ScriptView>')
addHTMLElement('DocumentType', concrete='DocumentType<ScriptView>')
addHTMLElement('Text')
diff --git a/src/components/script/dom/bindings/codegen/Document.webidl b/src/components/script/dom/bindings/codegen/Document.webidl
index 74670752422..cecb365c50c 100644
--- a/src/components/script/dom/bindings/codegen/Document.webidl
+++ b/src/components/script/dom/bindings/codegen/Document.webidl
@@ -44,8 +44,8 @@ interface Document /*: Node*/ { //XXXjdm Requires servo/#623
Element createElement(DOMString localName);
[Creator, Throws]
Element createElementNS(DOMString? namespace, DOMString qualifiedName);
- /*[Creator]
- DocumentFragment createDocumentFragment();*/
+ [Creator]
+ DocumentFragment createDocumentFragment();
[Creator]
Text createTextNode(DOMString data);
[Creator]
diff --git a/src/components/script/dom/bindings/codegen/DocumentFragment.webidl b/src/components/script/dom/bindings/codegen/DocumentFragment.webidl
new file mode 100644
index 00000000000..9afc55e4aa1
--- /dev/null
+++ b/src/components/script/dom/bindings/codegen/DocumentFragment.webidl
@@ -0,0 +1,9 @@
+/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// http://dom.spec.whatwg.org/#interface-documentfragment
+[Constructor]
+interface DocumentFragment : Node {
+};
diff --git a/src/components/script/dom/bindings/element.rs b/src/components/script/dom/bindings/element.rs
index d20573ecae9..ff1feb1daa1 100644
--- a/src/components/script/dom/bindings/element.rs
+++ b/src/components/script/dom/bindings/element.rs
@@ -129,6 +129,9 @@ macro_rules! generate_traceable_node(
generate_cacheable_wrapper!(Comment, CommentBinding::Wrap)
generate_binding_object!(Comment)
generate_traceable!(Comment)
+generate_cacheable_wrapper_node!(DocumentFragment<ScriptView>, DocumentFragmentBinding::Wrap)
+generate_binding_object_node!(DocumentFragment<ScriptView>)
+generate_traceable_node!(DocumentFragment<ScriptView>)
generate_cacheable_wrapper_node!(DocumentType<ScriptView>, DocumentTypeBinding::Wrap)
generate_binding_object_node!(DocumentType<ScriptView>)
generate_traceable_node!(DocumentType<ScriptView>)
diff --git a/src/components/script/dom/bindings/node.rs b/src/components/script/dom/bindings/node.rs
index d1f60eb21e8..fe027ad4d6a 100644
--- a/src/components/script/dom/bindings/node.rs
+++ b/src/components/script/dom/bindings/node.rs
@@ -6,7 +6,7 @@ use dom::bindings::utils::{Reflectable, Reflector, Traceable};
use dom::element::*;
use dom::types::*;
use dom::node::{AbstractNode, ElementNodeTypeId, TextNodeTypeId, CommentNodeTypeId};
-use dom::node::{DoctypeNodeTypeId, ScriptView};
+use dom::node::{DoctypeNodeTypeId, DocumentFragmentNodeTypeId, ScriptView};
use std::cast;
use std::libc;
@@ -91,8 +91,9 @@ pub fn create(cx: *JSContext, node: &mut AbstractNode<ScriptView>) -> *JSObject
ElementNodeTypeId(HTMLUnknownElementTypeId) => generate_element!(HTMLUnknownElement),
CommentNodeTypeId => generate_element!(Comment),
DoctypeNodeTypeId => generate_element!(DocumentType<ScriptView>),
- TextNodeTypeId => generate_element!(Text)
- }
+ DocumentFragmentNodeTypeId => generate_element!(DocumentFragment<ScriptView>),
+ TextNodeTypeId => generate_element!(Text),
+ }
}
impl Reflectable for AbstractNode<ScriptView> {
diff --git a/src/components/script/dom/document.rs b/src/components/script/dom/document.rs
index a8c417b986b..c9de3b30567 100644
--- a/src/components/script/dom/document.rs
+++ b/src/components/script/dom/document.rs
@@ -7,6 +7,7 @@ use dom::bindings::codegen::DocumentBinding;
use dom::bindings::utils::{DOMString, Reflector, ErrorResult, Fallible};
use dom::bindings::utils::{BindingObject, Reflectable, DerivedWrapper};
use dom::bindings::utils::{is_valid_element_name, InvalidCharacter, Traceable, null_str_as_empty, null_str_as_word_null};
+use dom::documentfragment::DocumentFragment;
use dom::element::{Element};
use dom::element::{HTMLHtmlElementTypeId, HTMLHeadElementTypeId, HTMLTitleElementTypeId};
use dom::event::Event;
@@ -283,6 +284,12 @@ impl Document {
fail!("stub")
}
+ pub fn CreateDocumentFragment(&self, abstract_self: AbstractDocument) -> AbstractNode<ScriptView> {
+ let cx = self.get_cx();
+ let fragment = @DocumentFragment::new(abstract_self);
+ unsafe { Node::as_abstract_node(cx, fragment) }
+ }
+
pub fn CreateTextNode(&self, abstract_self: AbstractDocument, data: &DOMString) -> AbstractNode<ScriptView> {
let cx = self.get_cx();
let text = @Text::new(null_str_as_empty(data), abstract_self);
diff --git a/src/components/script/dom/documentfragment.rs b/src/components/script/dom/documentfragment.rs
new file mode 100644
index 00000000000..d207c340369
--- /dev/null
+++ b/src/components/script/dom/documentfragment.rs
@@ -0,0 +1,28 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+use dom::bindings::utils::Fallible;
+use dom::document::AbstractDocument;
+use dom::node::{ScriptView, Node, DocumentFragmentNodeTypeId};
+use dom::node::{AbstractNode};
+use dom::window::Window;
+
+pub struct DocumentFragment<View> {
+ node: Node<View>,
+}
+
+impl DocumentFragment<ScriptView> {
+ /// Creates a new DocumentFragment.
+ pub fn new(document: AbstractDocument) -> DocumentFragment<ScriptView> {
+ DocumentFragment {
+ node: Node::new(DocumentFragmentNodeTypeId, document),
+ }
+ }
+
+ pub fn Constructor(owner: @mut Window) -> Fallible<AbstractNode<ScriptView>> {
+ let cx = (*owner.page).js_info.get_ref().js_compartment.cx.ptr;
+ let fragment = @DocumentFragment::new(owner.Document());
+ Ok(unsafe { Node::as_abstract_node(cx, fragment) })
+ }
+}
diff --git a/src/components/script/dom/node.rs b/src/components/script/dom/node.rs
index 46ddc57ec36..05f892c7320 100644
--- a/src/components/script/dom/node.rs
+++ b/src/components/script/dom/node.rs
@@ -101,6 +101,7 @@ pub struct Node<View> {
#[deriving(Eq)]
pub enum NodeTypeId {
DoctypeNodeTypeId,
+ DocumentFragmentNodeTypeId,
CommentNodeTypeId,
ElementNodeTypeId(ElementTypeId),
TextNodeTypeId,
@@ -531,7 +532,8 @@ impl Node<ScriptView> {
ElementNodeTypeId(_) => 1,
TextNodeTypeId => 3,
CommentNodeTypeId => 8,
- DoctypeNodeTypeId => 10
+ DoctypeNodeTypeId => 10,
+ DocumentFragmentNodeTypeId => 11,
}
}
@@ -548,7 +550,8 @@ impl Node<ScriptView> {
do abstract_self.with_imm_doctype |doctype| {
doctype.name.clone()
}
- }
+ },
+ DocumentFragmentNodeTypeId => ~"#document-fragment",
})
}
@@ -561,7 +564,8 @@ impl Node<ScriptView> {
ElementNodeTypeId(*) |
CommentNodeTypeId |
TextNodeTypeId |
- DoctypeNodeTypeId => Some(self.owner_doc),
+ DoctypeNodeTypeId |
+ DocumentFragmentNodeTypeId => Some(self.owner_doc),
// DocumentNodeTypeId => None
}
}
@@ -614,7 +618,7 @@ impl Node<ScriptView> {
pub fn GetTextContent(&self, abstract_self: AbstractNode<ScriptView>) -> DOMString {
match self.type_id {
- ElementNodeTypeId(*) => {
+ DocumentFragmentNodeTypeId | ElementNodeTypeId(*) => {
let mut content = ~"";
for node in abstract_self.traverse_preorder() {
if node.is_text() {
@@ -679,7 +683,7 @@ impl Node<ScriptView> {
_ => false
};
match self.type_id {
- ElementNodeTypeId(*) => {
+ DocumentFragmentNodeTypeId | ElementNodeTypeId(*) => {
let node = if is_empty {
None
} else {
diff --git a/src/components/script/script.rc b/src/components/script/script.rc
index 42d2d031b52..fd76c0e975e 100644
--- a/src/components/script/script.rc
+++ b/src/components/script/script.rc
@@ -50,6 +50,7 @@ pub mod dom {
pub mod clientrectlist;
pub mod comment;
pub mod document;
+ pub mod documentfragment;
pub mod documenttype;
pub mod domparser;
pub mod element;