diff options
author | Tjerk Meesters <datibbaw@php.net> | 2014-09-02 06:34:18 +0800 |
---|---|---|
committer | Tjerk Meesters <datibbaw@php.net> | 2014-09-02 06:34:18 +0800 |
commit | f54451cf399ebba0e52b42ab45de52f0f4bc3afb (patch) | |
tree | f6b03bf141b7237063356193a9497fad2b34ff78 /ext/dom | |
parent | 8da58e36b4facf3cccb14183303ded36eff95e71 (diff) | |
download | php-git-f54451cf399ebba0e52b42ab45de52f0f4bc3afb.tar.gz |
Make DOMNode::textContent writeable
Diffstat (limited to 'ext/dom')
-rw-r--r-- | ext/dom/attr.c | 9 | ||||
-rw-r--r-- | ext/dom/characterdata.c | 9 | ||||
-rw-r--r-- | ext/dom/document.c | 83 | ||||
-rw-r--r-- | ext/dom/node.c | 35 | ||||
-rw-r--r-- | ext/dom/php_dom.h | 14 | ||||
-rw-r--r-- | ext/dom/tests/node_textcontent.phpt | 29 |
6 files changed, 75 insertions, 104 deletions
diff --git a/ext/dom/attr.c b/ext/dom/attr.c index ebbc41f6f5..2976add461 100644 --- a/ext/dom/attr.c +++ b/ext/dom/attr.c @@ -183,14 +183,7 @@ int dom_attr_value_write(dom_object *obj, zval *newval TSRMLS_DC) node_list_unlink(attrp->children TSRMLS_CC); } - if (newval->type != IS_STRING) { - if(Z_REFCOUNT_P(newval) > 1) { - value_copy = *newval; - zval_copy_ctor(&value_copy); - newval = &value_copy; - } - convert_to_string(newval); - } + convert_to_string_copy(newval, value_copy); xmlNodeSetContentLen((xmlNodePtr) attrp, Z_STRVAL_P(newval), Z_STRLEN_P(newval) + 1); diff --git a/ext/dom/characterdata.c b/ext/dom/characterdata.c index 92eb280159..606886fed3 100644 --- a/ext/dom/characterdata.c +++ b/ext/dom/characterdata.c @@ -112,14 +112,7 @@ int dom_characterdata_data_write(dom_object *obj, zval *newval TSRMLS_DC) return FAILURE; } - if (newval->type != IS_STRING) { - if(Z_REFCOUNT_P(newval) > 1) { - value_copy = *newval; - zval_copy_ctor(&value_copy); - newval = &value_copy; - } - convert_to_string(newval); - } + convert_to_string_copy(newval, value_copy); xmlNodeSetContentLen(nodep, Z_STRVAL_P(newval), Z_STRLEN_P(newval) + 1); diff --git a/ext/dom/document.c b/ext/dom/document.c index 095f96dc09..3d8a1571d1 100644 --- a/ext/dom/document.c +++ b/ext/dom/document.c @@ -361,14 +361,7 @@ int dom_document_encoding_write(dom_object *obj, zval *newval TSRMLS_DC) return FAILURE; } - if (newval->type != IS_STRING) { - if(Z_REFCOUNT_P(newval) > 1) { - value_copy = *newval; - zval_copy_ctor(&value_copy); - newval = &value_copy; - } - convert_to_string(newval); - } + convert_to_string_copy(newval, value_copy); handler = xmlFindCharEncodingHandler(Z_STRVAL_P(newval)); @@ -428,12 +421,7 @@ int dom_document_standalone_write(dom_object *obj, zval *newval TSRMLS_DC) return FAILURE; } - if(Z_REFCOUNT_P(newval) > 1) { - value_copy = *newval; - zval_copy_ctor(&value_copy); - newval = &value_copy; - } - convert_to_long(newval); + convert_to_long_copy(newval, value_copy); standalone = Z_LVAL_P(newval); if (standalone > 0) { @@ -500,14 +488,7 @@ int dom_document_version_write(dom_object *obj, zval *newval TSRMLS_DC) xmlFree((xmlChar *) docp->version ); } - if (newval->type != IS_STRING) { - if(Z_REFCOUNT_P(newval) > 1) { - value_copy = *newval; - zval_copy_ctor(&value_copy); - newval = &value_copy; - } - convert_to_string(newval); - } + convert_to_string_copy(newval, value_copy); docp->version = xmlStrdup((const xmlChar *) Z_STRVAL_P(newval)); @@ -544,12 +525,7 @@ int dom_document_strict_error_checking_write(dom_object *obj, zval *newval TSRML zval value_copy; dom_doc_propsptr doc_prop; - if(Z_REFCOUNT_P(newval) > 1) { - value_copy = *newval; - zval_copy_ctor(&value_copy); - newval = &value_copy; - } - convert_to_boolean(newval); + convert_to_boolean_copy(newval, value_copy); if (obj->document) { doc_prop = dom_get_doc_props(obj->document); @@ -587,12 +563,7 @@ int dom_document_format_output_write(dom_object *obj, zval *newval TSRMLS_DC) zval value_copy; dom_doc_propsptr doc_prop; - if(Z_REFCOUNT_P(newval) > 1) { - value_copy = *newval; - zval_copy_ctor(&value_copy); - newval = &value_copy; - } - convert_to_boolean(newval); + convert_to_boolean_copy(newval, value_copy); if (obj->document) { doc_prop = dom_get_doc_props(obj->document); @@ -629,12 +600,7 @@ int dom_document_validate_on_parse_write(dom_object *obj, zval *newval TSRMLS_DC zval value_copy; dom_doc_propsptr doc_prop; - if(Z_REFCOUNT_P(newval) > 1) { - value_copy = *newval; - zval_copy_ctor(&value_copy); - newval = &value_copy; - } - convert_to_boolean(newval); + convert_to_boolean_copy(newval, value_copy); if (obj->document) { doc_prop = dom_get_doc_props(obj->document); @@ -671,12 +637,7 @@ int dom_document_resolve_externals_write(dom_object *obj, zval *newval TSRMLS_DC zval value_copy; dom_doc_propsptr doc_prop; - if(Z_REFCOUNT_P(newval) > 1) { - value_copy = *newval; - zval_copy_ctor(&value_copy); - newval = &value_copy; - } - convert_to_boolean(newval); + convert_to_boolean_copy(newval, value_copy); if (obj->document) { doc_prop = dom_get_doc_props(obj->document); @@ -713,12 +674,7 @@ int dom_document_preserve_whitespace_write(dom_object *obj, zval *newval TSRMLS_ zval value_copy; dom_doc_propsptr doc_prop; - if(Z_REFCOUNT_P(newval) > 1) { - value_copy = *newval; - zval_copy_ctor(&value_copy); - newval = &value_copy; - } - convert_to_boolean(newval); + convert_to_boolean_copy(newval, value_copy); if (obj->document) { doc_prop = dom_get_doc_props(obj->document); @@ -755,12 +711,7 @@ int dom_document_recover_write(dom_object *obj, zval *newval TSRMLS_DC) zval value_copy; dom_doc_propsptr doc_prop; - if(Z_REFCOUNT_P(newval) > 1) { - value_copy = *newval; - zval_copy_ctor(&value_copy); - newval = &value_copy; - } - convert_to_boolean(newval); + convert_to_boolean_copy(newval, value_copy); if (obj->document) { doc_prop = dom_get_doc_props(obj->document); @@ -797,12 +748,7 @@ int dom_document_substitue_entities_write(dom_object *obj, zval *newval TSRMLS_D zval value_copy; dom_doc_propsptr doc_prop; - if(Z_REFCOUNT_P(newval) > 1) { - value_copy = *newval; - zval_copy_ctor(&value_copy); - newval = &value_copy; - } - convert_to_boolean(newval); + convert_to_boolean_copy(newval, value_copy); if (obj->document) { doc_prop = dom_get_doc_props(obj->document); @@ -861,14 +807,7 @@ int dom_document_document_uri_write(dom_object *obj, zval *newval TSRMLS_DC) xmlFree((xmlChar *) docp->URL); } - if (newval->type != IS_STRING) { - if(Z_REFCOUNT_P(newval) > 1) { - value_copy = *newval; - zval_copy_ctor(&value_copy); - newval = &value_copy; - } - convert_to_string(newval); - } + convert_to_string_copy(newval, value_copy); docp->URL = xmlStrdup((const xmlChar *) Z_STRVAL_P(newval)); diff --git a/ext/dom/node.c b/ext/dom/node.c index ae74ea04cf..2c484adae9 100644 --- a/ext/dom/node.c +++ b/ext/dom/node.c @@ -352,14 +352,7 @@ int dom_node_node_value_write(dom_object *obj, zval *newval TSRMLS_DC) case XML_COMMENT_NODE: case XML_CDATA_SECTION_NODE: case XML_PI_NODE: - if (newval->type != IS_STRING) { - if(Z_REFCOUNT_P(newval) > 1) { - value_copy = *newval; - zval_copy_ctor(&value_copy); - newval = &value_copy; - } - convert_to_string(newval); - } + convert_to_string_copy(newval, value_copy); xmlNodeSetContentLen(nodep, Z_STRVAL_P(newval), Z_STRLEN_P(newval) + 1); if (newval == &value_copy) { zval_dtor(newval); @@ -794,14 +787,7 @@ int dom_node_prefix_write(dom_object *obj, zval *newval TSRMLS_DC) nsnode = xmlDocGetRootElement(nodep->doc); } } - if (newval->type != IS_STRING) { - if(Z_REFCOUNT_P(newval) > 1) { - value_copy = *newval; - zval_copy_ctor(&value_copy); - newval = &value_copy; - } - convert_to_string(newval); - } + convert_to_string_copy(newval, value_copy); prefix = Z_STRVAL_P(newval); if (nsnode && nodep->ns != NULL && !xmlStrEqual(nodep->ns->prefix, (xmlChar *)prefix)) { strURI = (char *) nodep->ns->href; @@ -942,6 +928,23 @@ int dom_node_text_content_read(dom_object *obj, zval **retval TSRMLS_DC) int dom_node_text_content_write(dom_object *obj, zval *newval TSRMLS_DC) { + xmlNode *nodep = dom_object_get_node(obj); + zval value_copy; + xmlChar *enc_str; + + if (nodep == NULL) { + php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC); + return FAILURE; + } + + convert_to_string_copy(newval, value_copy); + enc_str = xmlEncodeEntitiesReentrant(nodep->doc, Z_STRVAL_P(newval)); + xmlNodeSetContent(nodep, enc_str); + xmlFree(enc_str); + if (newval == &value_copy) { + zval_dtor(newval); + } + return SUCCESS; } diff --git a/ext/dom/php_dom.h b/ext/dom/php_dom.h index f2bccf7b87..f5f0bc6a72 100644 --- a/ext/dom/php_dom.h +++ b/ext/dom/php_dom.h @@ -146,6 +146,20 @@ entry = zend_register_internal_class_ex(&ce, parent_ce, NULL TSRMLS_CC); php_error_docref(NULL TSRMLS_CC, E_WARNING, "Not yet implemented"); \ return; +#define convert_to_copy_master(orig, copy, lower_type, upper_type) \ + if (Z_TYPE_P(orig) != IS_##upper_type) { \ + if (Z_REFCOUNT_P(orig) > 1) { \ + copy = *orig; \ + zval_copy_ctor(©); \ + orig = © \ + } \ + convert_to_##lower_type(orig); \ + } + +#define convert_to_string_copy(orig, copy) convert_to_copy_master(orig, copy, string, STRING); +#define convert_to_long_copy(orig, copy) convert_to_copy_master(orig, copy, long, LONG); +#define convert_to_boolean_copy(orig, copy) convert_to_copy_master(orig, copy, boolean, BOOL); + #define DOM_NODELIST 0 #define DOM_NAMEDNODEMAP 1 diff --git a/ext/dom/tests/node_textcontent.phpt b/ext/dom/tests/node_textcontent.phpt new file mode 100644 index 0000000000..a731a264aa --- /dev/null +++ b/ext/dom/tests/node_textcontent.phpt @@ -0,0 +1,29 @@ +--TEST-- +Testing reading and writing to DOMNode::textContent +--SKIPIF-- +<?php require_once('skipif.inc'); ?> +--FILE-- +<?php + +$html = <<<HTML +<div id="test"><span>hi there</span></div> +HTML; + +$text = '<p>hello world ™</p>'; + +$dom = new DOMDocument('1.0', 'UTF-8'); +$dom->loadHTML($html); + +$node = $dom->getElementById('test'); +var_dump($node->textContent); +$node->textContent = $text; +var_dump($node->textContent == $text); + +var_dump($dom->saveHTML($node)); + +?> +--EXPECT-- +string(8) "hi there" +bool(true) +string(63) "<div id="test"><p>hello world &trade;</p></div>" + |