Skip to content

Implement DOMNode::parentElement and DOMNameSpaceNode::parentElement #11679

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions ext/dom/dom_properties.h
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ int dom_node_node_value_read(dom_object *obj, zval *retval);
int dom_node_node_value_write(dom_object *obj, zval *newval);
int dom_node_node_type_read(dom_object *obj, zval *retval);
int dom_node_parent_node_read(dom_object *obj, zval *retval);
zend_result dom_node_parent_element_read(dom_object *obj, zval *retval);
int dom_node_child_nodes_read(dom_object *obj, zval *retval);
int dom_node_first_child_read(dom_object *obj, zval *retval);
int dom_node_last_child_read(dom_object *obj, zval *retval);
Expand Down
37 changes: 26 additions & 11 deletions ext/dom/node.c
Original file line number Diff line number Diff line change
Expand Up @@ -225,24 +225,17 @@ int dom_node_node_type_read(dom_object *obj, zval *retval)

/* }}} */

/* {{{ parentNode DomNode
readonly=yes
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1060184317
Since:
*/
int dom_node_parent_node_read(dom_object *obj, zval *retval)
static zend_result dom_node_parent_get(dom_object *obj, zval *retval, bool only_element)
{
xmlNode *nodep, *nodeparent;

nodep = dom_object_get_node(obj);
xmlNodePtr nodep = dom_object_get_node(obj);

if (nodep == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}

nodeparent = nodep->parent;
if (!nodeparent) {
xmlNodePtr nodeparent = nodep->parent;
if (!nodeparent || (only_element && nodeparent->type != XML_ELEMENT_NODE)) {
ZVAL_NULL(retval);
return SUCCESS;
}
Expand All @@ -251,6 +244,28 @@ int dom_node_parent_node_read(dom_object *obj, zval *retval)
return SUCCESS;
}

/* {{{ parentNode ?DomNode
readonly=yes
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1060184317
Since:
*/
int dom_node_parent_node_read(dom_object *obj, zval *retval)
{
return dom_node_parent_get(obj, retval, false);
}

/* }}} */

/* {{{ parentElement ?DomElement
readonly=yes
URL: https://dom.spec.whatwg.org/#parent-element
Since:
*/
zend_result dom_node_parent_element_read(dom_object *obj, zval *retval)
{
return dom_node_parent_get(obj, retval, true);
}

/* }}} */

/* {{{ childNodes DomNodeList
Expand Down
2 changes: 2 additions & 0 deletions ext/dom/php_dom.c
Original file line number Diff line number Diff line change
Expand Up @@ -636,6 +636,7 @@ PHP_MINIT_FUNCTION(dom)
dom_register_prop_handler(&dom_node_prop_handlers, "nodeValue", sizeof("nodeValue")-1, dom_node_node_value_read, dom_node_node_value_write);
dom_register_prop_handler(&dom_node_prop_handlers, "nodeType", sizeof("nodeType")-1, dom_node_node_type_read, NULL);
dom_register_prop_handler(&dom_node_prop_handlers, "parentNode", sizeof("parentNode")-1, dom_node_parent_node_read, NULL);
dom_register_prop_handler(&dom_node_prop_handlers, "parentElement", sizeof("parentElement")-1, dom_node_parent_element_read, NULL);
dom_register_prop_handler(&dom_node_prop_handlers, "childNodes", sizeof("childNodes")-1, dom_node_child_nodes_read, NULL);
dom_register_prop_handler(&dom_node_prop_handlers, "firstChild", sizeof("firstChild")-1, dom_node_first_child_read, NULL);
dom_register_prop_handler(&dom_node_prop_handlers, "lastChild", sizeof("lastChild")-1, dom_node_last_child_read, NULL);
Expand All @@ -662,6 +663,7 @@ PHP_MINIT_FUNCTION(dom)
dom_register_prop_handler(&dom_namespace_node_prop_handlers, "namespaceURI", sizeof("namespaceURI")-1, dom_node_namespace_uri_read, NULL);
dom_register_prop_handler(&dom_namespace_node_prop_handlers, "ownerDocument", sizeof("ownerDocument")-1, dom_node_owner_document_read, NULL);
dom_register_prop_handler(&dom_namespace_node_prop_handlers, "parentNode", sizeof("parentNode")-1, dom_node_parent_node_read, NULL);
dom_register_prop_handler(&dom_namespace_node_prop_handlers, "parentElement", sizeof("parentElement")-1, dom_node_parent_element_read, NULL);
zend_hash_add_ptr(&classes, dom_namespace_node_class_entry->name, &dom_namespace_node_prop_handlers);

dom_documentfragment_class_entry = register_class_DOMDocumentFragment(dom_node_class_entry, dom_parentnode_class_entry);
Expand Down
6 changes: 6 additions & 0 deletions ext/dom/php_dom.stub.php
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,9 @@ class DOMNode
/** @readonly */
public ?DOMNode $parentNode;

/** @readonly */
public ?DOMElement $parentElement;

Comment on lines +308 to +310
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same thing then in #11677

/** @readonly */
public DOMNodeList $childNodes;

Expand Down Expand Up @@ -417,6 +420,9 @@ class DOMNameSpaceNode

/** @readonly */
public ?DOMNode $parentNode;

/** @readonly */
public ?DOMElement $parentElement;
}

