[MSXML3] Sync with Wine Staging 4.0. CORE-15682
authorAmine Khaldi <amine.khaldi@reactos.org>
Tue, 29 Jan 2019 12:11:02 +0000 (13:11 +0100)
committerAmine Khaldi <amine.khaldi@reactos.org>
Tue, 29 Jan 2019 12:11:02 +0000 (13:11 +0100)
dll/win32/msxml3/attribute.c
dll/win32/msxml3/domdoc.c
dll/win32/msxml3/element.c
dll/win32/msxml3/msxml_private.h
dll/win32/msxml3/node.c
media/doc/README.WINE

index 637615b..c303969 100644 (file)
@@ -50,6 +50,7 @@ typedef struct _domattr
     xmlnode node;
     IXMLDOMAttribute IXMLDOMAttribute_iface;
     LONG ref;
+    BOOL floating;
 } domattr;
 
 static const tid_t domattr_se_tids[] = {
@@ -116,6 +117,11 @@ static ULONG WINAPI domattr_Release(
     if ( ref == 0 )
     {
         destroy_xmlnode(&This->node);
+        if ( This->floating )
+        {
+            xmlFreeNs( This->node.node->ns );
+            xmlFreeNode( This->node.node );
+        }
         heap_free( This );
     }
 
@@ -543,6 +549,8 @@ static HRESULT WINAPI domattr_get_namespaceURI(
     IXMLDOMAttribute *iface,
     BSTR* p)
 {
+    static const WCHAR w3xmlns[] = { 'h','t','t','p',':','/','/', 'w','w','w','.','w','3','.',
+        'o','r','g','/','2','0','0','0','/','x','m','l','n','s','/',0 };
     domattr *This = impl_from_IXMLDOMAttribute( iface );
     xmlNsPtr ns = This->node.node->ns;
 
@@ -559,7 +567,12 @@ static HRESULT WINAPI domattr_get_namespaceURI(
         if (xmlStrEqual(This->node.node->name, xmlns))
             *p = bstr_from_xmlChar(xmlns);
         else if (xmlStrEqual(ns->prefix, xmlns))
-            *p = SysAllocStringLen(NULL, 0);
+        {
+            if (xmldoc_version(This->node.node->doc) == MSXML6)
+                *p = SysAllocString(w3xmlns);
+            else
+                *p = SysAllocStringLen(NULL, 0);
+        }
         else if (ns->href)
             *p = bstr_from_xmlChar(ns->href);
     }
@@ -709,7 +722,7 @@ static dispex_static_data_t domattr_dispex = {
     domattr_iface_tids
 };
 
-IUnknown* create_attribute( xmlNodePtr attribute )
+IUnknown* create_attribute( xmlNodePtr attribute, BOOL floating )
 {
     domattr *This;
 
@@ -719,6 +732,7 @@ IUnknown* create_attribute( xmlNodePtr attribute )
 
     This->IXMLDOMAttribute_iface.lpVtbl = &domattr_vtbl;
     This->ref = 1;
+    This->floating = floating;
 
     init_xmlnode(&This->node, attribute, (IXMLDOMNode*)&This->IXMLDOMAttribute_iface, &domattr_dispex);
 
index ddd7565..76d3fdb 100644 (file)
@@ -73,6 +73,7 @@ static const WCHAR PropValueXSLPatternW[] = {'X','S','L','P','a','t','t','e','r'
 static const WCHAR PropertyResolveExternalsW[] = {'R','e','s','o','l','v','e','E','x','t','e','r','n','a','l','s',0};
 static const WCHAR PropertyAllowXsltScriptW[] = {'A','l','l','o','w','X','s','l','t','S','c','r','i','p','t',0};
 static const WCHAR PropertyAllowDocumentFunctionW[] = {'A','l','l','o','w','D','o','c','u','m','e','n','t','F','u','n','c','t','i','o','n',0};
+static const WCHAR PropertyNormalizeAttributeValuesW[] = {'N','o','r','m','a','l','i','z','e','A','t','t','r','i','b','u','t','e','V','a','l','u','e','s',0};
 
 /* Anything that passes the test_get_ownerDocument()
  * tests can go here (data shared between all instances).
@@ -395,6 +396,11 @@ xmlNodePtr xmldoc_unlink_xmldecl(xmlDocPtr doc)
     return node;
 }
 
+MSXML_VERSION xmldoc_version(xmlDocPtr doc)
+{
+    return properties_from_xmlDocPtr(doc)->version;
+}
+
 BOOL is_preserving_whitespace(xmlNodePtr node)
 {
     domdoc_properties* properties = NULL;
@@ -2286,8 +2292,8 @@ static HRESULT WINAPI domdoc_load(
 
     if ( filename )
     {
+        IUri *uri = NULL;
         IMoniker *mon;
-        IUri *uri;
 
         if (This->properties->uri)
         {
@@ -2304,15 +2310,19 @@ static HRESULT WINAPI domdoc_load(
             IMoniker_Release(mon);
         }
 
-        if ( FAILED(hr) )
-            This->error = E_FAIL;
-        else
+        if (SUCCEEDED(hr))
         {
             get_doc(This)->name = (char *)xmlchar_from_wcharn(filename, -1, TRUE);
             This->properties->uri = uri;
             hr = This->error = S_OK;
             *isSuccessful = VARIANT_TRUE;
         }
+        else
+        {
+            if (uri)
+                IUri_Release(uri);
+            This->error = E_FAIL;
+        }
     }
 
     if(!filename || FAILED(hr)) {
@@ -3108,6 +3118,7 @@ static HRESULT WINAPI domdoc_setProperty(
              lstrcmpiW(p, PropertyNewParserW) == 0 ||
              lstrcmpiW(p, PropertyResolveExternalsW) == 0 ||
              lstrcmpiW(p, PropertyAllowXsltScriptW) == 0 ||
+             lstrcmpiW(p, PropertyNormalizeAttributeValuesW) == 0 ||
              lstrcmpiW(p, PropertyAllowDocumentFunctionW) == 0)
     {
         /* Ignore */
index 6e00aa0..0ff26e4 100644 (file)
@@ -1398,7 +1398,7 @@ static HRESULT WINAPI domelem_getAttributeNode(
 
     if (attr)
     {
-        IUnknown *unk = create_attribute((xmlNodePtr)attr);
+        IUnknown *unk = create_attribute((xmlNodePtr)attr, FALSE);
         hr = IUnknown_QueryInterface(unk, &IID_IXMLDOMAttribute, (void**)attributeNode);
         IUnknown_Release(unk);
     }
@@ -1754,8 +1754,11 @@ static HRESULT domelem_remove_named_item(xmlNodePtr node, BSTR name, IXMLDOMNode
 
 static HRESULT domelem_get_item(const xmlNodePtr node, LONG index, IXMLDOMNode **item)
 {
+    xmlNsPtr ns, xmlns;
     xmlAttrPtr curr;
     LONG attrIndex;
+    IUnknown *unk;
+    HRESULT hr;
 
     TRACE("(%p)->(%d %p)\n", node, index, item);
 
@@ -1764,42 +1767,75 @@ static HRESULT domelem_get_item(const xmlNodePtr node, LONG index, IXMLDOMNode *
     if (index < 0)
         return S_FALSE;
 
+    attrIndex = 0;
     curr = node->properties;
-
-    for (attrIndex = 0; attrIndex < index; attrIndex++) {
-        if (curr->next == NULL)
-            return S_FALSE;
-        else
+    if (curr) {
+        for (; attrIndex < index && curr->next != NULL; attrIndex++)
             curr = curr->next;
+
+        if (attrIndex == index) {
+            *item = create_node( (xmlNodePtr) curr );
+            return S_OK;
+        }
     }
 
-    *item = create_node( (xmlNodePtr) curr );
+    if (!node->nsDef)
+        return S_FALSE;
 
-    return S_OK;
+    attrIndex++;
+    ns = node->nsDef;
+    for (; attrIndex < index && ns->next != NULL; attrIndex++)
+        ns = ns->next;
+
+    if (attrIndex < index)
+        return S_FALSE;
+
+    xmlns = xmlNewNs(NULL, BAD_CAST "http://www.w3.org/2000/xmlns/", BAD_CAST "xmlns");
+    if (!xmlns)
+        return E_OUTOFMEMORY;
+
+    curr = xmlNewNsProp(NULL, xmlns, ns->prefix, ns->href);
+    if (!curr) {
+        xmlFreeNs(xmlns);
+        return E_OUTOFMEMORY;
+    }
+    curr->doc = node->doc;
+
+    unk = create_attribute((xmlNodePtr)curr, TRUE);
+    if (!unk) {
+        xmlFreeNs(xmlns);
+        xmlFreeProp(curr);
+        return E_OUTOFMEMORY;
+    }
+
+    hr = IUnknown_QueryInterface(unk, &IID_IXMLDOMNode, (void**)item);
+    IUnknown_Release(unk);
+
+    return hr;
 }
 
 static HRESULT domelem_get_length(const xmlNodePtr node, LONG *length)
 {
-    xmlAttrPtr first;
     xmlAttrPtr curr;
     LONG attrCount;
+    xmlNsPtr ns;
 
     TRACE("(%p)->(%p)\n", node, length);
 
     if( !length )
         return E_INVALIDARG;
 
-    first = node->properties;
-    if (first == NULL) {
-       *length = 0;
-       return S_OK;
+    attrCount = 0;
+    curr = node->properties;
+    while (curr) {
+        attrCount++;
+        curr = curr->next;
     }
 
-    curr = first;
-    attrCount = 1;
-    while (curr->next) {
+    ns = node->nsDef;
+    while (ns) {
         attrCount++;
-        curr = curr->next;
+        ns = ns->next;
     }
     *length = attrCount;
 
index 94ef66b..08f944a 100644 (file)
@@ -252,7 +252,7 @@ extern IUnknown         *create_domdoc( xmlNodePtr ) DECLSPEC_HIDDEN;
 extern IUnknown         *create_xmldoc( void ) DECLSPEC_HIDDEN;
 extern IXMLDOMNode      *create_node( xmlNodePtr ) DECLSPEC_HIDDEN;
 extern IUnknown         *create_element( xmlNodePtr ) DECLSPEC_HIDDEN;
-extern IUnknown         *create_attribute( xmlNodePtr ) DECLSPEC_HIDDEN;
+extern IUnknown         *create_attribute( xmlNodePtr, BOOL ) DECLSPEC_HIDDEN;
 extern IUnknown         *create_text( xmlNodePtr ) DECLSPEC_HIDDEN;
 extern IUnknown         *create_pi( xmlNodePtr ) DECLSPEC_HIDDEN;
 extern IUnknown         *create_comment( xmlNodePtr ) DECLSPEC_HIDDEN;
@@ -284,6 +284,7 @@ extern HRESULT xmldoc_add_orphan( xmlDocPtr doc, xmlNodePtr node ) DECLSPEC_HIDD
 extern HRESULT xmldoc_remove_orphan( xmlDocPtr doc, xmlNodePtr node ) DECLSPEC_HIDDEN;
 extern void xmldoc_link_xmldecl(xmlDocPtr doc, xmlNodePtr node) DECLSPEC_HIDDEN;
 extern xmlNodePtr xmldoc_unlink_xmldecl(xmlDocPtr doc) DECLSPEC_HIDDEN;
+extern MSXML_VERSION xmldoc_version( xmlDocPtr doc ) DECLSPEC_HIDDEN;
 
 extern HRESULT XMLElement_create( xmlNodePtr node, LPVOID *ppObj, BOOL own ) DECLSPEC_HIDDEN;
 
index bcb4181..fc18935 100644 (file)
@@ -2271,7 +2271,7 @@ IXMLDOMNode *create_node( xmlNodePtr node )
         pUnk = create_element( node );
         break;
     case XML_ATTRIBUTE_NODE:
-        pUnk = create_attribute( node );
+        pUnk = create_attribute( node, FALSE );
         break;
     case XML_TEXT_NODE:
         pUnk = create_text( node );
index 2946ca0..0fb8d24 100644 (file)
@@ -129,7 +129,7 @@ reactos/dll/win32/msvfw32             # Synced to WineStaging-4.0
 reactos/dll/win32/msvidc32            # Synced to WineStaging-4.0
 reactos/dll/win32/msxml               # Synced to WineStaging-3.3
 reactos/dll/win32/msxml2              # Synced to WineStaging-3.3
-reactos/dll/win32/msxml3              # Synced to WineStaging-3.3
+reactos/dll/win32/msxml3              # Synced to WineStaging-4.0
 reactos/dll/win32/msxml4              # Synced to WineStaging-3.3
 reactos/dll/win32/msxml6              # Synced to WineStaging-3.3
 reactos/dll/win32/nddeapi             # Synced to WineStaging-3.3