[PATCH resend] msxml3: Remove CRs in domtext_put_data and add them in domtext_get_xml.
Alex Henrie
alexhenrie24 at gmail.com
Fri Aug 25 10:05:08 CDT 2017
2017-08-17 13:34 GMT-06:00 Nikolay Sivov <bunglehead at gmail.com>:
> On 03.08.2017 18:17, Alex Henrie wrote:
>> Fixes https://bugs.winehq.org/show_bug.cgi?id=42468
>>
>> To be clear, I am not trying to fix all whitespace processing issues. I
>> am only trying to prevent "
" from being erroneously inserted into
>> the output.
>>
>> Signed-off-by: Alex Henrie <alexhenrie24 at gmail.com>
>> ---
>> dlls/msxml3/tests/domdoc.c | 106 +++++++++++++++++++++++++++++++++++++--------
>> dlls/msxml3/text.c | 42 +++++++++++++++---
>> 2 files changed, 122 insertions(+), 26 deletions(-)
>>
>> diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
>
> I think it needs more tests, for xml:space and put_preserveWhiteSpace().
Okay, I've added tests for xml:space="preserve" and preserveWhiteSpace.
>> diff --git a/dlls/msxml3/text.c b/dlls/msxml3/text.c
>> index 3a12d4bf62..6814c1f817 100644
>> --- a/dlls/msxml3/text.c
>> +++ b/dlls/msxml3/text.c
>> @@ -519,10 +519,15 @@ static HRESULT WINAPI domtext_get_xml(
>> BSTR* p)
>> {
>> domtext *This = impl_from_IXMLDOMText( iface );
>> + HRESULT hr;
>>
>> TRACE("(%p)->(%p)\n", This, p);
>>
>> - return node_get_xml(&This->node, FALSE, p);
>> + hr = node_get_xml(&This->node, FALSE, p);
>> + if (hr == S_OK)
>> + *p = EnsureCorrectEOL(*p);
>> +
>> + return hr;
>
> Will node_get_xml(..., TRUE, ...) work?
Yes, thanks for the suggestion!
>> }
>>
>> static HRESULT WINAPI domtext_transformNode(
>> @@ -616,15 +621,38 @@ static HRESULT WINAPI domtext_put_data(
>> BSTR data)
>> {
>> domtext *This = impl_from_IXMLDOMText( iface );
>> - static const WCHAR rnW[] = {'\r','\n',0};
>> + BSTR normalized_data = NULL;
>> + HRESULT hr;
>> + int i, j;
>>
>> TRACE("(%p)->(%s)\n", This, debugstr_w(data));
>>
>> - if (data && !strcmpW(rnW, data))
>> - This->node.node->name = xmlStringTextNoenc;
>> - else
>> - domtext_reset_noenc(This);
>> - return node_set_content(&This->node, data);
>> + if (data)
>> + {
>> + /* normalize line endings */
>> + normalized_data = SysAllocStringLen(NULL, SysStringLen(data));
>> + if (!normalized_data) return E_OUTOFMEMORY;
>> + for (i = 0, j = 0; data[i]; i++)
>> + {
>> + if (data[i] == '\r')
>> + {
>> + if (data[i + 1] == '\n')
>> + continue; /* change \r\n to just \n */
>> + else
>> + normalized_data[j] = '\n'; /* change \r by itself to \n */
>> + }
>> + else
>> + normalized_data[j] = data[i];
>> + j++;
>> + }
>> + normalized_data[j] = 0;
>
> The only purpose for that is to inhibit libxml2 escaping, right? Could
> this be done the way it is now, but with something more elaborate than
> comparing to "\r\n"?
No, because we only want to inhibit the escaping of "\r" to "
".
We don't want to inhibit the escaping of other characters such as "&"
and "<".
-Alex
More information about the wine-devel
mailing list