From: Phiality <bakreski03@gmail.com> --- dlls/mshtml/tests/dom.js | 59 +++++++++++++++++ dlls/msxml3/tests/domdoc.c | 127 +++++++++++++++++++++++++++++++++++++ 2 files changed, 186 insertions(+) diff --git a/dlls/mshtml/tests/dom.js b/dlls/mshtml/tests/dom.js index 14ca1e8e3c8..d7dd1b4fc1d 100644 --- a/dlls/mshtml/tests/dom.js +++ b/dlls/mshtml/tests/dom.js @@ -1204,4 +1204,63 @@ sync_test("XMLSerializer", function() { result = serializer.serializeToString(elem); ok(result.indexOf("input") !== -1, "serialized string does not contain input tag: " + result); + + /* Test with empty element */ + var empty = document.createElement("br"); + result = serializer.serializeToString(empty); + ok(typeof result === "string", "serializeToString on empty element did not return string"); + ok(result.indexOf("br") !== -1, "serialized empty element does not contain tag name: " + result); + + /* Test with text node */ + var textContainer = document.createElement("p"); + textContainer.appendChild(document.createTextNode("plain text content")); + result = serializer.serializeToString(textContainer); + ok(result.indexOf("plain text content") !== -1, "serialized text node missing content: " + result); + + /* Test with special characters that need escaping */ + var specialChars = document.createElement("div"); + specialChars.textContent = "<test> & \"quotes\""; + result = serializer.serializeToString(specialChars); + ok(result.indexOf("<") !== -1 || result.indexOf("<test>") === -1, + "special characters should be escaped or not appear literally: " + result); + + /* Test with deeply nested elements */ + var outer = document.createElement("div"); + var middle = document.createElement("span"); + var inner = document.createElement("em"); + inner.textContent = "deep"; + middle.appendChild(inner); + outer.appendChild(middle); + result = serializer.serializeToString(outer); + ok(result.indexOf("div") !== -1, "missing outer div: " + result); + ok(result.indexOf("span") !== -1, "missing middle span: " + result); + ok(result.indexOf("em") !== -1, "missing inner em: " + result); + ok(result.indexOf("deep") !== -1, "missing deep text: " + result); + + /* Test with multiple children */ + var parent = document.createElement("ul"); + for (var i = 0; i < 3; i++) { + var li = document.createElement("li"); + li.textContent = "item" + i; + parent.appendChild(li); + } + result = serializer.serializeToString(parent); + ok(result.indexOf("item0") !== -1, "missing item0: " + result); + ok(result.indexOf("item1") !== -1, "missing item1: " + result); + ok(result.indexOf("item2") !== -1, "missing item2: " + result); + + /* Test that multiple serializers work independently */ + var serializer2 = new XMLSerializer(); + ok(serializer2 !== null, "second XMLSerializer constructor returned null"); + ok(serializer !== serializer2, "serializers should be different instances"); + + var div1 = document.createElement("div"); + div1.id = "first"; + var div2 = document.createElement("div"); + div2.id = "second"; + + var result1 = serializer.serializeToString(div1); + var result2 = serializer2.serializeToString(div2); + ok(result1.indexOf("first") !== -1, "first serializer wrong result: " + result1); + ok(result2.indexOf("second") !== -1, "second serializer wrong result: " + result2); }); diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 5163b96e60e..275ce75dfb5 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -14361,8 +14361,12 @@ static void test_embedded_xml_declaration(void) { IXMLDOMDocument *doc; IXMLDOMElement *elem; + IXMLDOMNode *node; + IXMLDOMNodeList *nodes; + BSTR str; VARIANT_BOOL b; HRESULT hr; + LONG len; /* Test XML with embedded <?xml?> declaration inside an element. * Windows MSXML tolerates this but libxml2 rejects it. @@ -14385,6 +14389,38 @@ static void test_embedded_xml_declaration(void) "<?xml version=\"1.0\"?>" "<root><child>text</child></root>"; + /* Test *XMLData element pattern - element content that should be wrapped */ + static const char xmldata_element_str[] = + "<?xml version=\"1.0\"?>" + "<root>" + " <CustomXMLData><item>value</item></CustomXMLData>" + "</root>"; + + /* Test multiple embedded declarations */ + static const char multi_embedded_str[] = + "<?xml version=\"1.0\"?>" + "<root>" + " <first><?xml version=\"1.0\"?><a>1</a></first>" + " <second><b>2</b></second>" + "</root>"; + + /* Test deeply nested embedded declaration */ + static const char deep_embedded_str[] = + "<?xml version=\"1.0\"?>" + "<root><level1><level2><data><?xml version=\"1.0\"?><deep>nested</deep></data></level2></level1></root>"; + + /* Test with encoding in embedded declaration */ + static const char embedded_with_encoding_str[] = + "<?xml version=\"1.0\"?>" + "<root>" + " <xmldata><?xml version=\"1.0\" encoding=\"UTF-8\"?><test>encoded</test></xmldata>" + "</root>"; + + /* Test self-closing XMLData element (should not need wrapping) */ + static const char selfclose_xmldata_str[] = + "<?xml version=\"1.0\"?>" + "<root><EmptyXMLData/></root>"; + doc = NULL; hr = CoCreateInstance(&CLSID_DOMDocument2, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (void**)&doc); @@ -14425,6 +14461,97 @@ static void test_embedded_xml_declaration(void) ok(hr == S_OK, "loadXML with embedded XML and xml:space failed: %#lx\n", hr); ok(b == VARIANT_TRUE, "failed to load XML with embedded declaration and xml:space\n"); + /* Test 4: *XMLData element with element content */ + b = VARIANT_FALSE; + hr = IXMLDOMDocument_loadXML(doc, _bstr_(xmldata_element_str), &b); + ok(hr == S_OK, "loadXML with *XMLData element failed: %#lx\n", hr); + ok(b == VARIANT_TRUE, "failed to load XML with *XMLData element\n"); + + if (b == VARIANT_TRUE) + { + hr = IXMLDOMDocument_get_documentElement(doc, &elem); + ok(hr == S_OK, "get_documentElement failed: %#lx\n", hr); + if (elem) + { + /* Verify we can access child elements */ + hr = IXMLDOMElement_get_childNodes(elem, &nodes); + ok(hr == S_OK, "get_childNodes failed: %#lx\n", hr); + if (nodes) + { + hr = IXMLDOMNodeList_get_length(nodes, &len); + ok(hr == S_OK, "get_length failed: %#lx\n", hr); + ok(len > 0, "expected child nodes, got %ld\n", len); + IXMLDOMNodeList_Release(nodes); + } + IXMLDOMElement_Release(elem); + } + } + + /* Test 5: Multiple embedded declarations in different elements */ + b = VARIANT_FALSE; + hr = IXMLDOMDocument_loadXML(doc, _bstr_(multi_embedded_str), &b); + ok(hr == S_OK, "loadXML with multiple embedded declarations failed: %#lx\n", hr); + ok(b == VARIANT_TRUE, "failed to load XML with multiple embedded declarations\n"); + + if (b == VARIANT_TRUE) + { + hr = IXMLDOMDocument_get_documentElement(doc, &elem); + ok(hr == S_OK, "get_documentElement failed: %#lx\n", hr); + if (elem) + { + hr = IXMLDOMElement_get_childNodes(elem, &nodes); + ok(hr == S_OK, "get_childNodes failed: %#lx\n", hr); + if (nodes) + { + hr = IXMLDOMNodeList_get_length(nodes, &len); + ok(hr == S_OK, "get_length failed: %#lx\n", hr); + /* Should have at least 2 child elements (first and second) */ + ok(len >= 2, "expected at least 2 child nodes, got %ld\n", len); + IXMLDOMNodeList_Release(nodes); + } + IXMLDOMElement_Release(elem); + } + } + + /* Test 6: Deeply nested embedded declaration */ + b = VARIANT_FALSE; + hr = IXMLDOMDocument_loadXML(doc, _bstr_(deep_embedded_str), &b); + ok(hr == S_OK, "loadXML with deeply nested embedded declaration failed: %#lx\n", hr); + ok(b == VARIANT_TRUE, "failed to load XML with deeply nested embedded declaration\n"); + + /* Test 7: Embedded declaration with encoding attribute */ + b = VARIANT_FALSE; + hr = IXMLDOMDocument_loadXML(doc, _bstr_(embedded_with_encoding_str), &b); + ok(hr == S_OK, "loadXML with embedded encoding declaration failed: %#lx\n", hr); + ok(b == VARIANT_TRUE, "failed to load XML with embedded encoding declaration\n"); + + /* Test 8: Self-closing XMLData element (no content to wrap) */ + b = VARIANT_FALSE; + hr = IXMLDOMDocument_loadXML(doc, _bstr_(selfclose_xmldata_str), &b); + ok(hr == S_OK, "loadXML with self-closing XMLData failed: %#lx\n", hr); + ok(b == VARIANT_TRUE, "failed to load XML with self-closing XMLData\n"); + + if (b == VARIANT_TRUE) + { + hr = IXMLDOMDocument_get_documentElement(doc, &elem); + ok(hr == S_OK, "get_documentElement failed: %#lx\n", hr); + if (elem) + { + hr = IXMLDOMElement_get_tagName(elem, &str); + ok(hr == S_OK, "get_tagName failed: %#lx\n", hr); + ok(!lstrcmpW(str, L"root"), "unexpected tag name: %s\n", wine_dbgstr_w(str)); + SysFreeString(str); + + /* Find the EmptyXMLData element */ + hr = IXMLDOMElement_selectSingleNode(elem, _bstr_("EmptyXMLData"), &node); + ok(hr == S_OK, "selectSingleNode failed: %#lx\n", hr); + if (node) + IXMLDOMNode_Release(node); + + IXMLDOMElement_Release(elem); + } + } + IXMLDOMDocument_Release(doc); free_bstrs(); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10025