From 438d121cd8cb3dbe26c3a2589a5d924d7e3cedff Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Sat, 12 Oct 2013 11:39:44 +0200 Subject: [PATCH 1/2] Implement DocumentFragment. --- src/components/main/layout/box_builder.rs | 5 +++- .../script/dom/bindings/codegen/Bindings.conf | 15 +++++++--- .../dom/bindings/codegen/Document.webidl | 4 +-- .../bindings/codegen/DocumentFragment.webidl | 9 ++++++ src/components/script/dom/bindings/element.rs | 3 ++ src/components/script/dom/bindings/node.rs | 7 +++-- src/components/script/dom/document.rs | 7 +++++ src/components/script/dom/documentfragment.rs | 28 +++++++++++++++++++ src/components/script/dom/node.rs | 14 ++++++---- src/components/script/script.rc | 1 + 10 files changed, 78 insertions(+), 15 deletions(-) create mode 100644 src/components/script/dom/bindings/codegen/DocumentFragment.webidl create mode 100644 src/components/script/dom/documentfragment.rs 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') addHTMLElement('DocumentType', concrete='DocumentType') 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, DocumentFragmentBinding::Wrap) +generate_binding_object_node!(DocumentFragment) +generate_traceable_node!(DocumentFragment) generate_cacheable_wrapper_node!(DocumentType, DocumentTypeBinding::Wrap) generate_binding_object_node!(DocumentType) generate_traceable_node!(DocumentType) 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) -> *JSObject ElementNodeTypeId(HTMLUnknownElementTypeId) => generate_element!(HTMLUnknownElement), CommentNodeTypeId => generate_element!(Comment), DoctypeNodeTypeId => generate_element!(DocumentType), - TextNodeTypeId => generate_element!(Text) - } + DocumentFragmentNodeTypeId => generate_element!(DocumentFragment), + TextNodeTypeId => generate_element!(Text), + } } impl Reflectable for AbstractNode { 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 { + 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 { 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 { + node: Node, +} + +impl DocumentFragment { + /// Creates a new DocumentFragment. + pub fn new(document: AbstractDocument) -> DocumentFragment { + DocumentFragment { + node: Node::new(DocumentFragmentNodeTypeId, document), + } + } + + pub fn Constructor(owner: @mut Window) -> Fallible> { + 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 { #[deriving(Eq)] pub enum NodeTypeId { DoctypeNodeTypeId, + DocumentFragmentNodeTypeId, CommentNodeTypeId, ElementNodeTypeId(ElementTypeId), TextNodeTypeId, @@ -531,7 +532,8 @@ impl Node { ElementNodeTypeId(_) => 1, TextNodeTypeId => 3, CommentNodeTypeId => 8, - DoctypeNodeTypeId => 10 + DoctypeNodeTypeId => 10, + DocumentFragmentNodeTypeId => 11, } } @@ -548,7 +550,8 @@ impl Node { do abstract_self.with_imm_doctype |doctype| { doctype.name.clone() } - } + }, + DocumentFragmentNodeTypeId => ~"#document-fragment", }) } @@ -561,7 +564,8 @@ impl Node { ElementNodeTypeId(*) | CommentNodeTypeId | TextNodeTypeId | - DoctypeNodeTypeId => Some(self.owner_doc), + DoctypeNodeTypeId | + DocumentFragmentNodeTypeId => Some(self.owner_doc), // DocumentNodeTypeId => None } } @@ -614,7 +618,7 @@ impl Node { pub fn GetTextContent(&self, abstract_self: AbstractNode) -> 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 { _ => 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; From f4edbb6b2eeed0555ec6acab6867a5cdf8a1c610 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Sat, 12 Oct 2013 16:08:45 +0200 Subject: [PATCH 2/2] Remove some type variables and an explicit dereference. --- .../script/dom/bindings/codegen/Bindings.conf | 2 +- src/components/script/dom/bindings/element.rs | 6 +++--- src/components/script/dom/bindings/node.rs | 2 +- src/components/script/dom/documentfragment.rs | 10 +++++----- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/components/script/dom/bindings/codegen/Bindings.conf b/src/components/script/dom/bindings/codegen/Bindings.conf index 69ab8b0d50f..6b79b533b66 100644 --- a/src/components/script/dom/bindings/codegen/Bindings.conf +++ b/src/components/script/dom/bindings/codegen/Bindings.conf @@ -574,7 +574,7 @@ def addHTMLElement(element, concrete=None, needsAbstract=[]): } addHTMLElement('Comment') -addHTMLElement('DocumentFragment', concrete='DocumentFragment') +addHTMLElement('DocumentFragment', concrete='DocumentFragment') addHTMLElement('DocumentType', concrete='DocumentType') addHTMLElement('Text') diff --git a/src/components/script/dom/bindings/element.rs b/src/components/script/dom/bindings/element.rs index ff1feb1daa1..4c02afa4900 100644 --- a/src/components/script/dom/bindings/element.rs +++ b/src/components/script/dom/bindings/element.rs @@ -129,9 +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, DocumentFragmentBinding::Wrap) -generate_binding_object_node!(DocumentFragment) -generate_traceable_node!(DocumentFragment) +generate_cacheable_wrapper_node!(DocumentFragment, DocumentFragmentBinding::Wrap) +generate_binding_object_node!(DocumentFragment) +generate_traceable_node!(DocumentFragment) generate_cacheable_wrapper_node!(DocumentType, DocumentTypeBinding::Wrap) generate_binding_object_node!(DocumentType) generate_traceable_node!(DocumentType) diff --git a/src/components/script/dom/bindings/node.rs b/src/components/script/dom/bindings/node.rs index fe027ad4d6a..f5fdd19db4c 100644 --- a/src/components/script/dom/bindings/node.rs +++ b/src/components/script/dom/bindings/node.rs @@ -91,7 +91,7 @@ pub fn create(cx: *JSContext, node: &mut AbstractNode) -> *JSObject ElementNodeTypeId(HTMLUnknownElementTypeId) => generate_element!(HTMLUnknownElement), CommentNodeTypeId => generate_element!(Comment), DoctypeNodeTypeId => generate_element!(DocumentType), - DocumentFragmentNodeTypeId => generate_element!(DocumentFragment), + DocumentFragmentNodeTypeId => generate_element!(DocumentFragment), TextNodeTypeId => generate_element!(Text), } } diff --git a/src/components/script/dom/documentfragment.rs b/src/components/script/dom/documentfragment.rs index d207c340369..8183f620e66 100644 --- a/src/components/script/dom/documentfragment.rs +++ b/src/components/script/dom/documentfragment.rs @@ -8,20 +8,20 @@ use dom::node::{ScriptView, Node, DocumentFragmentNodeTypeId}; use dom::node::{AbstractNode}; use dom::window::Window; -pub struct DocumentFragment { - node: Node, +pub struct DocumentFragment { + node: Node, } -impl DocumentFragment { +impl DocumentFragment { /// Creates a new DocumentFragment. - pub fn new(document: AbstractDocument) -> DocumentFragment { + pub fn new(document: AbstractDocument) -> DocumentFragment { DocumentFragment { node: Node::new(DocumentFragmentNodeTypeId, document), } } pub fn Constructor(owner: @mut Window) -> Fallible> { - let cx = (*owner.page).js_info.get_ref().js_compartment.cx.ptr; + 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) }) }