diff --git a/src/components/script/dom/bindings/codegen/Bindings.conf b/src/components/script/dom/bindings/codegen/Bindings.conf index 5f6ed7de836..5ec918b6b2c 100644 --- a/src/components/script/dom/bindings/codegen/Bindings.conf +++ b/src/components/script/dom/bindings/codegen/Bindings.conf @@ -290,7 +290,8 @@ DOMInterfaces = { 'Node': { 'nativeType': 'AbstractNode', 'concreteType': 'Node', - 'pointerType': '' + 'pointerType': '', + 'needsAbstract': ['removeChild'] }, 'NodeList': [ diff --git a/src/components/script/dom/bindings/utils.rs b/src/components/script/dom/bindings/utils.rs index 3ea5eda38c7..9dfc4e965d0 100644 --- a/src/components/script/dom/bindings/utils.rs +++ b/src/components/script/dom/bindings/utils.rs @@ -795,7 +795,8 @@ impl DerivedWrapper for AbstractNode { #[deriving(ToStr)] pub enum Error { - FailureUnknown + FailureUnknown, + NotFound, } pub type ErrorResult = Result<(), Error>; diff --git a/src/components/script/dom/node.rs b/src/components/script/dom/node.rs index 2eedaa8bbe8..5aeab579f54 100644 --- a/src/components/script/dom/node.rs +++ b/src/components/script/dom/node.rs @@ -5,7 +5,7 @@ //! The core DOM types. Defines the basic DOM hierarchy as well as all the HTML elements. use dom::bindings::node; -use dom::bindings::utils::{WrapperCache, DOMString, null_string, str, ErrorResult}; +use dom::bindings::utils::{WrapperCache, DOMString, null_string, str, ErrorResult, NotFound}; use dom::bindings::utils::{BindingObject, CacheableWrapper, rust_box}; use dom::bindings; use dom::characterdata::CharacterData; @@ -561,8 +561,25 @@ impl Node { fail!("stub") } - pub fn RemoveChild(&mut self, _node: AbstractNode, _rv: &mut ErrorResult) -> AbstractNode { - fail!("stub") + pub fn RemoveChild(&mut self, + abstract_self: AbstractNode, + node: AbstractNode, + rv: &mut ErrorResult) -> AbstractNode { + fn is_not_found_err(this_node: AbstractNode, + old_child: AbstractNode) -> bool { + match old_child.parent_node() { + Some(parent) if parent == this_node => false, + _ => true + } + } + + if is_not_found_err(abstract_self, node) { + *rv = Err(NotFound); + } + if rv.is_ok() { + abstract_self.remove_child(node); + } + node } pub fn Normalize(&mut self) {