Skip to content

Commit 495c80b

Browse files
committed
Implement DTDNamedNodeMap
1 parent 559cb01 commit 495c80b

File tree

8 files changed

+273
-13
lines changed

8 files changed

+273
-13
lines changed

ext/dom/documenttype.c

+2-4
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,7 @@ zend_result dom_documenttype_entities_read(dom_object *obj, zval *retval)
6060
return FAILURE;
6161
}
6262

63-
// TODO
64-
php_dom_create_iterator(retval, DOM_NAMEDNODEMAP, false);
63+
php_dom_create_iterator(retval, DOM_DTD_NAMEDNODEMAP, php_dom_follow_spec_intern(obj));
6564

6665
entityht = (xmlHashTable *) doctypep->entities;
6766

@@ -89,8 +88,7 @@ zend_result dom_documenttype_notations_read(dom_object *obj, zval *retval)
8988
return FAILURE;
9089
}
9190

92-
// TODO
93-
php_dom_create_iterator(retval, DOM_NAMEDNODEMAP, false);
91+
php_dom_create_iterator(retval, DOM_DTD_NAMEDNODEMAP, php_dom_follow_spec_intern(obj));
9492

9593
notationht = (xmlHashTable *) doctypep->notations;
9694

ext/dom/dom_ce.h

+1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ extern PHP_DOM_EXPORT zend_class_entry *dom_nodelist_class_entry;
3535
extern PHP_DOM_EXPORT zend_class_entry *dom_modern_nodelist_class_entry;
3636
extern PHP_DOM_EXPORT zend_class_entry *dom_namednodemap_class_entry;
3737
extern PHP_DOM_EXPORT zend_class_entry *dom_modern_namednodemap_class_entry;
38+
extern PHP_DOM_EXPORT zend_class_entry *dom_modern_dtd_namednodemap_class_entry;
3839
extern PHP_DOM_EXPORT zend_class_entry *dom_html_collection_class_entry;
3940
extern PHP_DOM_EXPORT zend_class_entry *dom_characterdata_class_entry;
4041
extern PHP_DOM_EXPORT zend_class_entry *dom_modern_characterdata_class_entry;

ext/dom/internal_helpers.h

+5
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ static zend_always_inline zend_class_entry *dom_get_xml_document_ce(bool modern)
4040
return modern ? dom_xml_document_class_entry : dom_document_class_entry;
4141
}
4242

43+
static zend_always_inline zend_class_entry *dom_get_dtd_namednodemap_ce(bool modern)
44+
{
45+
return modern ? dom_modern_dtd_namednodemap_class_entry : dom_namednodemap_class_entry;
46+
}
47+
4348
DOM_DEF_GET_CE_FUNC(node)
4449
DOM_DEF_GET_CE_FUNC(documenttype)
4550
DOM_DEF_GET_CE_FUNC(element)

ext/dom/php_dom.c

+11-1
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ PHP_DOM_EXPORT zend_class_entry *dom_nodelist_class_entry;
5151
PHP_DOM_EXPORT zend_class_entry *dom_modern_nodelist_class_entry;
5252
PHP_DOM_EXPORT zend_class_entry *dom_namednodemap_class_entry;
5353
PHP_DOM_EXPORT zend_class_entry *dom_modern_namednodemap_class_entry;
54+
PHP_DOM_EXPORT zend_class_entry *dom_modern_dtd_namednodemap_class_entry;
5455
PHP_DOM_EXPORT zend_class_entry *dom_html_collection_class_entry;
5556
PHP_DOM_EXPORT zend_class_entry *dom_characterdata_class_entry;
5657
PHP_DOM_EXPORT zend_class_entry *dom_modern_characterdata_class_entry;
@@ -891,6 +892,13 @@ PHP_MINIT_FUNCTION(dom)
891892

892893
zend_hash_add_new_ptr(&classes, dom_modern_namednodemap_class_entry->name, &dom_namednodemap_prop_handlers);
893894

