@@ -785,37 +785,52 @@ static xmlNodePtr dom_insert_fragment(xmlNodePtr nodep, xmlNodePtr prevsib, xmlN
785785}
786786/* }}} */
787787
788- /* {{{ URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-952280727
789- Since:
790- */
791- static void dom_node_insert_before_legacy (zval * return_value , zval * ref , dom_object * intern , dom_object * childobj , xmlNodePtr parentp , xmlNodePtr child )
788+ static bool dom_node_check_legacy_insertion_validity (xmlNodePtr parentp , xmlNodePtr child , bool stricterror )
792789{
793- if (!dom_node_children_valid (parentp )) {
794- RETURN_FALSE ;
795- }
796-
797- xmlNodePtr new_child = NULL ;
798- bool stricterror = dom_get_strict_error (intern -> document );
799-
800790 if (dom_node_is_read_only (parentp ) == SUCCESS ||
801791 (child -> parent != NULL && dom_node_is_read_only (child -> parent ) == SUCCESS )) {
802792 php_dom_throw_error (NO_MODIFICATION_ALLOWED_ERR , stricterror );
803- RETURN_FALSE ;
793+ return false ;
804794 }
805795
806796 if (dom_hierarchy (parentp , child ) == FAILURE ) {
807797 php_dom_throw_error (HIERARCHY_REQUEST_ERR , stricterror );
808- RETURN_FALSE ;
798+ return false ;
809799 }
810800
811801 if (child -> doc != parentp -> doc && child -> doc != NULL ) {
812802 php_dom_throw_error (WRONG_DOCUMENT_ERR , stricterror );
813- RETURN_FALSE ;
803+ return false ;
814804 }
815805
816806 if (child -> type == XML_DOCUMENT_FRAG_NODE && child -> children == NULL ) {
817807 /* TODO Drop Warning? */
818808 php_error_docref (NULL , E_WARNING , "Document Fragment is empty" );
809+ return false;
810+ }
811+
812+ /* In old DOM only text nodes and entity nodes can be added as children to attributes. */
813+ if (parentp -> type == XML_ATTRIBUTE_NODE && child -> type != XML_TEXT_NODE && child -> type != XML_ENTITY_REF_NODE ) {
814+ php_dom_throw_error (HIERARCHY_REQUEST_ERR , stricterror );
815+ return false;
816+ }
817+
818+ return true;
819+ }
820+
821+ /* {{{ URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-952280727
822+ Since:
823+ */
824+ static void dom_node_insert_before_legacy (zval * return_value , zval * ref , dom_object * intern , dom_object * childobj , xmlNodePtr parentp , xmlNodePtr child )
825+ {
826+ if (!dom_node_children_valid (parentp )) {
827+ RETURN_FALSE ;
828+ }
829+
830+ xmlNodePtr new_child = NULL ;
831+ bool stricterror = dom_get_strict_error (intern -> document );
832+
833+ if (!dom_node_check_legacy_insertion_validity (parentp , child , stricterror )) {
819834 RETURN_FALSE ;
820835 }
821836
@@ -1245,25 +1260,7 @@ static void dom_node_append_child_legacy(zval *return_value, dom_object *intern,
12451260
12461261 bool stricterror = dom_get_strict_error (intern -> document );
12471262
1248- if (dom_node_is_read_only (nodep ) == SUCCESS ||
1249- (child -> parent != NULL && dom_node_is_read_only (child -> parent ) == SUCCESS )) {
1250- php_dom_throw_error (NO_MODIFICATION_ALLOWED_ERR , stricterror );
1251- RETURN_FALSE ;
1252- }
1253-
1254- if (dom_hierarchy (nodep , child ) == FAILURE ) {
1255- php_dom_throw_error (HIERARCHY_REQUEST_ERR , stricterror );
1256- RETURN_FALSE ;
1257- }
1258-
1259- if (!(child -> doc == NULL || child -> doc == nodep -> doc )) {
1260- php_dom_throw_error (WRONG_DOCUMENT_ERR , stricterror );
1261- RETURN_FALSE ;
1262- }
1263-
1264- if (child -> type == XML_DOCUMENT_FRAG_NODE && child -> children == NULL ) {
1265- /* TODO Drop Warning? */
1266- php_error_docref (NULL , E_WARNING , "Document Fragment is empty" );
1263+ if (!dom_node_check_legacy_insertion_validity (nodep , child , stricterror )) {
12671264 RETURN_FALSE ;
12681265 }
12691266
0 commit comments