diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c index 39e4768c75e..b8372887448 100644 --- a/dlls/msxml3/domdoc.c +++ b/dlls/msxml3/domdoc.c @@ -664,12 +664,7 @@ static HRESULT WINAPI domdoc_get_documentElement( *DOMElement = NULL; - if ( !This->node ) - return S_FALSE; - xmldoc = get_doc( This ); - if ( !xmldoc ) - return S_FALSE; root = xmlDocGetRootElement( xmldoc ); if ( !root ) @@ -811,7 +806,6 @@ static HRESULT WINAPI domdoc_createNode( DOMNodeType node_type; xmlNodePtr xmlnode = NULL; xmlChar *xml_name; - xmlDocPtr xmldoc; TRACE("(%p)->(type,%s,%s,%p)\n", This, debugstr_w(name), debugstr_w(namespaceURI), node); @@ -820,13 +814,6 @@ static HRESULT WINAPI domdoc_createNode( xml_name = xmlChar_from_wchar((WCHAR*)name); - if(!get_doc(This)) - { - xmldoc = xmlNewDoc(NULL); - xmldoc->_private = 0; - attach_xmlnode(This->node, (xmlNodePtr) xmldoc); - } - switch(node_type) { case NODE_ELEMENT: @@ -959,7 +946,8 @@ static HRESULT WINAPI domdoc_load( { domdoc *This = impl_from_IXMLDOMDocument( iface ); LPWSTR filename = NULL; - xmlDocPtr xmldoc; + xmlDocPtr xmldoc = NULL; + HRESULT hr = S_FALSE; TRACE("type %d\n", V_VT(&xmlSource) ); @@ -975,22 +963,26 @@ static HRESULT WINAPI domdoc_load( filename = V_BSTR(&xmlSource); } - if ( !filename ) - return S_FALSE; - - xmldoc = doread( filename ); - if ( !xmldoc ) + if ( filename ) { - This->error = E_FAIL; - return S_FALSE; + xmldoc = doread( filename ); + + if ( !xmldoc ) + This->error = E_FAIL; + else + { + hr = This->error = S_OK; + *isSuccessful = VARIANT_TRUE; + } } - This->error = S_OK; + if(!xmldoc) + xmldoc = xmlNewDoc(NULL); + xmldoc->_private = 0; attach_xmlnode(This->node, (xmlNodePtr) xmldoc); - *isSuccessful = VARIANT_TRUE; - return S_OK; + return hr; } @@ -1084,9 +1076,10 @@ static HRESULT WINAPI domdoc_loadXML( VARIANT_BOOL* isSuccessful ) { domdoc *This = impl_from_IXMLDOMDocument( iface ); - xmlDocPtr xmldoc; + xmlDocPtr xmldoc = NULL; char *str; int len; + HRESULT hr = S_FALSE; TRACE("%p %s %p\n", This, debugstr_w( bstrXML ), isSuccessful ); @@ -1094,31 +1087,30 @@ static HRESULT WINAPI domdoc_loadXML( attach_xmlnode( This->node, NULL ); - if ( !isSuccessful ) - return S_FALSE; - - *isSuccessful = VARIANT_FALSE; - - if ( !bstrXML ) - return S_FALSE; - - if ( !bstr_to_utf8( bstrXML, &str, &len ) ) - return S_FALSE; - - xmldoc = doparse( str, len ); - HeapFree( GetProcessHeap(), 0, str ); - if ( !xmldoc ) + if ( isSuccessful ) { - This->error = E_FAIL; - return S_FALSE; - } + *isSuccessful = VARIANT_FALSE; + + if ( bstrXML && bstr_to_utf8( bstrXML, &str, &len ) ) + { + xmldoc = doparse( str, len ); + HeapFree( GetProcessHeap(), 0, str ); + if ( !xmldoc ) + This->error = E_FAIL; + else + { + hr = This->error = S_OK; + *isSuccessful = VARIANT_TRUE; + } + } + } + if(!xmldoc) + xmldoc = xmlNewDoc(NULL); - This->error = S_OK; xmldoc->_private = 0; attach_xmlnode( This->node, (xmlNodePtr) xmldoc ); - *isSuccessful = VARIANT_TRUE; - return S_OK; + return hr; } @@ -1325,6 +1317,7 @@ HRESULT DOMDocument_create(IUnknown *pUnkOuter, LPVOID *ppObj) { domdoc *doc; HRESULT hr; + xmlDocPtr xmldoc; TRACE("(%p,%p)\n", pUnkOuter, ppObj); @@ -1337,9 +1330,19 @@ HRESULT DOMDocument_create(IUnknown *pUnkOuter, LPVOID *ppObj) doc->async = 0; doc->error = S_OK; - doc->node_unk = create_basic_node( NULL, (IUnknown*)&doc->lpVtbl ); + xmldoc = xmlNewDoc(NULL); + if(!xmldoc) + { + HeapFree(GetProcessHeap(), 0, doc); + return E_OUTOFMEMORY; + } + + xmldoc->_private = 0; + + doc->node_unk = create_basic_node( (xmlNodePtr)xmldoc, (IUnknown*)&doc->lpVtbl ); if(!doc->node_unk) { + xmlFreeDoc(xmldoc); HeapFree(GetProcessHeap(), 0, doc); return E_FAIL; } diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 68f1d1b00fa..808ad93b410 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -98,6 +98,7 @@ void test_domdoc( void ) IXMLDOMDocument *doc = NULL; IXMLDOMParseError *error; IXMLDOMElement *element = NULL; + IXMLDOMNode *node; VARIANT_BOOL b; VARIANT var; BSTR str; @@ -142,6 +143,13 @@ void test_domdoc( void ) r = IXMLDOMDocument_get_documentElement( doc, &element ); ok( r == S_FALSE, "should be no document element\n"); + /* try finding a node */ + node = NULL; + str = SysAllocString( szstr1 ); + r = IXMLDOMDocument_selectSingleNode( doc, str, &node ); + ok( r == S_FALSE, "ret %08lx\n", r ); + SysFreeString( str ); + b = VARIANT_TRUE; str = SysAllocString( szIncomplete ); r = IXMLDOMDocument_loadXML( doc, str, &b );