From ed246da9e84bb15c82f201e03c4b59b8f0e03750 Mon Sep 17 00:00:00 2001
From: Niels Dossche <7771979+nielsdos@users.noreply.github.com>
Date: Wed, 30 Oct 2024 21:36:00 +0100
Subject: [PATCH 1/2] Add test with wrong output
---
.../common/innerHTML_cache_invalidation.phpt | 27 +++++++++++++++++++
1 file changed, 27 insertions(+)
create mode 100644 ext/dom/tests/modern/common/innerHTML_cache_invalidation.phpt
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 0000000000000..fcde8f189e804
--- /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)
+}
+string(1) "a"
From ea42dd22bb3ce1f86523ca2a30e104e34c890847 Mon Sep 17 00:00:00 2001
From: Niels Dossche <7771979+nielsdos@users.noreply.github.com>
Date: Wed, 30 Oct 2024 21:37:06 +0100
Subject: [PATCH 2/2] Add missing cache invalidation for innerHTML
---
ext/dom/inner_html_mixin.c | 3 +++
ext/dom/tests/modern/common/innerHTML_cache_invalidation.phpt | 2 +-
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/ext/dom/inner_html_mixin.c b/ext/dom/inner_html_mixin.c
index 262c85411aaf2..e72b205bf4628 100644
--- a/ext/dom/inner_html_mixin.c
+++ b/ext/dom/inner_html_mixin.c
@@ -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;
}
diff --git a/ext/dom/tests/modern/common/innerHTML_cache_invalidation.phpt b/ext/dom/tests/modern/common/innerHTML_cache_invalidation.phpt
index fcde8f189e804..976be202cece2 100644
--- a/ext/dom/tests/modern/common/innerHTML_cache_invalidation.phpt
+++ b/ext/dom/tests/modern/common/innerHTML_cache_invalidation.phpt
@@ -24,4 +24,4 @@ object(Dom\HTMLCollection)#2 (1) {
["length"]=>
int(0)
}
-string(1) "a"
+NULL