Skip to content

Commit 48c9f1e

Browse files
committed
Implement Dom\HTMLElement class
1 parent 78401ba commit 48c9f1e

11 files changed

+58
-20
lines changed

ext/dom/dom_ce.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ extern PHP_DOM_EXPORT zend_class_entry *dom_attr_class_entry;
4444
extern PHP_DOM_EXPORT zend_class_entry *dom_modern_attr_class_entry;
4545
extern PHP_DOM_EXPORT zend_class_entry *dom_element_class_entry;
4646
extern PHP_DOM_EXPORT zend_class_entry *dom_modern_element_class_entry;
47+
extern PHP_DOM_EXPORT zend_class_entry *dom_html_element_class_entry;
4748
extern PHP_DOM_EXPORT zend_class_entry *dom_text_class_entry;
4849
extern PHP_DOM_EXPORT zend_class_entry *dom_modern_text_class_entry;
4950
extern PHP_DOM_EXPORT zend_class_entry *dom_comment_class_entry;

ext/dom/html_document.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1423,7 +1423,8 @@ zend_result dom_html_document_body_write(dom_object *obj, zval *newval)
14231423
dom_object *newval_intern = Z_DOMOBJ_P(newval);
14241424
if (newval_intern->ptr != NULL) {
14251425
xmlNodePtr newval_node = ((php_libxml_node_ptr *) newval_intern->ptr)->node;
1426-
if (php_dom_ns_is_fast(newval_node, php_dom_ns_is_html_magic_token) && dom_accept_body_name(newval_node->name)) {
1426+
/* Note: because this property has type HTMLElement, we know the namespace is correct. */
1427+
if (dom_accept_body_name(newval_node->name)) {
14271428
/* 2. If the new value is the same as the body element, return. */
14281429
const xmlNode *current_body_element = dom_html_document_element_read_raw(docp, dom_accept_body_name);
14291430
if (current_body_element == newval_node) {

ext/dom/internal_helpers.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ static zend_always_inline zend_class_entry *dom_get_dtd_namednodemap_ce(bool mod
4747

4848
DOM_DEF_GET_CE_FUNC(node)
4949
DOM_DEF_GET_CE_FUNC(documenttype)
50-
DOM_DEF_GET_CE_FUNC(element)
5150
DOM_DEF_GET_CE_FUNC(attr)
5251
DOM_DEF_GET_CE_FUNC(entity)
5352
DOM_DEF_GET_CE_FUNC(entityreference)

ext/dom/php_dom.c

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ PHP_DOM_EXPORT zend_class_entry *dom_attr_class_entry;
6363
PHP_DOM_EXPORT zend_class_entry *dom_modern_attr_class_entry;
6464
PHP_DOM_EXPORT zend_class_entry *dom_element_class_entry;
6565
PHP_DOM_EXPORT zend_class_entry *dom_modern_element_class_entry;
66+
PHP_DOM_EXPORT zend_class_entry *dom_html_element_class_entry;
6667
PHP_DOM_EXPORT zend_class_entry *dom_text_class_entry;
6768
PHP_DOM_EXPORT zend_class_entry *dom_modern_text_class_entry;
6869
PHP_DOM_EXPORT zend_class_entry *dom_comment_class_entry;
@@ -1042,6 +1043,11 @@ PHP_MINIT_FUNCTION(dom)
10421043
DOM_OVERWRITE_PROP_HANDLER(&dom_modern_element_prop_handlers, "textContent", dom_node_text_content_read, dom_node_text_content_write);
10431044
zend_hash_add_new_ptr(&classes, dom_modern_element_class_entry->name, &dom_modern_element_prop_handlers);
10441045

1046+
dom_html_element_class_entry = register_class_Dom_HTMLElement(dom_modern_element_class_entry);
1047+
dom_html_element_class_entry->create_object = dom_objects_new;
1048+
dom_html_element_class_entry->default_object_handlers = &dom_object_handlers;
1049+
zend_hash_add_new_ptr(&classes, dom_html_element_class_entry->name, &dom_modern_element_prop_handlers);
1050+
10451051
dom_text_class_entry = register_class_DOMText(dom_characterdata_class_entry);
10461052
dom_text_class_entry->create_object = dom_objects_new;
10471053
dom_text_class_entry->default_object_handlers = &dom_object_handlers;
@@ -1541,6 +1547,19 @@ void php_dom_create_iterator(zval *return_value, dom_iterator_type iterator_type
15411547
}
15421548
/* }}} */
15431549

1550+
static zend_always_inline zend_class_entry *dom_get_element_ce(const xmlNode *node, bool modern)
1551+
{
1552+
if (modern) {
1553+
if (php_dom_ns_is_fast(node, php_dom_ns_is_html_magic_token)) {
1554+
return dom_html_element_class_entry;
1555+
} else {
1556+
return dom_modern_element_class_entry;
1557+
}
1558+
} else {
1559+
return dom_element_class_entry;
1560+
}
1561+
}
1562+
15441563
/* {{{ php_dom_create_object */
15451564
PHP_DOM_EXPORT bool php_dom_create_object(xmlNodePtr obj, zval *return_value, dom_object *domobj)
15461565
{
@@ -1572,7 +1591,7 @@ PHP_DOM_EXPORT bool php_dom_create_object(xmlNodePtr obj, zval *return_value, do
15721591
}
15731592
case XML_ELEMENT_NODE:
15741593
{
1575-
ce = dom_get_element_ce(modern);
1594+
ce = dom_get_element_ce(obj, modern);
15761595
break;
15771596
}
15781597
case XML_ATTRIBUTE_NODE:

ext/dom/php_dom.stub.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1374,6 +1374,10 @@ public function prepend(Node|string ...$nodes): void {}
13741374
public function replaceChildren(Node|string ...$nodes): void {}
13751375
}
13761376

1377+
class HTMLElement extends Element
1378+
{
1379+
}
1380+
13771381
class Attr extends Node
13781382
{
13791383
/** @readonly */
@@ -1581,9 +1585,9 @@ public function replaceChildren(Node|string ...$nodes): void {}
15811585

15821586
public function importLegacyNode(\DOMNode $node, bool $deep = false): Node {}
15831587

1584-
public ?Element $body;
1588+
public ?HTMLElement $body;
15851589
/** @readonly */
1586-
public ?Element $head;
1590+
public ?HTMLElement $head;
15871591
public string $title;
15881592
}
15891593

ext/dom/php_dom_arginfo.h

Lines changed: 19 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ext/dom/tests/modern/html/interactions/Document_body_setter_errors.phpt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ function testNormalReplace($cb)
1111
var_dump($dom->body?->nodeName);
1212
try {
1313
$dom->body = $cb($dom);
14-
} catch (DOMException $e) {
14+
} catch (Throwable $e) {
1515
echo $e->getMessage(), "\n";
1616
}
1717
var_dump($dom->body?->nodeName);
@@ -50,11 +50,11 @@ The new body must either be a body or a frameset tag
5050
string(4) "BODY"
5151
--- Right element tag in wrong namespace ---
5252
string(4) "BODY"
53-
The new body must either be a body or a frameset tag
53+
Cannot assign Dom\Element to property Dom\Document::$body of type ?Dom\HTMLElement
5454
string(4) "BODY"
5555
--- Right element tag in no namespace ---
5656
string(4) "BODY"
57-
The new body must either be a body or a frameset tag
57+
Cannot assign Dom\Element to property Dom\Document::$body of type ?Dom\HTMLElement
5858
string(4) "BODY"
5959
--- Set body without document element ---
6060
A body can only be set if there is a document element

ext/dom/tests/modern/html/interactions/HTMLDocument_registerNodeClass_03.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ dom
55
--FILE--
66
<?php
77

8-
class Custom extends Dom\Element {
8+
class Custom extends Dom\HTMLElement {
99
public int $test = 1;
1010

1111
public function reverseTagName(): string {
@@ -15,7 +15,7 @@ class Custom extends Dom\Element {
1515
}
1616

1717
$dom = Dom\HTMLDocument::createFromString("<div>foo</div>", LIBXML_NOERROR);
18-
$dom->registerNodeClass("Dom\\Element", "Custom");
18+
$dom->registerNodeClass("Dom\\HTMLElement", "Custom");
1919

2020
var_dump($dom->getElementsByTagName('div')[0]->reverseTagName());
2121

ext/dom/tests/modern/html/interactions/HTMLDocument_should_retain_properties_and_owner_01.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ dom
55
--FILE--
66
<?php
77

8-
class MyElement extends Dom\Element {}
8+
class MyElement extends Dom\HTMLElement {}
99

1010
$dom = Dom\HTMLDocument::createFromString("<p>foo</p>", LIBXML_NOERROR);
11-
$dom->registerNodeClass("Dom\\Element", "MyElement");
11+
$dom->registerNodeClass("Dom\\HTMLElement", "MyElement");
1212

1313
// Destroy reference to the DOM
1414
$child = $dom->documentElement;

ext/dom/tests/modern/html/interactions/HTMLDocument_should_retain_properties_and_owner_02.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ dom
55
--FILE--
66
<?php
77

8-
class MyElement extends Dom\Element {}
8+
class MyElement extends Dom\HTMLElement {}
99

1010
$dom = Dom\HTMLDocument::createFromString("<p>foo</p>", LIBXML_NOERROR);
11-
$dom->registerNodeClass("Dom\\Element", "MyElement");
11+
$dom->registerNodeClass("Dom\\HTMLElement", "MyElement");
1212
$child = $dom->documentElement->appendChild($dom->createElement('html'));
1313

1414
// Destroy reference to the DOM

ext/dom/tests/modern/spec/Element_prefix_readonly.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,5 @@ try {
1414
echo $dom->saveXml();
1515
?>
1616
--EXPECT--
17-
Cannot modify readonly property Dom\Element::$prefix
17+
Cannot modify readonly property Dom\HTMLElement::$prefix
1818
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

0 commit comments

Comments
 (0)