From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/cdata.c | 47 ++++--------------------------------- dlls/msxml3/msxml_private.h | 1 + dlls/msxml3/node.c | 43 +++++++++++++++++++++++++++++++++ dlls/msxml3/tests/domdoc.c | 32 +++++++------------------ dlls/msxml3/text.c | 21 ++++------------- 5 files changed, 60 insertions(+), 84 deletions(-) diff --git a/dlls/msxml3/cdata.c b/dlls/msxml3/cdata.c index 8b5fd378700..898c77af579 100644 --- a/dlls/msxml3/cdata.c +++ b/dlls/msxml3/cdata.c @@ -636,52 +636,13 @@ static HRESULT WINAPI domcdata_replaceData( return hr; } -static HRESULT WINAPI domcdata_splitText( - IXMLDOMCDATASection *iface, - LONG offset, IXMLDOMText **txtNode) +static HRESULT WINAPI domcdata_splitText(IXMLDOMCDATASection *iface, LONG offset, IXMLDOMText **node) { - IXMLDOMDocument *doc; - LONG length = 0; - HRESULT hr; - - TRACE("%p, %ld, %p.\n", iface, offset, txtNode); - - if (!txtNode || offset < 0) return E_INVALIDARG; - - *txtNode = NULL; - - IXMLDOMCDATASection_get_length(iface, &length); - - if (offset > length) return E_INVALIDARG; - if (offset == length) return S_FALSE; - - hr = IXMLDOMCDATASection_get_ownerDocument(iface, &doc); - if (hr == S_OK) - { - BSTR data; + domcdata *cdata = impl_from_IXMLDOMCDATASection(iface); - hr = IXMLDOMCDATASection_substringData(iface, offset, length - offset, &data); - if (hr == S_OK) - { - hr = IXMLDOMDocument_createTextNode(doc, data, txtNode); - if (hr == S_OK) - { - IXMLDOMNode *parent; - - hr = IXMLDOMCDATASection_get_parentNode(iface, &parent); - if (hr == S_OK) - { - IXMLDOMCDATASection_deleteData(iface, 0, offset); - hr = IXMLDOMNode_appendChild(parent, (IXMLDOMNode*)*txtNode, NULL); - IXMLDOMNode_Release(parent); - } - } - SysFreeString(data); - } - IXMLDOMDocument_Release(doc); - } + TRACE("%p, %ld, %p.\n", iface, offset, node); - return hr; + return node_split_text(cdata->node, offset, node); } static const struct IXMLDOMCDATASectionVtbl domcdata_vtbl = diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h index b83b38f1af0..4346166c783 100644 --- a/dlls/msxml3/msxml_private.h +++ b/dlls/msxml3/msxml_private.h @@ -329,6 +329,7 @@ extern HRESULT node_save(struct domnode *, IStream *); extern HRESULT node_get_elements_by_tagname(struct domnode *,BSTR,IXMLDOMNodeList**); extern HRESULT node_validate(struct domnode *, IXMLDOMNode *, IXMLDOMParseError **); extern void node_move_children(struct domnode *dst, struct domnode *src); +extern HRESULT node_split_text(struct domnode *, LONG, IXMLDOMText **); extern UINT get_codepage_for_encoding(const WCHAR *encoding); diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index 31aa300a7eb..bcd331e3a83 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -4587,3 +4587,46 @@ void node_move_children(struct domnode *dest, struct domnode *src) domnode_append_child(dest, child); } } + +HRESULT node_split_text(struct domnode *node, LONG offset, IXMLDOMText **out) +{ + struct domnode *child; + ULONG length; + HRESULT hr; + BSTR head; + + if (!out || offset < 0) + return E_INVALIDARG; + + *out = NULL; + + length = SysStringLen(node->data); + if (offset > length) + return E_INVALIDARG; + if (offset == length) + return S_FALSE; + + if (FAILED(hr = domnode_create(node->type, NULL, 0, NULL, 0, node->owner, &child))) + return hr; + + if (offset) + { + child->data = SysAllocStringLen(node->data + offset, length - offset); + head = SysAllocStringLen(node->data, offset); + SysFreeString(node->data); + node->data = head; + } + else + { + child->data = node->data; + node->data = NULL; + } + + if (node->parent) + domnode_insert_domnode(node->parent, child, domnode_get_next_sibling(node)); + + if (FAILED(hr = create_node(child, (IXMLDOMNode **)out))) + domnode_unlink_child(child); + + return hr; +} diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index f89fa2e5e2f..3b1b6851a82 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -7702,7 +7702,6 @@ static void test_splitText(void) hr = IXMLDOMText_get_nodeType(text, &node_type); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(node_type == NODE_CDATA_SECTION, "Unexpected node type %d.\n", node_type); length = 0; @@ -7744,15 +7743,15 @@ static void test_splitText(void) ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); ok(text2 == 0, "got %p\n", text); - text2 = 0; + text2 = NULL; hr = IXMLDOMText_splitText(text, 4, &text2); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - if (text2) IXMLDOMText_Release(text2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + IXMLDOMText_Release(text2); - node = 0; + node = NULL; hr = IXMLDOMText_get_nextSibling(text, &node); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - if (node) IXMLDOMNode_Release(node); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + IXMLDOMNode_Release(node); IXMLDOMText_Release(text); @@ -7760,7 +7759,6 @@ static void test_splitText(void) length = 0; hr = IXMLDOMCDATASection_get_length(cdata, &length); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(length == 10, "Unexpected length %ld.\n", length); hr = IXMLDOMCDATASection_splitText(cdata, 0, &text); @@ -7768,17 +7766,14 @@ static void test_splitText(void) hr = IXMLDOMText_get_nodeType(text, &node_type); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(node_type == NODE_CDATA_SECTION, "Unexpected node type %d.\n", node_type); hr = IXMLDOMText_get_length(text, &length); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(length == 10, "Unexpected length %ld.\n", length); hr = IXMLDOMCDATASection_get_length(cdata, &length); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(!length, "Unexpected length %ld.\n", length); IXMLDOMText_Release(text); @@ -7829,11 +7824,8 @@ static void test_splitText(void) ok(!node, "Unexpected pointer %p.\n", node); hr = IXMLDOMText_splitText(text, 10, &text2); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); -if (hr == S_OK) -{ hr = IXMLDOMText_get_nodeType(text2, &node_type); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(node_type == NODE_TEXT, "Unexpected node type %d.\n", node_type); @@ -7876,7 +7868,7 @@ if (hr == S_OK) IXMLDOMNode_Release(node); IXMLDOMText_Release(text2); -} + IXMLDOMText_Release(text); IXMLDOMElement_Release(root); @@ -7887,17 +7879,14 @@ if (hr == S_OK) text = NULL; hr = IXMLDOMCDATASection_splitText(cdata, 9, &text); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IXMLDOMCDATASection_get_nextSibling(cdata, &node); ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); hr = IXMLDOMText_get_nodeType(text, &node_type); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(node_type == NODE_CDATA_SECTION, "Unexpected node type %d.\n", node_type); hr = IXMLDOMCDATASection_get_length(cdata, &length); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(length == 9, "Unexpected length %ld.\n", length); hr = IXMLDOMText_get_length(text, &length); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); @@ -7911,25 +7900,20 @@ if (hr == S_OK) text2 = NULL; hr = IXMLDOMText_splitText(text, 9, &text2); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IXMLDOMText_get_nextSibling(text, &node); ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); -if (text2) -{ hr = IXMLDOMText_get_nodeType(text2, &node_type); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(node_type == NODE_TEXT, "Unexpected node type %d.\n", node_type); hr = IXMLDOMText_get_length(text, &length); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(length == 9, "Unexpected length %ld.\n", length); hr = IXMLDOMText_get_length(text2, &length); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(length == 8, "Unexpected length %ld.\n", length); IXMLDOMText_Release(text2); -} + IXMLDOMText_Release(text); IXMLDOMDocument_Release(doc); diff --git a/dlls/msxml3/text.c b/dlls/msxml3/text.c index 70edaf12367..dbada1dbaa2 100644 --- a/dlls/msxml3/text.c +++ b/dlls/msxml3/text.c @@ -702,26 +702,13 @@ static HRESULT WINAPI domtext_replaceData( return hr; } -static HRESULT WINAPI domtext_splitText( - IXMLDOMText *iface, - LONG offset, IXMLDOMText **txtNode) +static HRESULT WINAPI domtext_splitText(IXMLDOMText *iface, LONG offset, IXMLDOMText **node) { - LONG length = 0; - - TRACE("%p, %ld, %p.\n", iface, offset, txtNode); - - if (!txtNode || offset < 0) return E_INVALIDARG; - - *txtNode = NULL; - - IXMLDOMText_get_length(iface, &length); - - if (offset > length) return E_INVALIDARG; - if (offset == length) return S_FALSE; + domtext *text = impl_from_IXMLDOMText(iface); - FIXME("adjacent text nodes are not supported\n"); + TRACE("%p, %ld, %p.\n", iface, offset, node); - return E_NOTIMPL; + return node_split_text(text->node, offset, node); } static const struct IXMLDOMTextVtbl domtext_vtbl = -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10679