msxml3: Move the whitespace preservation bool into the domdoc_properties struct.
This commit is contained in:
parent
8d101b269d
commit
e95122162a
|
@ -74,6 +74,7 @@ static const WCHAR PropValueXSLPatternW[] = {'X','S','L','P','a','t','t','e','r'
|
||||||
* We need to preserve this when reloading a document,
|
* We need to preserve this when reloading a document,
|
||||||
* and also need access to it from the libxml backend. */
|
* and also need access to it from the libxml backend. */
|
||||||
typedef struct _domdoc_properties {
|
typedef struct _domdoc_properties {
|
||||||
|
VARIANT_BOOL preserving;
|
||||||
struct list selectNsList;
|
struct list selectNsList;
|
||||||
xmlChar const* selectNsStr;
|
xmlChar const* selectNsStr;
|
||||||
LONG selectNsStr_len;
|
LONG selectNsStr_len;
|
||||||
|
@ -114,7 +115,6 @@ struct domdoc
|
||||||
VARIANT_BOOL async;
|
VARIANT_BOOL async;
|
||||||
VARIANT_BOOL validating;
|
VARIANT_BOOL validating;
|
||||||
VARIANT_BOOL resolving;
|
VARIANT_BOOL resolving;
|
||||||
VARIANT_BOOL preserving;
|
|
||||||
domdoc_properties* properties;
|
domdoc_properties* properties;
|
||||||
IXMLDOMSchemaCollection2* schema;
|
IXMLDOMSchemaCollection2* schema;
|
||||||
bsc_t *bsc;
|
bsc_t *bsc;
|
||||||
|
@ -244,6 +244,7 @@ static domdoc_properties * create_properties(const GUID *clsid)
|
||||||
domdoc_properties *properties = heap_alloc(sizeof(domdoc_properties));
|
domdoc_properties *properties = heap_alloc(sizeof(domdoc_properties));
|
||||||
|
|
||||||
list_init( &properties->selectNsList );
|
list_init( &properties->selectNsList );
|
||||||
|
properties->preserving = VARIANT_FALSE;
|
||||||
properties->selectNsStr = heap_alloc_zero(sizeof(xmlChar));
|
properties->selectNsStr = heap_alloc_zero(sizeof(xmlChar));
|
||||||
properties->selectNsStr_len = 0;
|
properties->selectNsStr_len = 0;
|
||||||
properties->XPath = FALSE;
|
properties->XPath = FALSE;
|
||||||
|
@ -268,6 +269,7 @@ static domdoc_properties* copy_properties(domdoc_properties const* properties)
|
||||||
|
|
||||||
if (pcopy)
|
if (pcopy)
|
||||||
{
|
{
|
||||||
|
pcopy->preserving = properties->preserving;
|
||||||
pcopy->XPath = properties->XPath;
|
pcopy->XPath = properties->XPath;
|
||||||
pcopy->selectNsStr_len = properties->selectNsStr_len;
|
pcopy->selectNsStr_len = properties->selectNsStr_len;
|
||||||
list_init( &pcopy->selectNsList );
|
list_init( &pcopy->selectNsList );
|
||||||
|
@ -324,6 +326,16 @@ xmlNodePtr xmldoc_unlink_xmldecl(xmlDocPtr doc)
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOL is_preserving_whitespace(xmlNodePtr node)
|
||||||
|
{
|
||||||
|
domdoc_properties* properties = NULL;
|
||||||
|
/* during parsing the xmlDoc._private stuff is not there */
|
||||||
|
if (priv_from_xmlDocPtr(node->doc))
|
||||||
|
properties = properties_from_xmlDocPtr(node->doc);
|
||||||
|
return ((properties && properties->preserving == VARIANT_TRUE) ||
|
||||||
|
xmlNodeGetSpacePreserve(node) == 1);
|
||||||
|
}
|
||||||
|
|
||||||
static inline BOOL strn_isspace(xmlChar const* str, int len)
|
static inline BOOL strn_isspace(xmlChar const* str, int len)
|
||||||
{
|
{
|
||||||
for (; str && len > 0 && *str; ++str, --len)
|
for (; str && len > 0 && *str; ++str, --len)
|
||||||
|
@ -341,17 +353,11 @@ static void sax_characters(void *ctx, const xmlChar *ch, int len)
|
||||||
pctx = (xmlParserCtxtPtr) ctx;
|
pctx = (xmlParserCtxtPtr) ctx;
|
||||||
This = (domdoc const*) pctx->_private;
|
This = (domdoc const*) pctx->_private;
|
||||||
|
|
||||||
if (!This->preserving)
|
/* during domdoc_loadXML() the xmlDocPtr->_private data is not available */
|
||||||
{
|
if (!This->properties->preserving &&
|
||||||
xmlChar* ws = xmlGetNsProp(pctx->node, BAD_CAST "space", XML_XML_NAMESPACE);
|
!is_preserving_whitespace(pctx->node) &&
|
||||||
if ((!ws || xmlStrcmp(ws, BAD_CAST "preserve") != 0) &&
|
strn_isspace(ch, len))
|
||||||
strn_isspace(ch, len))
|
return;
|
||||||
{
|
|
||||||
xmlFree(ws);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
xmlFree(ws);
|
|
||||||
}
|
|
||||||
|
|
||||||
xmlSAX2Characters(ctx, ch, len);
|
xmlSAX2Characters(ctx, ch, len);
|
||||||
}
|
}
|
||||||
|
@ -2331,8 +2337,8 @@ static HRESULT WINAPI domdoc_get_preserveWhiteSpace(
|
||||||
VARIANT_BOOL* isPreserving )
|
VARIANT_BOOL* isPreserving )
|
||||||
{
|
{
|
||||||
domdoc *This = impl_from_IXMLDOMDocument3( iface );
|
domdoc *This = impl_from_IXMLDOMDocument3( iface );
|
||||||
TRACE("(%p)->(%p: %d)\n", This, isPreserving, This->preserving);
|
TRACE("(%p)->(%p: %d)\n", This, isPreserving, This->properties->preserving);
|
||||||
*isPreserving = This->preserving;
|
*isPreserving = This->properties->preserving;
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2343,7 +2349,7 @@ static HRESULT WINAPI domdoc_put_preserveWhiteSpace(
|
||||||
{
|
{
|
||||||
domdoc *This = impl_from_IXMLDOMDocument3( iface );
|
domdoc *This = impl_from_IXMLDOMDocument3( iface );
|
||||||
TRACE("(%p)->(%d)\n", This, isPreserving);
|
TRACE("(%p)->(%d)\n", This, isPreserving);
|
||||||
This->preserving = isPreserving;
|
This->properties->preserving = isPreserving;
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3267,7 +3273,6 @@ HRESULT DOMDocument_create_from_xmldoc(xmlDocPtr xmldoc, IXMLDOMDocument3 **docu
|
||||||
doc->async = VARIANT_TRUE;
|
doc->async = VARIANT_TRUE;
|
||||||
doc->validating = 0;
|
doc->validating = 0;
|
||||||
doc->resolving = 0;
|
doc->resolving = 0;
|
||||||
doc->preserving = 0;
|
|
||||||
doc->properties = properties_from_xmlDocPtr(xmldoc);
|
doc->properties = properties_from_xmlDocPtr(xmldoc);
|
||||||
doc->error = S_OK;
|
doc->error = S_OK;
|
||||||
doc->schema = NULL;
|
doc->schema = NULL;
|
||||||
|
|
Loading…
Reference in New Issue