Skip to content

Commit 2171955

Browse files
committed
Implement HTMLElement class
1 parent dd2f1a4 commit 2171955

11 files changed

+58
-21
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
@@ -62,6 +62,7 @@ PHP_DOM_EXPORT zend_class_entry *dom_attr_class_entry;
6262
PHP_DOM_EXPORT zend_class_entry *dom_modern_attr_class_entry;
6363
PHP_DOM_EXPORT zend_class_entry *dom_element_class_entry;
6464
PHP_DOM_EXPORT zend_class_entry *dom_modern_element_class_entry;
65+
PHP_DOM_EXPORT zend_class_entry *dom_html_element_class_entry;
6566
PHP_DOM_EXPORT zend_class_entry *dom_text_class_entry;
6667
PHP_DOM_EXPORT zend_class_entry *dom_modern_text_class_entry;
6768
PHP_DOM_EXPORT zend_class_entry *dom_comment_class_entry;
@@ -1035,6 +1036,11 @@ PHP_MINIT_FUNCTION(dom)
10351036
DOM_OVERWRITE_PROP_HANDLER(&dom_modern_element_prop_handlers, "textContent", dom_node_text_content_read, dom_node_text_content_write);
10361037
zend_hash_add_new_ptr(&classes, dom_modern_element_class_entry->name, &dom_modern_element_prop_handlers);
10371038

1039+
dom_html_element_class_entry = register_class_DOM_HTMLElement(dom_modern_element_class_entry);
1040+
dom_html_element_class_entry->create_object = dom_objects_new;
1041+
dom_html_element_class_entry->default_object_handlers = &dom_object_handlers;
1042+
zend_hash_add_new_ptr(&classes, dom_html_element_class_entry->name, &dom_modern_element_prop_handlers);
1043+
10381044
dom_text_class_entry = register_class_DOMText(dom_characterdata_class_entry);
10391045
dom_text_class_entry->create_object = dom_objects_new;
10401046
dom_text_class_entry->default_object_handlers = &dom_object_handlers;
@@ -1518,6 +1524,19 @@ void php_dom_create_iterator(zval *return_value, dom_iterator_type iterator_type
15181524
}
15191525
/* }}} */
15201526

1527+
static zend_always_inline zend_class_entry *dom_get_element_ce(const xmlNode *node, bool modern)
1528+
{
1529+
if (modern) {
1530+
if (php_dom_ns_is_fast(node, php_dom_ns_is_html_magic_token)) {
1531+
return dom_html_element_class_entry;
1532+
} else {
1533+
return dom_modern_element_class_entry;
1534+
}
1535+
} else {
1536+
return dom_element_class_entry;
1537+
}
1538+
}
1539+
15211540
/* {{{ php_dom_create_object */
15221541
PHP_DOM_EXPORT bool php_dom_create_object(xmlNodePtr obj, zval *return_value, dom_object *domobj)
15231542
{
@@ -1549,7 +1568,7 @@ PHP_DOM_EXPORT bool php_dom_create_object(xmlNodePtr obj, zval *return_value, do
15491568
}
15501569
case XML_ELEMENT_NODE:
15511570
{
1552-
ce = dom_get_element_ce(modern);
1571+
ce = dom_get_element_ce(obj, modern);
15531572
break;
15541573
}
15551574
case XML_ATTRIBUTE_NODE:

ext/dom/php_dom.stub.php

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

1378+
class HTMLElement extends Element
1379+
{
1380+
}
1381+
13781382
class Attr extends Node
13791383
{
13801384
/** @readonly */
@@ -1582,10 +1586,9 @@ public function replaceChildren(Node|string ...$nodes): void {}
15821586

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

1585-
/* TODO: HTMLElement, once we decided on whether to implement that ? */
1586-
public ?Element $body;
1589+
public ?HTMLElement $body;
15871590
/** @readonly */
1588-
public ?Element $head;
1591+
public ?HTMLElement $head;
15891592
public string $title;
15901593
}
15911594

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)