diff --git a/ext/dom/inner_outer_html_mixin.c b/ext/dom/inner_outer_html_mixin.c index 7dc1199fdeb..37283ef3511 100644 --- a/ext/dom/inner_outer_html_mixin.c +++ b/ext/dom/inner_outer_html_mixin.c @@ -374,6 +374,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); + /* 5. Replace all with fragment within context. */ dom_remove_all_children(context_node); return php_dom_pre_insert(obj->document, fragment, context_node, NULL) ? SUCCESS : FAILURE; @@ -451,6 +454,9 @@ zend_result dom_element_outer_html_write(dom_object *obj, zval *newval) return FAILURE; } + ZEND_ASSERT(obj->document != NULL); + php_libxml_invalidate_node_list_cache(obj->document); + /* 7. Replace this with fragment within this's parent. */ if (!php_dom_pre_insert(obj->document, fragment, this->parent, this)) { xmlFreeNode(fragment); diff --git a/ext/dom/tests/modern/common/innerHTML_cache_invalidation.phpt b/ext/dom/tests/modern/common/innerHTML_cache_invalidation.phpt new file mode 100644 index 00000000000..976be202cec --- /dev/null +++ b/ext/dom/tests/modern/common/innerHTML_cache_invalidation.phpt @@ -0,0 +1,27 @@ +--TEST-- +$innerHTML cache invalidation +--EXTENSIONS-- +dom +--FILE-- +'); +$els = $dom->getElementsByTagName('a'); +var_dump($els[0]->tagName); + +$dom->documentElement->innerHTML = ''; + +echo $dom->saveXML(), "\n"; +var_dump($els); +var_dump($els[0]?->tagName); + +?> +--EXPECT-- +string(1) "a" + + +object(Dom\HTMLCollection)#2 (1) { + ["length"]=> + int(0) +} +NULL