Skip to content

Commit 35e0c57

Browse files
committed
Test and handle manual creation better
1 parent fc9b3b9 commit 35e0c57

File tree

4 files changed

+56
-3
lines changed

4 files changed

+56
-3
lines changed

ext/dom/inner_html_mixin.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -351,9 +351,12 @@ zend_result dom_element_inner_html_write(dom_object *obj, zval *newval)
351351
return FAILURE;
352352
}
353353

354-
xmlNodePtr template_content = php_dom_retrieve_templated_content(php_dom_get_private_data(obj), context_node);
355-
if (template_content != NULL) {
356-
context_node = template_content;
354+
if (php_dom_ns_is_fast(context_node, php_dom_ns_is_html_magic_token) && xmlStrEqual(context_node->name, BAD_CAST "template")) {
355+
context_node = php_dom_ensure_templated_content(php_dom_get_private_data(obj), context_node);
356+
if (context_node == NULL) {
357+
xmlFreeNode(fragment);
358+
return FAILURE;
359+
}
357360
}
358361

359362
/* We skip the steps involving the template element as context node since we don't do special handling for that. */

ext/dom/private_data.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,19 @@ xmlNodePtr php_dom_retrieve_templated_content(php_dom_private_data *private_data
107107
return zend_hash_index_find_ptr(private_data->template_fragments, dom_mangle_pointer_for_key(template_node));
108108
}
109109

110+
xmlNodePtr php_dom_ensure_templated_content(php_dom_private_data *private_data, xmlNodePtr template_node)
111+
{
112+
xmlNodePtr result = php_dom_retrieve_templated_content(private_data, template_node);
113+
if (result == NULL) {
114+
result = xmlNewDocFragment(template_node->doc);
115+
if (EXPECTED(result != NULL)) {
116+
result->parent = template_node;
117+
php_dom_add_templated_content(private_data, template_node, result);
118+
}
119+
}
120+
return result;
121+
}
122+
110123
void php_dom_remove_templated_content(php_dom_private_data *private_data, const xmlNode *template_node)
111124
{
112125
if (private_data->template_fragments != NULL) {

ext/dom/private_data.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ PHP_DOM_EXPORT php_dom_private_data *php_dom_private_data_create(void);
4242
void php_dom_private_data_destroy(php_dom_private_data *data);
4343
void php_dom_add_templated_content(php_dom_private_data *private_data, const xmlNode *template_node, xmlNodePtr fragment);
4444
xmlNodePtr php_dom_retrieve_templated_content(php_dom_private_data *private_data, const xmlNode *template_node);
45+
xmlNodePtr php_dom_ensure_templated_content(php_dom_private_data *private_data, xmlNodePtr template_node);
4546
void php_dom_remove_templated_content(php_dom_private_data *private_data, const xmlNode *template_node);
4647

4748
#endif
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
--TEST--
2+
<template> element manual creation
3+
--EXTENSIONS--
4+
dom
5+
--FILE--
6+
<?php
7+
8+
echo "=== After creation ===\n";
9+
10+
$dom = Dom\HTMLDocument::createEmpty();
11+
$template = $dom->appendChild($dom->createElement("template"));
12+
var_dump($template->innerHTML);
13+
echo $dom->saveXML(), "\n";
14+
echo $dom->saveHTML(), "\n";
15+
16+
echo "=== After setting content ===\n";
17+
18+
$template->innerHTML = "<p>hello</template></p>";
19+
var_dump($template->innerHTML);
20+
var_dump($template->firstChild);
21+
echo $dom->saveXML(), "\n";
22+
echo $dom->saveHTML(), "\n";
23+
24+
?>
25+
--EXPECT--
26+
=== After creation ===
27+
string(0) ""
28+
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
29+
<template xmlns="http://www.w3.org/1999/xhtml"></template>
30+
<template></template>
31+
=== After setting content ===
32+
string(12) "<p>hello</p>"
33+
NULL
34+
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
35+
<template xmlns="http://www.w3.org/1999/xhtml"><p>hello</p></template>
36+
<template><p>hello</p></template>

0 commit comments

Comments
 (0)