class DOMImplementation
Expand Down
16 changes: 15 additions & 1 deletion ext/dom/php_dom_arginfo.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

57 changes: 57 additions & 0 deletions ext/dom/tests/DOMNode_DOMNameSpaceNode_parentElement.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
--TEST--
DOMNode::parentElement and DOMNameSpaceNode::parentElement
--EXTENSIONS--
dom
--FILE--
<?php

$dom = new DOMDocument();
$dom->loadXML(<<<XML
<!DOCTYPE HTML>
<html>
<body/>
</html>
XML);

echo "--- body test ---\n";

$body = $dom->documentElement->firstElementChild;
var_dump($body->parentNode->localName);
var_dump($body->parentElement->localName);

echo "--- document test ---\n";

var_dump(get_class($dom->documentElement->parentNode));
var_dump($dom->documentElement->parentElement);

var_dump(get_class($dom->doctype->parentNode));
var_dump($dom->doctype->parentElement);

echo "--- fragment test ---\n";

$fragment = $dom->createDocumentFragment();
$p = $fragment->appendChild($dom->createElement('p'));

var_dump(get_class($p->parentNode));
var_dump($p->parentElement);

$body->appendChild($fragment);

var_dump($p->parentNode->localName);
var_dump($p->parentElement->localName);

?>
--EXPECT--
--- body test ---
string(4) "html"
string(4) "html"
--- document test ---
string(11) "DOMDocument"
NULL
string(11) "DOMDocument"
NULL
--- fragment test ---
string(19) "DOMDocumentFragment"
NULL
string(4) "body"
string(4) "body"
14 changes: 10 additions & 4 deletions ext/dom/tests/bug69846.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,9 @@ foreach ($dataNodes AS $node) {
}

?>
--EXPECTF--
--EXPECT--
int(3)
object(DOMText)#%d (21) {
object(DOMText)#7 (22) {
["wholeText"]=>
string(3) "
"
Expand All @@ -52,6 +52,8 @@ object(DOMText)#%d (21) {
int(3)
["parentNode"]=>
NULL
["parentElement"]=>
NULL
["childNodes"]=>
string(22) "(object value omitted)"
["firstChild"]=>
Expand All @@ -78,7 +80,7 @@ object(DOMText)#%d (21) {
string(3) "
"
}
object(DOMElement)#7 (23) {
object(DOMElement)#7 (24) {
["schemaTypeInfo"]=>
NULL
["tagName"]=>
Expand All @@ -105,6 +107,8 @@ object(DOMElement)#7 (23) {
int(1)
["parentNode"]=>
NULL
["parentElement"]=>
NULL
["childNodes"]=>
string(22) "(object value omitted)"
["firstChild"]=>
Expand Down Expand Up @@ -134,7 +138,7 @@ object(DOMElement)#7 (23) {
Value C
"
}
object(DOMText)#%d (21) {
object(DOMText)#7 (22) {
["wholeText"]=>
string(1) "
"
Expand All @@ -156,6 +160,8 @@ object(DOMText)#%d (21) {
int(3)
["parentNode"]=>
NULL
["parentElement"]=>
NULL
["childNodes"]=>
string(22) "(object value omitted)"
["firstChild"]=>
Expand Down
2 changes: 2 additions & 0 deletions ext/dom/tests/bug70359.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ DOMNameSpaceNode Object
[namespaceURI] => http://www.sitemaps.org/schemas/sitemap/0.9
[ownerDocument] => (object value omitted)
[parentNode] => (object value omitted)
[parentElement] => (object value omitted)
)
-- Test with parent and non-ns attribute --
int(2)
Expand All @@ -75,5 +76,6 @@ DOMNameSpaceNode Object
[namespaceURI] => fooooooooooooooooooooo
[ownerDocument] => (object value omitted)
[parentNode] => (object value omitted)
[parentElement] => (object value omitted)
)
string(3) "url"
4 changes: 3 additions & 1 deletion ext/dom/tests/bug78577.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ var_dump($attr);

