xmlnode node;
IXMLDOMAttribute IXMLDOMAttribute_iface;
LONG ref;
+ BOOL floating;
} domattr;
static const tid_t domattr_se_tids[] = {
if ( ref == 0 )
{
destroy_xmlnode(&This->node);
+ if ( This->floating )
+ {
+ xmlFreeNs( This->node.node->ns );
+ xmlFreeNode( This->node.node );
+ }
heap_free( This );
}
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;
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);
}
domattr_iface_tids
};
-IUnknown* create_attribute( xmlNodePtr attribute )
+IUnknown* create_attribute( xmlNodePtr attribute, BOOL floating )
{
domattr *This;
This->IXMLDOMAttribute_iface.lpVtbl = &domattr_vtbl;
This->ref = 1;
+ This->floating = floating;
init_xmlnode(&This->node, attribute, (IXMLDOMNode*)&This->IXMLDOMAttribute_iface, &domattr_dispex);
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).
return node;
}
+MSXML_VERSION xmldoc_version(xmlDocPtr doc)
+{
+ return properties_from_xmlDocPtr(doc)->version;
+}
+
BOOL is_preserving_whitespace(xmlNodePtr node)
{
domdoc_properties* properties = NULL;
if ( filename )
{
+ IUri *uri = NULL;
IMoniker *mon;
- IUri *uri;
if (This->properties->uri)
{
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)) {
lstrcmpiW(p, PropertyNewParserW) == 0 ||
lstrcmpiW(p, PropertyResolveExternalsW) == 0 ||
lstrcmpiW(p, PropertyAllowXsltScriptW) == 0 ||
+ lstrcmpiW(p, PropertyNormalizeAttributeValuesW) == 0 ||
lstrcmpiW(p, PropertyAllowDocumentFunctionW) == 0)
{
/* Ignore */
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);
}
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);
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;
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;
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;
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 );
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