Skip to content

Commit 768900b

Browse files
committed
Implement Dom $innerHTML property
1 parent 162e71e commit 768900b

26 files changed

+1025
-81
lines changed

ext/dom/config.m4

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ if test "$PHP_DOM" != "no"; then
3232
parentnode/tree.c parentnode/css_selectors.c \
3333
processinginstruction.c cdatasection.c \
3434
documentfragment.c domimplementation.c \
35-
element.c node.c characterdata.c \
35+
element.c node.c characterdata.c inner_html_mixin.c \
3636
documenttype.c entity.c \
3737
nodelist.c html_collection.c text.c comment.c \
3838
entityreference.c \

ext/dom/config.w32

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ if (PHP_DOM == "yes") {
1010
EXTENSION("dom", "php_dom.c attr.c document.c infra.c \
1111
xml_document.c html_document.c xml_serializer.c html5_serializer.c html5_parser.c namespace_compat.c \
1212
domexception.c processinginstruction.c \
13-
cdatasection.c documentfragment.c domimplementation.c element.c \
13+
cdatasection.c documentfragment.c domimplementation.c element.c inner_html_mixin.c \
1414
node.c characterdata.c documenttype.c \
1515
entity.c nodelist.c html_collection.c text.c comment.c \
1616
entityreference.c \

ext/dom/dom_properties.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ zend_result dom_element_class_name_write(dom_object *obj, zval *newval);
8383
zend_result dom_element_id_read(dom_object *obj, zval *retval);
8484
zend_result dom_element_id_write(dom_object *obj, zval *newval);
8585
zend_result dom_element_schema_type_info_read(dom_object *obj, zval *retval);
86+
zend_result dom_element_inner_html_read(dom_object *obj, zval *retval);
87+
zend_result dom_element_inner_html_write(dom_object *obj, zval *newval);
8688

8789
/* entity properties */
8890
zend_result dom_entity_public_id_read(dom_object *obj, zval *retval);

ext/dom/html5_parser.c

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ static zend_always_inline xmlNodePtr lexbor_libxml2_bridge_new_text_node_fast(xm
9999
static lexbor_libxml2_bridge_status lexbor_libxml2_bridge_convert(
100100
lxb_dom_node_t *start_node,
101101
xmlDocPtr lxml_doc,
102+
xmlNodePtr root,
102103
bool compact_text_nodes,
103104
bool create_default_ns,
104105
php_dom_libxml_ns_mapper *ns_mapper
@@ -114,7 +115,7 @@ static lexbor_libxml2_bridge_status lexbor_libxml2_bridge_convert(
114115
lexbor_array_obj_init(&work_list, WORK_LIST_INIT_SIZE, sizeof(work_list_item));
115116

116117
for (lxb_dom_node_t *node = start_node; node != NULL; node = node->prev) {
117-
lexbor_libxml2_bridge_work_list_item_push(&work_list, node, LXB_NS__UNDEF, (xmlNodePtr) lxml_doc, NULL);
118+
lexbor_libxml2_bridge_work_list_item_push(&work_list, node, LXB_NS__UNDEF, root, NULL);
118119
}
119120

120121
work_list_item *current_stack_item;
@@ -316,6 +317,7 @@ lexbor_libxml2_bridge_status lexbor_libxml2_bridge_convert_document(
316317
lexbor_libxml2_bridge_status status = lexbor_libxml2_bridge_convert(
317318
lxb_dom_interface_node(document)->last_child,
318319
lxml_doc,
320+
(xmlNodePtr) lxml_doc,
319321
compact_text_nodes,
320322
create_default_ns,
321323
ns_mapper
@@ -328,6 +330,35 @@ lexbor_libxml2_bridge_status lexbor_libxml2_bridge_convert_document(
328330
return LEXBOR_LIBXML2_BRIDGE_STATUS_OK;
329331
}
330332

333+
lexbor_libxml2_bridge_status lexbor_libxml2_bridge_convert_fragment(
334+
lxb_dom_node_t *start_node,
335+
xmlDocPtr lxml_doc,
336+
xmlNodePtr *fragment_out,
337+
bool compact_text_nodes,
338+
bool create_default_ns,
339+
php_dom_libxml_ns_mapper *ns_mapper
340+
)
341+
{
342+
xmlNodePtr fragment = xmlNewDocFragment(lxml_doc);
343+
if (UNEXPECTED(fragment == NULL)) {
344+
return LEXBOR_LIBXML2_BRIDGE_STATUS_OOM;
345+
}
346+
lexbor_libxml2_bridge_status status = lexbor_libxml2_bridge_convert(
347+
start_node,
348+
lxml_doc,
349+
fragment,
350+
compact_text_nodes,
351+
create_default_ns,
352+
ns_mapper
353+
);
354+
if (status != LEXBOR_LIBXML2_BRIDGE_STATUS_OK) {
355+
xmlFreeNode(fragment);
356+
return status;
357+
}
358+
*fragment_out = fragment;
359+
return LEXBOR_LIBXML2_BRIDGE_STATUS_OK;
360+
}
361+
331362
void lexbor_libxml2_bridge_report_errors(
332363
const lexbor_libxml2_bridge_parse_context *ctx,
333364
lxb_html_parser_t *parser,
@@ -376,12 +407,22 @@ void lexbor_libxml2_bridge_report_errors(
376407
*error_index_offset_tree = index;
377408
}
378409

410+
static php_libxml_quirks_mode dom_translate_quirks_mode(lxb_dom_document_cmode_t quirks_mode)
411+
{
412+
switch (quirks_mode) {
413+
case LXB_DOM_DOCUMENT_CMODE_NO_QUIRKS: return PHP_LIBXML_NO_QUIRKS;
414+
case LXB_DOM_DOCUMENT_CMODE_LIMITED_QUIRKS: return PHP_LIBXML_LIMITED_QUIRKS;
415+
case LXB_DOM_DOCUMENT_CMODE_QUIRKS: return PHP_LIBXML_QUIRKS;
416+
EMPTY_SWITCH_DEFAULT_CASE();
417+
}
418+
}
419+
379420
void lexbor_libxml2_bridge_copy_observations(lxb_html_tree_t *tree, lexbor_libxml2_bridge_extracted_observations *observations)
380421
{
381422
observations->has_explicit_html_tag = tree->has_explicit_html_tag;
382423
observations->has_explicit_head_tag = tree->has_explicit_head_tag;
383424
observations->has_explicit_body_tag = tree->has_explicit_body_tag;
384-
observations->quirks_mode = lxb_dom_interface_document(tree->document)->compat_mode == LXB_DOM_DOCUMENT_CMODE_QUIRKS;
425+
observations->quirks_mode = dom_translate_quirks_mode(lxb_dom_interface_document(tree->document)->compat_mode);
385426
}
386427

387428
#endif /* HAVE_LIBXML && HAVE_DOM */

ext/dom/html5_parser.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ typedef struct _lexbor_libxml2_bridge_extracted_observations {
4747
bool has_explicit_html_tag;
4848
bool has_explicit_head_tag;
4949
bool has_explicit_body_tag;
50-
bool quirks_mode;
50+
php_libxml_quirks_mode quirks_mode;
5151
} lexbor_libxml2_bridge_extracted_observations;
5252

5353
typedef struct _lexbor_libxml2_bridge_parse_context {
@@ -73,6 +73,14 @@ lexbor_libxml2_bridge_status lexbor_libxml2_bridge_convert_document(
7373
bool create_default_ns,
7474
php_dom_libxml_ns_mapper *ns_mapper
7575
);
76+
lexbor_libxml2_bridge_status lexbor_libxml2_bridge_convert_fragment(
77+
lxb_dom_node_t *start_node,
78+
xmlDocPtr lxml_doc,
79+
xmlNodePtr *fragment_out,
80+
bool compact_text_nodes,
81+
bool create_default_ns,
82+
php_dom_libxml_ns_mapper *ns_mapper
83+
);
7684
void lexbor_libxml2_bridge_report_errors(
7785
const lexbor_libxml2_bridge_parse_context *ctx,
7886
lxb_html_parser_t *parser,

0 commit comments

Comments
 (0)