diff --git a/CHANGELOG.rdoc b/CHANGELOG.rdoc index 1018e667f9..8ce549da11 100644 --- a/CHANGELOG.rdoc +++ b/CHANGELOG.rdoc @@ -24,6 +24,7 @@ Several changes were made to improve performance: * [JRuby] fix NPE when inspecting nodes returned by NodeSet#drop (#1042) (Thanks, @mkristian!) * [JRuby] fix nil attriubte node's namespace in reader (#1327) (Thanks, @codekitchen!) * [JRuby] fix Nokogiri munging unicode characters that require more than 2 bytes (#1113) (Thanks, @mkristian!) +* [JRuby] allow unlinking an unparented node (#1112, #1152) (Thanks, @esse!) * [MRI] fix assertion failure while accessing attribute node's namespace in reader (#843) (Thanks, @2potatocakes!) * [MRI] fix issue with GCing namespace nodes returned in an xpath query. (#1155) * [MRI] Ensure C strings are null-terminated. (#1381) diff --git a/ext/java/nokogiri/XmlNode.java b/ext/java/nokogiri/XmlNode.java index 1c937a428c..8dc4369110 100644 --- a/ext/java/nokogiri/XmlNode.java +++ b/ext/java/nokogiri/XmlNode.java @@ -1413,16 +1413,10 @@ public IRubyObject set_namespace(ThreadContext context, IRubyObject namespace) { @JRubyMethod(name = {"unlink", "remove"}) public IRubyObject unlink(ThreadContext context) { - if(node.getParentNode() == null) { - //throw context.getRuntime().newRuntimeError("TYPE: " + node.getNodeType()+ " PARENT NULL"); - return this; - // if node doesn't have parent node - simply return self, as would Nokogiri for C would do - // because that means that node is already detached - } else { + if (node.getParentNode() != null) { clearXpathContext(node.getParentNode()); node.getParentNode().removeChild(node); } - return this; } diff --git a/test/html/test_document_fragment.rb b/test/html/test_document_fragment.rb index 0f79352840..54e4a0a9be 100644 --- a/test/html/test_document_fragment.rb +++ b/test/html/test_document_fragment.rb @@ -23,7 +23,8 @@ def test_html_parse_encoding end def test_unlink_empty_document - Nokogiri::HTML::DocumentFragment.parse('').unlink + frag = Nokogiri::HTML::DocumentFragment.parse('').unlink # must_not_raise + assert_nil frag.parent end def test_colons_are_not_removed diff --git a/test/xml/test_unparented_node.rb b/test/xml/test_unparented_node.rb index 902347a036..e1b786867d 100644 --- a/test/xml/test_unparented_node.rb +++ b/test/xml/test_unparented_node.rb @@ -422,6 +422,19 @@ def test_illegal_replace_of_node_with_doc old_node = @node.at('.//employee') assert_raises(ArgumentError){ old_node.replace new_node } end + + def test_unlink_on_unlinked_node_1 + node = Nokogiri::XML::Node.new 'div', Nokogiri::XML::Document.new + node.unlink # must_not_raise + assert_nil node.parent + end + + def test_unlink_on_unlinked_node_2 + node = Nokogiri::XML('
foo
').at_css("div") + node.unlink + node.unlink # must_not_raise + assert_nil node.parent + end end end end