diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/components/script/dom/bindings/node.rs | 92 | ||||
-rw-r--r-- | src/components/script/dom/bindings/utils.rs | 12 | ||||
-rw-r--r-- | src/components/script/dom/comment.rs | 14 | ||||
-rw-r--r-- | src/components/script/dom/document.rs | 12 | ||||
-rw-r--r-- | src/components/script/dom/documentfragment.rs | 14 | ||||
-rw-r--r-- | src/components/script/dom/documenttype.rs | 29 | ||||
-rw-r--r-- | src/components/script/dom/node.rs | 10 | ||||
-rw-r--r-- | src/components/script/dom/text.rs | 13 | ||||
-rw-r--r-- | src/components/script/html/hubbub_html_parser.rs | 24 |
9 files changed, 67 insertions, 153 deletions
diff --git a/src/components/script/dom/bindings/node.rs b/src/components/script/dom/bindings/node.rs index 09f17770c56..0ec5b13e80b 100644 --- a/src/components/script/dom/bindings/node.rs +++ b/src/components/script/dom/bindings/node.rs @@ -3,11 +3,8 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use dom::bindings::utils::{Reflectable, Reflector, Traceable}; -use dom::document::{PlainDocumentTypeId, HTMLDocumentTypeId}; -use dom::element::*; use dom::types::*; -use dom::node::{AbstractNode, ElementNodeTypeId, TextNodeTypeId, CommentNodeTypeId}; -use dom::node::{DoctypeNodeTypeId, DocumentFragmentNodeTypeId, ScriptView, DocumentNodeTypeId}; +use dom::node::{AbstractNode, ScriptView}; use std::cast; use std::libc; @@ -15,93 +12,6 @@ use std::ptr; use js::jsapi::{JSContext, JSObject, JSTracer, JSTRACE_OBJECT, JS_CallTracer}; use servo_util::tree::TreeNodeRef; -macro_rules! generate_element( - ($name: path) => ({ - let node: @mut $name = unsafe { cast::transmute(node.raw_object()) }; - node.wrap_object_shared(cx, ptr::null()) - }) -) - -pub fn create(cx: *JSContext, node: &mut AbstractNode<ScriptView>) -> *JSObject { - match node.type_id() { - ElementNodeTypeId(HTMLElementTypeId) => generate_element!(HTMLElement), - ElementNodeTypeId(HTMLAnchorElementTypeId) => generate_element!(HTMLAnchorElement), - ElementNodeTypeId(HTMLAppletElementTypeId) => generate_element!(HTMLAppletElement), - ElementNodeTypeId(HTMLAreaElementTypeId) => generate_element!(HTMLAreaElement), - ElementNodeTypeId(HTMLAudioElementTypeId) => generate_element!(HTMLAudioElement), - ElementNodeTypeId(HTMLBaseElementTypeId) => generate_element!(HTMLBaseElement), - ElementNodeTypeId(HTMLBodyElementTypeId) => generate_element!(HTMLBodyElement), - ElementNodeTypeId(HTMLBRElementTypeId) => generate_element!(HTMLBRElement), - ElementNodeTypeId(HTMLButtonElementTypeId) => generate_element!(HTMLButtonElement), - ElementNodeTypeId(HTMLCanvasElementTypeId) => generate_element!(HTMLCanvasElement), - ElementNodeTypeId(HTMLDataElementTypeId) => generate_element!(HTMLDataElement), - ElementNodeTypeId(HTMLDataListElementTypeId) => generate_element!(HTMLDataListElement), - ElementNodeTypeId(HTMLDirectoryElementTypeId) => generate_element!(HTMLDirectoryElement), - ElementNodeTypeId(HTMLDListElementTypeId) => generate_element!(HTMLDListElement), - ElementNodeTypeId(HTMLDivElementTypeId) => generate_element!(HTMLDivElement), - ElementNodeTypeId(HTMLEmbedElementTypeId) => generate_element!(HTMLEmbedElement), - ElementNodeTypeId(HTMLFieldSetElementTypeId) => generate_element!(HTMLFieldSetElement), - ElementNodeTypeId(HTMLFontElementTypeId) => generate_element!(HTMLFontElement), - ElementNodeTypeId(HTMLFormElementTypeId) => generate_element!(HTMLFormElement), - ElementNodeTypeId(HTMLFrameElementTypeId) => generate_element!(HTMLFrameElement), - ElementNodeTypeId(HTMLFrameSetElementTypeId) => generate_element!(HTMLFrameSetElement), - ElementNodeTypeId(HTMLHeadElementTypeId) => generate_element!(HTMLHeadElement), - ElementNodeTypeId(HTMLHeadingElementTypeId) => generate_element!(HTMLHeadingElement), - ElementNodeTypeId(HTMLHRElementTypeId) => generate_element!(HTMLHRElement), - ElementNodeTypeId(HTMLHtmlElementTypeId) => generate_element!(HTMLHtmlElement), - ElementNodeTypeId(HTMLIframeElementTypeId) => generate_element!(HTMLIFrameElement), - ElementNodeTypeId(HTMLImageElementTypeId) => generate_element!(HTMLImageElement), - ElementNodeTypeId(HTMLInputElementTypeId) => generate_element!(HTMLInputElement), - ElementNodeTypeId(HTMLLabelElementTypeId) => generate_element!(HTMLLabelElement), - ElementNodeTypeId(HTMLLegendElementTypeId) => generate_element!(HTMLLegendElement), - ElementNodeTypeId(HTMLLIElementTypeId) => generate_element!(HTMLLIElement), - ElementNodeTypeId(HTMLLinkElementTypeId) => generate_element!(HTMLLinkElement), - ElementNodeTypeId(HTMLMainElementTypeId) => generate_element!(HTMLMainElement), - ElementNodeTypeId(HTMLMapElementTypeId) => generate_element!(HTMLMapElement), - ElementNodeTypeId(HTMLMediaElementTypeId) => generate_element!(HTMLMediaElement), - ElementNodeTypeId(HTMLMetaElementTypeId) => generate_element!(HTMLMetaElement), - ElementNodeTypeId(HTMLMeterElementTypeId) => generate_element!(HTMLMeterElement), - ElementNodeTypeId(HTMLModElementTypeId) => generate_element!(HTMLModElement), - ElementNodeTypeId(HTMLObjectElementTypeId) => generate_element!(HTMLObjectElement), - ElementNodeTypeId(HTMLOListElementTypeId) => generate_element!(HTMLOListElement), - ElementNodeTypeId(HTMLOptGroupElementTypeId) => generate_element!(HTMLOptGroupElement), - ElementNodeTypeId(HTMLOptionElementTypeId) => generate_element!(HTMLOptionElement), - ElementNodeTypeId(HTMLOutputElementTypeId) => generate_element!(HTMLOutputElement), - ElementNodeTypeId(HTMLParagraphElementTypeId) => generate_element!(HTMLParagraphElement), - ElementNodeTypeId(HTMLParamElementTypeId) => generate_element!(HTMLParamElement), - ElementNodeTypeId(HTMLPreElementTypeId) => generate_element!(HTMLPreElement), - ElementNodeTypeId(HTMLProgressElementTypeId) => generate_element!(HTMLProgressElement), - ElementNodeTypeId(HTMLQuoteElementTypeId) => generate_element!(HTMLQuoteElement), - ElementNodeTypeId(HTMLScriptElementTypeId) => generate_element!(HTMLScriptElement), - ElementNodeTypeId(HTMLSelectElementTypeId) => generate_element!(HTMLSelectElement), - ElementNodeTypeId(HTMLSourceElementTypeId) => generate_element!(HTMLSourceElement), - ElementNodeTypeId(HTMLSpanElementTypeId) => generate_element!(HTMLSpanElement), - ElementNodeTypeId(HTMLStyleElementTypeId) => generate_element!(HTMLStyleElement), - ElementNodeTypeId(HTMLTableElementTypeId) => generate_element!(HTMLTableElement), - ElementNodeTypeId(HTMLTableCellElementTypeId) => generate_element!(HTMLTableCellElement), - ElementNodeTypeId(HTMLTableDataCellElementTypeId) => generate_element!(HTMLTableDataCellElement), - ElementNodeTypeId(HTMLTableHeaderCellElementTypeId) => generate_element!(HTMLTableHeaderCellElement), - ElementNodeTypeId(HTMLTableCaptionElementTypeId) => generate_element!(HTMLTableCaptionElement), - ElementNodeTypeId(HTMLTableColElementTypeId) => generate_element!(HTMLTableColElement), - ElementNodeTypeId(HTMLTableRowElementTypeId) => generate_element!(HTMLTableRowElement), - ElementNodeTypeId(HTMLTableSectionElementTypeId) => generate_element!(HTMLTableSectionElement), - ElementNodeTypeId(HTMLTemplateElementTypeId) => generate_element!(HTMLTemplateElement), - ElementNodeTypeId(HTMLTextAreaElementTypeId) => generate_element!(HTMLTextAreaElement), - ElementNodeTypeId(HTMLTimeElementTypeId) => generate_element!(HTMLTimeElement), - ElementNodeTypeId(HTMLTitleElementTypeId) => generate_element!(HTMLTitleElement), - ElementNodeTypeId(HTMLTrackElementTypeId) => generate_element!(HTMLTrackElement), - ElementNodeTypeId(HTMLUListElementTypeId) => generate_element!(HTMLUListElement), - ElementNodeTypeId(HTMLVideoElementTypeId) => generate_element!(HTMLVideoElement), - ElementNodeTypeId(HTMLUnknownElementTypeId) => generate_element!(HTMLUnknownElement), - CommentNodeTypeId => generate_element!(Comment), - DoctypeNodeTypeId => generate_element!(DocumentType), - DocumentFragmentNodeTypeId => generate_element!(DocumentFragment), - DocumentNodeTypeId(PlainDocumentTypeId) => generate_element!(Document), - DocumentNodeTypeId(HTMLDocumentTypeId) => generate_element!(HTMLDocument), - TextNodeTypeId => generate_element!(Text), - } -} - impl Reflectable for AbstractNode<ScriptView> { fn reflector<'a>(&'a self) -> &'a Reflector { self.node().reflector() diff --git a/src/components/script/dom/bindings/utils.rs b/src/components/script/dom/bindings/utils.rs index a97db130bb2..42f1eb7f4fc 100644 --- a/src/components/script/dom/bindings/utils.rs +++ b/src/components/script/dom/bindings/utils.rs @@ -4,7 +4,6 @@ use dom::bindings::codegen::PrototypeList; use dom::bindings::codegen::PrototypeList::MAX_PROTO_CHAIN_LENGTH; -use dom::bindings::node; use dom::window; use dom::node::{AbstractNode, ScriptView}; @@ -754,14 +753,11 @@ pub trait DerivedWrapper { impl DerivedWrapper for AbstractNode<ScriptView> { #[fixed_stack_segment] - fn wrap(&mut self, cx: *JSContext, _scope: *JSObject, vp: *mut JSVal) -> i32 { + fn wrap(&mut self, _cx: *JSContext, _scope: *JSObject, vp: *mut JSVal) -> i32 { let obj = self.reflector().get_jsobject(); - if obj.is_not_null() { - unsafe { *vp = RUST_OBJECT_TO_JSVAL(obj) }; - return 1; - } - unsafe { *vp = RUST_OBJECT_TO_JSVAL(node::create(cx, self)) }; - return 1; + assert!(obj.is_not_null()); + unsafe { *vp = RUST_OBJECT_TO_JSVAL(obj) }; + return true as i32; } } diff --git a/src/components/script/dom/comment.rs b/src/components/script/dom/comment.rs index 7d628434894..bd238af7b50 100644 --- a/src/components/script/dom/comment.rs +++ b/src/components/script/dom/comment.rs @@ -2,6 +2,7 @@ * 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::codegen::CommentBinding; use dom::bindings::utils::{DOMString, Fallible, null_str_as_empty}; use dom::characterdata::CharacterData; use dom::document::AbstractDocument; @@ -14,17 +15,18 @@ pub struct Comment { } impl Comment { - /// Creates a new HTML comment. - pub fn new(text: ~str, document: AbstractDocument) -> Comment { + pub fn new_inherited(text: ~str, document: AbstractDocument) -> Comment { Comment { element: CharacterData::new(CommentNodeTypeId, text, document) } } + pub fn new(text: ~str, document: AbstractDocument) -> AbstractNode<ScriptView> { + let node = Comment::new_inherited(text, document); + Node::reflect_node(@mut node, document, CommentBinding::Wrap) + } + pub fn Constructor(owner: @mut Window, data: &DOMString) -> Fallible<AbstractNode<ScriptView>> { - let s = null_str_as_empty(data); - let cx = owner.get_cx(); - let comment = @Comment::new(s, owner.Document()); - Ok(unsafe { Node::as_abstract_node(cx, comment) }) + Ok(Comment::new(null_str_as_empty(data), owner.Document())) } } diff --git a/src/components/script/dom/document.rs b/src/components/script/dom/document.rs index f889c5ddde2..9805ea71dfa 100644 --- a/src/components/script/dom/document.rs +++ b/src/components/script/dom/document.rs @@ -244,21 +244,15 @@ impl Document { } 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) } + DocumentFragment::new(abstract_self) } 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); - unsafe { Node::as_abstract_node(cx, text) } + Text::new(null_str_as_empty(data), abstract_self) } pub fn CreateComment(&self, abstract_self: AbstractDocument, data: &DOMString) -> AbstractNode<ScriptView> { - let cx = self.get_cx(); - let comment = @Comment::new(null_str_as_word_null(data), abstract_self); - unsafe { Node::as_abstract_node(cx, comment) } + Comment::new(null_str_as_word_null(data), abstract_self) } pub fn Title(&self, _: AbstractDocument) -> DOMString { diff --git a/src/components/script/dom/documentfragment.rs b/src/components/script/dom/documentfragment.rs index 78f3d5c84cb..d3c2beaceff 100644 --- a/src/components/script/dom/documentfragment.rs +++ b/src/components/script/dom/documentfragment.rs @@ -2,6 +2,7 @@ * 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::codegen::DocumentFragmentBinding; use dom::bindings::utils::Fallible; use dom::document::AbstractDocument; use dom::node::{ScriptView, Node, DocumentFragmentNodeTypeId}; @@ -14,15 +15,20 @@ pub struct DocumentFragment { impl DocumentFragment { /// Creates a new DocumentFragment. - pub fn new(document: AbstractDocument) -> DocumentFragment { + pub fn new_inherited(document: AbstractDocument) -> DocumentFragment { DocumentFragment { node: Node::new(DocumentFragmentNodeTypeId, document), } } + pub fn new(document: AbstractDocument) -> AbstractNode<ScriptView> { + let node = DocumentFragment::new_inherited(document); + Node::reflect_node(@mut node, document, DocumentFragmentBinding::Wrap) + } +} + +impl DocumentFragment { pub fn Constructor(owner: @mut Window) -> Fallible<AbstractNode<ScriptView>> { - let cx = owner.get_cx(); - let fragment = @DocumentFragment::new(owner.Document()); - Ok(unsafe { Node::as_abstract_node(cx, fragment) }) + Ok(DocumentFragment::new(owner.Document())) } } diff --git a/src/components/script/dom/documenttype.rs b/src/components/script/dom/documenttype.rs index 97d339f797e..463ddcfa239 100644 --- a/src/components/script/dom/documenttype.rs +++ b/src/components/script/dom/documenttype.rs @@ -2,9 +2,10 @@ * 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::codegen::DocumentTypeBinding; use dom::bindings::utils::DOMString; use dom::document::AbstractDocument; -use dom::node::{ScriptView, Node, DoctypeNodeTypeId}; +use dom::node::{AbstractNode, ScriptView, Node, DoctypeNodeTypeId}; /// The `DOCTYPE` tag. pub struct DocumentType { @@ -16,12 +17,11 @@ pub struct DocumentType { } impl DocumentType { - /// Creates a new `DOCTYPE` tag. - pub fn new(name: ~str, - public_id: Option<~str>, - system_id: Option<~str>, - force_quirks: bool, - document: AbstractDocument) + pub fn new_inherited(name: ~str, + public_id: Option<~str>, + system_id: Option<~str>, + force_quirks: bool, + document: AbstractDocument) -> DocumentType { DocumentType { node: Node::new(DoctypeNodeTypeId, document), @@ -32,6 +32,21 @@ impl DocumentType { } } + pub fn new(name: ~str, + public_id: Option<~str>, + system_id: Option<~str>, + force_quirks: bool, + document: AbstractDocument) -> AbstractNode<ScriptView> { + let documenttype = DocumentType::new_inherited(name, + public_id, + system_id, + force_quirks, + document); + Node::reflect_node(@mut documenttype, document, DocumentTypeBinding::Wrap) + } +} + +impl DocumentType { pub fn Name(&self) -> DOMString { Some(self.name.clone()) } diff --git a/src/components/script/dom/node.rs b/src/components/script/dom/node.rs index bcfe7f93373..2caa76eed69 100644 --- a/src/components/script/dom/node.rs +++ b/src/components/script/dom/node.rs @@ -4,7 +4,6 @@ //! The core DOM types. Defines the basic DOM hierarchy as well as all the HTML elements. -use dom::bindings::node; use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; use dom::bindings::utils::{DOMString, null_str_as_empty}; use dom::bindings::utils::{ErrorResult, Fallible, NotFound, HierarchyRequest}; @@ -498,15 +497,6 @@ impl<View> Node<View> { } impl Node<ScriptView> { - pub unsafe fn as_abstract_node<N>(cx: *JSContext, node: @N) -> AbstractNode<ScriptView> { - // This surrenders memory management of the node! - let mut node = AbstractNode { - obj: transmute(node), - }; - node::create(cx, &mut node); - node - } - pub fn reflect_node<N: Reflectable> (node: @mut N, document: AbstractDocument, diff --git a/src/components/script/dom/text.rs b/src/components/script/dom/text.rs index 71c538a7d6c..e0fd493d887 100644 --- a/src/components/script/dom/text.rs +++ b/src/components/script/dom/text.rs @@ -2,6 +2,7 @@ * 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::codegen::TextBinding; use dom::bindings::utils::{DOMString, Fallible, null_str_as_empty}; use dom::characterdata::CharacterData; use dom::document::AbstractDocument; @@ -14,17 +15,19 @@ pub struct Text { } impl Text { - /// Creates a new HTML text node. - pub fn new(text: ~str, document: AbstractDocument) -> Text { + pub fn new_inherited(text: ~str, document: AbstractDocument) -> Text { Text { element: CharacterData::new(TextNodeTypeId, text, document) } } + pub fn new(text: ~str, document: AbstractDocument) -> AbstractNode<ScriptView> { + let node = Text::new_inherited(text, document); + Node::reflect_node(@mut node, document, TextBinding::Wrap) + } + pub fn Constructor(owner: @mut Window, text: &DOMString) -> Fallible<AbstractNode<ScriptView>> { - let cx = owner.get_cx(); - let text = @Text::new(null_str_as_empty(text), owner.Document()); - Ok(unsafe { Node::as_abstract_node(cx, text) }) + Ok(Text::new(null_str_as_empty(text), owner.Document())) } pub fn SplitText(&self, _offset: u32) -> Fallible<AbstractNode<ScriptView>> { diff --git a/src/components/script/html/hubbub_html_parser.rs b/src/components/script/html/hubbub_html_parser.rs index f1622d8215e..07f5fb7f0df 100644 --- a/src/components/script/html/hubbub_html_parser.rs +++ b/src/components/script/html/hubbub_html_parser.rs @@ -8,7 +8,7 @@ use dom::htmlelement::HTMLElement; use dom::htmlheadingelement::{Heading1, Heading2, Heading3, Heading4, Heading5, Heading6}; use dom::htmliframeelement::IFrameSize; use dom::htmlformelement::HTMLFormElement; -use dom::node::{AbstractNode, ElementNodeTypeId, Node, ScriptView}; +use dom::node::{AbstractNode, ElementNodeTypeId, ScriptView}; use dom::types::*; use html::cssparse::{InlineProvenance, StylesheetProvenance, UrlProvenance, spawn_css_parser}; use js::jsapi::JSContext; @@ -314,10 +314,8 @@ pub fn parse_html(cx: *JSContext, parser.set_tree_handler(~hubbub::TreeHandler { create_comment: |data: ~str| { debug!("create comment"); - let comment = @Comment::new(data, document); - unsafe { - Node::as_abstract_node(cx, comment).to_hubbub_node() - } + let comment = Comment::new(data, document); + unsafe { comment.to_hubbub_node() } }, create_doctype: |doctype: ~hubbub::Doctype| { debug!("create doctype"); @@ -325,13 +323,13 @@ pub fn parse_html(cx: *JSContext, public_id: public_id, system_id: system_id, force_quirks: force_quirks } = doctype; - let node = @DocumentType::new(name, - public_id, - system_id, - force_quirks, - document); + let node = DocumentType::new(name, + public_id, + system_id, + force_quirks, + document); unsafe { - Node::as_abstract_node(cx, node).to_hubbub_node() + node.to_hubbub_node() } }, create_element: |tag: ~hubbub::Tag| { @@ -415,8 +413,8 @@ pub fn parse_html(cx: *JSContext, }, create_text: |data: ~str| { debug!("create text"); - let text = @Text::new(data, document); - unsafe { Node::as_abstract_node(cx, text).to_hubbub_node() } + let text = Text::new(data, document); + unsafe { text.to_hubbub_node() } }, ref_node: |_| {}, unref_node: |_| {}, |