Skip to content

Commit

Permalink
Add missing cache invalidation for innerHTML (#16652)
Browse files Browse the repository at this point in the history
* Add test with wrong output

* Add missing cache invalidation for innerHTML
  • Loading branch information
nielsdos authored Oct 30, 2024
1 parent 65fbf47 commit d5e6dd8
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 0 deletions.
3 changes: 3 additions & 0 deletions ext/dom/inner_html_mixin.c
Original file line number Diff line number Diff line change
Expand Up @@ -359,6 +359,9 @@ zend_result dom_element_inner_html_write(dom_object *obj, zval *newval)
}
}

ZEND_ASSERT(obj->document != NULL);
php_libxml_invalidate_node_list_cache(obj->document);

dom_remove_all_children(context_node);
return php_dom_pre_insert(obj->document, fragment, context_node, NULL) ? SUCCESS : FAILURE;
}
Expand Down
27 changes: 27 additions & 0 deletions ext/dom/tests/modern/common/innerHTML_cache_invalidation.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
--TEST--
$innerHTML cache invalidation
--EXTENSIONS--
dom
--FILE--
<?php

$dom = Dom\XMLDocument::createFromString('<root><a/><a/><a/></root>');
$els = $dom->getElementsByTagName('a');
var_dump($els[0]->tagName);

$dom->documentElement->innerHTML = '<b/>';

echo $dom->saveXML(), "\n";
var_dump($els);
var_dump($els[0]?->tagName);

?>
--EXPECT--
string(1) "a"
<?xml version="1.0" encoding="UTF-8"?>
<root><b/></root>
object(Dom\HTMLCollection)#2 (1) {
["length"]=>
int(0)
}
NULL

0 comments on commit d5e6dd8

Please sign in to comment.