?>
--EXPECT--
object(DOMNameSpaceNode)#3 (8) {
object(DOMNameSpaceNode)#3 (9) {
["nodeName"]=>
string(5) "xmlns"
["nodeValue"]=>
Expand All @@ -30,4 +30,6 @@ object(DOMNameSpaceNode)#3 (8) {
string(22) "(object value omitted)"
["parentNode"]=>
string(22) "(object value omitted)"
["parentElement"]=>
string(22) "(object value omitted)"
}
8 changes: 6 additions & 2 deletions ext/dom/tests/bug80602_3.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ var_dump($target);
?>
--EXPECTF--
<a>barfoobaz<last/></a>
object(DOMElement)#3 (23) {
object(DOMElement)#3 (24) {
["schemaTypeInfo"]=>
NULL
["tagName"]=>
Expand All @@ -44,6 +44,8 @@ object(DOMElement)#3 (23) {
int(1)
["parentNode"]=>
string(22) "(object value omitted)"
["parentElement"]=>
string(22) "(object value omitted)"
["childNodes"]=>
string(22) "(object value omitted)"
["firstChild"]=>
Expand All @@ -70,7 +72,7 @@ object(DOMElement)#3 (23) {
string(0) ""
}
<a><last/>barfoobaz</a>
object(DOMElement)#2 (23) {
object(DOMElement)#2 (24) {
["schemaTypeInfo"]=>
NULL
["tagName"]=>
Expand All @@ -93,6 +95,8 @@ object(DOMElement)#2 (23) {
int(1)
["parentNode"]=>
string(22) "(object value omitted)"
["parentElement"]=>
string(22) "(object value omitted)"
["childNodes"]=>
string(22) "(object value omitted)"
["firstChild"]=>
Expand Down
4 changes: 3 additions & 1 deletion ext/dom/tests/clone_nodes.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ var_dump($barClone->parentNode);
?>
--EXPECT--
-- Clone DOMNameSpaceNode --
object(DOMNameSpaceNode)#3 (8) {
object(DOMNameSpaceNode)#3 (9) {
["nodeName"]=>
string(5) "xmlns"
["nodeValue"]=>
Expand All @@ -61,6 +61,8 @@ object(DOMNameSpaceNode)#3 (8) {
string(22) "(object value omitted)"
["parentNode"]=>
string(22) "(object value omitted)"
["parentElement"]=>
string(22) "(object value omitted)"
}
string(19) "http://php.net/test"
string(3) "foo"
Expand Down
1 change: 1 addition & 0 deletions ext/dom/tests/domobject_debug_handler.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ DOMDocument Object
[nodeValue] =>
[nodeType] => 9
[parentNode] =>
[parentElement] =>
[childNodes] => (object value omitted)
[firstChild] => (object value omitted)
[lastChild] => (object value omitted)
Expand Down
4 changes: 3 additions & 1 deletion ext/dom/tests/xpath_domnamespacenode.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ var_dump($nodes->item(0));

?>
--EXPECT--
object(DOMNameSpaceNode)#4 (8) {
object(DOMNameSpaceNode)#4 (9) {
["nodeName"]=>
string(9) "xmlns:xml"
["nodeValue"]=>
Expand All @@ -34,4 +34,6 @@ object(DOMNameSpaceNode)#4 (8) {
string(22) "(object value omitted)"
["parentNode"]=>
string(22) "(object value omitted)"
["parentElement"]=>
string(22) "(object value omitted)"
}