1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 00:02:20 +01:00
Files
archived-php-src/ext/dom/tests/bug79701/id_property.phpt
Niels Dossche 8dc2391bae Fix bug #79701: getElementById does not correctly work with duplicate definitions
This is a long standing bug: IDs aren't properly tracked causing either
outdated or plain incorrect results from getElementById.

This PR implements a pragmatic solution in which we still try to use the
ID lookup table to a degree, but only as a performance boost not as a
"single source of truth". Full details are explained in the
getElementById code.

Closes GH-14349.
2024-06-01 12:55:05 +02:00

54 lines
1.4 KiB
PHP

--TEST--
Bug #79701 (getElementById does not correctly work with duplicate definitions) - id property variation
--EXTENSIONS--
dom
--FILE--
<?php
$dom = Dom\XMLDocument::createFromString(<<<XML
<root>
<test1/>
<test2/>
</root>
XML);
$test1 = $dom->documentElement->firstElementChild;
$test2 = $test1->nextElementSibling;
echo "--- After parsing ---\n";
var_dump($dom->getElementById("x")?->nodeName);
echo "--- After setting test2 ---\n";
$test2->id = "x";
var_dump($dom->getElementById("x")?->nodeName);
echo "--- After setting test1 ---\n";
$test1->id = "x";
var_dump($dom->getElementById("x")?->nodeName);
echo "--- After resetting test1 ---\n";
$test1->id = "y";
var_dump($dom->getElementById("x")?->nodeName);
echo "--- After resetting test2 ---\n";
$test2->id = "y";
var_dump($dom->getElementById("x")?->nodeName);
echo "--- After resetting test1 ---\n";
$test1->id = "x";
var_dump($dom->getElementById("x")?->nodeName);
echo "--- After calling setIdAttribute with false on test1 ---\n";
$test1->setIdAttribute("id", false);
var_dump($dom->getElementById("x")?->nodeName);
?>
--EXPECT--
--- After parsing ---
NULL
--- After setting test2 ---
string(5) "test2"
--- After setting test1 ---
string(5) "test1"
--- After resetting test1 ---
string(5) "test2"
--- After resetting test2 ---
NULL
--- After resetting test1 ---
string(5) "test1"
--- After calling setIdAttribute with false on test1 ---
NULL