diff --git a/ext/dom/html5_parser.c b/ext/dom/html5_parser.c index f1dc2db53b2..d5fe3d5c277 100644 --- a/ext/dom/html5_parser.c +++ b/ext/dom/html5_parser.c @@ -268,7 +268,10 @@ static lexbor_libxml2_bridge_status lexbor_libxml2_bridge_convert( /* xmlIsID does some other stuff too that is irrelevant here. */ if (local_name_length == 2 && local_name[0] == 'i' && local_name[1] == 'd' && attr->node.ns == LXB_NS_HTML) { - xmlAddID(NULL, lxml_doc, value, lxml_attr); + if (xmlAddID(NULL, lxml_doc, value, lxml_attr) == 0) { + /* If the ID already exists, the ID attribute still needs to be marked as an ID. */ + lxml_attr->atype = XML_ATTRIBUTE_ID; + } } /* libxml2 doesn't support line numbers on this anyway, it derives them instead, so don't bother */ diff --git a/ext/dom/tests/modern/html/interactions/gh20281.phpt b/ext/dom/tests/modern/html/interactions/gh20281.phpt new file mode 100644 index 00000000000..324c5a27563 --- /dev/null +++ b/ext/dom/tests/modern/html/interactions/gh20281.phpt @@ -0,0 +1,15 @@ +--TEST-- +GH-20281 (\Dom\Document::getElementById() is inconsistent after nodes are removed) +--EXTENSIONS-- +dom +--CREDITS-- +cscott +--FILE-- +b
c
', LIBXML_NOERROR); +$p = $d->getElementById('a'); +$p->remove(); +echo $d->getElementById('a')->textContent, "\n"; +?> +--EXPECT-- +c