[PATCH] msxml3: Remove CRs in domtext_put_data and add them in domtext_get_xml.
Alex Henrie
alexhenrie24 at gmail.com
Sun Jun 4 23:24:04 CDT 2017
Fixes https://bugs.winehq.org/show_bug.cgi?id=42468
Signed-off-by: Alex Henrie <alexhenrie24 at gmail.com>
---
dlls/msxml3/tests/domdoc.c | 19 ++++++++++++++++++-
dlls/msxml3/text.c | 42 +++++++++++++++++++++++++++++++++++-------
2 files changed, 53 insertions(+), 8 deletions(-)
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index fa10a365f5..b6cf368d30 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -12007,6 +12007,7 @@ static void test_put_data(void)
VARIANT v;
BSTR get_data;
HRESULT hr;
+ LONG length;
doc = create_document(&IID_IXMLDOMDocument);
@@ -12113,7 +12114,6 @@ static void test_put_data(void)
hr = IXMLDOMText_get_data(text, &get_data);
ok(hr == S_OK, "got 0x%08x\n", hr);
-todo_wine
ok(!lstrcmpW(get_data, _bstr_("\n")), "got %s\n", wine_dbgstr_w(get_data));
SysFreeString(get_data);
@@ -12122,6 +12122,23 @@ todo_wine
ok(!lstrcmpW(get_data, _bstr_("\r\n")), "got %s\n", wine_dbgstr_w(get_data));
SysFreeString(get_data);
+ hr = IXMLDOMText_put_data(text, _bstr_("\r\r\n"));
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ hr = IXMLDOMText_get_data(text, &get_data);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(!lstrcmpW(get_data, _bstr_("\n\n")), "got %s\n", wine_dbgstr_w(get_data));
+ SysFreeString(get_data);
+
+ hr = IXMLDOMText_get_length(text, &length);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(length == 2, "got %d, expected 2\n", length);
+
+ hr = IXMLDOMText_get_xml(text, &get_data);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(!lstrcmpW(get_data, _bstr_("\r\n\r\n")), "got %s\n", wine_dbgstr_w(get_data));
+ SysFreeString(get_data);
+
IXMLDOMText_Release(text);
IXMLDOMNode_Release(node);
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;
}
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;
+ }
+
+ domtext_reset_noenc(This);
+ hr = node_set_content(&This->node, normalized_data);
+
+ SysFreeString(normalized_data);
+ return hr;
}
static HRESULT WINAPI domtext_get_length(
--
2.13.0
More information about the wine-patches
mailing list