895+
dom_modern_dtd_namednodemap_class_entry = register_class_DOM_DTDNamedNodeMap(zend_ce_aggregate, zend_ce_countable);
896+
dom_modern_dtd_namednodemap_class_entry->create_object = dom_nnodemap_objects_new;
897+
dom_modern_dtd_namednodemap_class_entry->default_object_handlers = &dom_nnodemap_object_handlers;
898+
dom_modern_dtd_namednodemap_class_entry->get_iterator = php_dom_get_iterator;
899+
900+
zend_hash_add_new_ptr(&classes, dom_modern_dtd_namednodemap_class_entry->name, &dom_namednodemap_prop_handlers);
901+
894902
dom_html_collection_class_entry = register_class_DOM_HTMLCollection(zend_ce_aggregate, zend_ce_countable);
895903
dom_html_collection_class_entry->create_object = dom_nnodemap_objects_new;
896904
dom_html_collection_class_entry->default_object_handlers = &dom_nodelist_object_handlers;
@@ -1060,7 +1068,7 @@ PHP_MINIT_FUNCTION(dom)
10601068
DOM_REGISTER_PROP_HANDLER(&dom_modern_notation_prop_handlers, "publicId", dom_notation_public_id_read, NULL);
10611069
DOM_REGISTER_PROP_HANDLER(&dom_modern_notation_prop_handlers, "systemId", dom_notation_system_id_read, NULL);
10621070
zend_hash_merge(&dom_modern_notation_prop_handlers, &dom_modern_node_prop_handlers, NULL, false);
1063-
zend_hash_add_new_ptr(&classes, dom_modern_notation_class_entry->name, &dom_notation_prop_handlers);
1071+
zend_hash_add_new_ptr(&classes, dom_modern_notation_class_entry->name, &dom_modern_node_prop_handlers);
10641072

10651073
dom_entity_class_entry = register_class_DOMEntity(dom_node_class_entry);
10661074
dom_entity_class_entry->create_object = dom_objects_new;
@@ -1443,6 +1451,8 @@ void php_dom_create_iterator(zval *return_value, dom_iterator_type iterator_type
14431451
/* This only exists in modern DOM. */
14441452
ZEND_ASSERT(modern);
14451453
ce = dom_html_collection_class_entry;
1454+
} else if (iterator_type == DOM_DTD_NAMEDNODEMAP) {
1455+
ce = dom_get_dtd_namednodemap_ce(modern);
14461456
} else {
14471457
ZEND_ASSERT(iterator_type == DOM_NODELIST);
14481458
ce = dom_get_nodelist_ce(modern);

ext/dom/php_dom.h

+1
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ typedef struct {
110110
typedef enum _dom_iterator_type {
111111
DOM_NODELIST,
112112
DOM_NAMEDNODEMAP,
113+
DOM_DTD_NAMEDNODEMAP,
113114
DOM_HTMLCOLLECTION,
114115
} dom_iterator_type;
115116

ext/dom/php_dom.stub.php

+24-3
Original file line numberDiff line numberDiff line change
@@ -1249,6 +1249,28 @@ public function count(): int {}
12491249
public function getIterator(): \Iterator {}
12501250
}
12511251

1252+
class DTDNamedNodeMap implements IteratorAggregate, Countable
1253+
{
1254+
/** @readonly */
1255+
public int $length;
1256+
1257+
/** @implementation-alias DOMNamedNodeMap::item */
1258+
public function item(int $index): Entity|Notation|null {}
1259+
/** @implementation-alias DOMNamedNodeMap::getNamedItem */
1260+
public function getNamedItem(string $qualifiedName): Entity|Notation|null {}
1261+
/** @implementation-alias DOMNamedNodeMap::getNamedItemNS */
1262+
public function getNamedItemNS(?string $namespace, string $localName): Entity|Notation|null {}
1263+
1264+
/**
1265+
* @tentative-return-type
1266+
* @implementation-alias DOMNamedNodeMap::count
1267+
*/
1268+
public function count(): int {}
1269+
1270+
/** @implementation-alias DOMNamedNodeMap::getIterator */
1271+
public function getIterator(): \Iterator {}
1272+
}
1273+
12521274
class HTMLCollection implements IteratorAggregate, Countable
12531275
{
12541276
/** @readonly */
@@ -1432,11 +1454,10 @@ class DocumentType extends Node implements ChildNode
14321454
{
14331455
/** @readonly */
14341456
public string $name;
1435-
/* TODO :( these are not the same "NamedNodeMap"!!! */
14361457
/** @readonly */
1437-
public NamedNodeMap $entities;
1458+
public DTDNamedNodeMap $entities;
14381459
/** @readonly */
1439-
public NamedNodeMap $notations;
1460+
public DTDNamedNodeMap $notations;
14401461
/** @readonly */
14411462
public string $publicId;
14421463
/** @readonly */

ext/dom/php_dom_arginfo.h

+49-5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)