ReactOS 0.4.16-dev-1946-g52006dd
domdoc.c
Go to the documentation of this file.
1/*
2 * XML test
3 *
4 * Copyright 2005 Mike McCormack for CodeWeavers
5 * Copyright 2007-2008 Alistair Leslie-Hughes
6 * Copyright 2010-2011 Adam Martinson for CodeWeavers
7 * Copyright 2010-2013 Nikolay Sivov for CodeWeavers
8 *
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
13 *
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 */
23
24
25#define COBJMACROS
26#define CONST_VTABLE
27
28#include <stdio.h>
29#include <assert.h>
30
31#include "windows.h"
32
33#include "msxml.h"
34#include "msxml2.h"
35#include "msxml2did.h"
36#include "ole2.h"
37#include "dispex.h"
38#include "objsafe.h"
39#include "mshtml.h"
40#include "docobj.h"
41#include "xmlparser.h"
42#include "initguid.h"
43#include "asptlb.h"
44#include "shlwapi.h"
45
46#include "wine/test.h"
47
48#define XML_E_UNEXPECTED_ATTRIBUTE 0xC00CE56C
49
50/* undef the #define in msxml2 so that we can access all versions */
51#undef CLSID_DOMDocument
52
53DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
54DEFINE_GUID(IID_transformdest_unknown,0xf5078f3a,0xc551,0x11d3,0x89,0xb9,0x00,0x00,0xf8,0x1f,0xe2,0x21);
55
56#define check_interface(a, b, c) check_interface_(__LINE__, a, b, c)
57static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOOL supported)
58{
59 IUnknown *iface = iface_ptr;
60 HRESULT hr, expected_hr;
61 IUnknown *unk;
62
63 expected_hr = supported ? S_OK : E_NOINTERFACE;
64
65 hr = IUnknown_QueryInterface(iface, iid, (void **)&unk);
66 ok_(__FILE__, line)(hr == expected_hr, "Got hr %#lx, expected %#lx.\n", hr, expected_hr);
67 if (SUCCEEDED(hr))
68 IUnknown_Release(unk);
69}
70
72
74{
75 const GUID *clsid;
76 const char *name;
77 const IID *ifaces[3];
79};
80
82{
83 { &CLSID_DOMDocument, "DOMDocument", {&IID_IXMLDOMDocument, &IID_IXMLDOMDocument2} },
84 { &CLSID_DOMDocument2, "DOMDocument2", {&IID_IXMLDOMDocument, &IID_IXMLDOMDocument2} },
85 { &CLSID_DOMDocument30, "DOMDocument30", {&IID_IXMLDOMDocument, &IID_IXMLDOMDocument2} },
86 { &CLSID_DOMDocument40, "DOMDocument40", {&IID_IXMLDOMDocument, &IID_IXMLDOMDocument2} },
87 { &CLSID_DOMDocument60, "DOMDocument60", {&IID_IXMLDOMDocument, &IID_IXMLDOMDocument2, &IID_IXMLDOMDocument3} },
88 { &CLSID_FreeThreadedDOMDocument, "FreeThreadedDOMDocument", {&IID_IXMLDOMDocument, &IID_IXMLDOMDocument2} },
89 { &CLSID_XMLSchemaCache, "XMLSchemaCache", {&IID_IXMLDOMSchemaCollection} },
90 { &CLSID_XSLTemplate, "XSLTemplate", {&IID_IXSLTemplate} },
91 { &CLSID_MXNamespaceManager40, "MXNamespaceManager40", {&IID_IMXNamespaceManager} },
92 { NULL }
93};
94
95static const char *debugstr_msxml_guid(REFIID riid)
96{
97 if(!riid)
98 return "(null)";
99
100 if (IsEqualIID(&IID_IXMLDOMDocument, riid))
101 return "IXMLDOMDocument";
102 else if (IsEqualIID(&IID_IXMLDOMDocument2, riid))
103 return "IXMLDOMDocument2";
104 else if (IsEqualIID(&IID_IXMLDOMDocument3, riid))
105 return "IXMLDOMDocument3";
106 else if (IsEqualIID(&IID_IXMLDOMSchemaCollection, riid))
107 return "IXMLDOMSchemaCollection";
108 else if (IsEqualIID(&IID_IXSLTemplate, riid))
109 return "IXSLTemplate";
110 else if (IsEqualIID(&IID_IMXNamespaceManager, riid))
111 return "IMXNamespaceManager";
112 else
113 return wine_dbgstr_guid(riid);
114}
115
117{
118 while (table->clsid)
119 {
120 IUnknown *unk;
121 HRESULT hr;
122 int i;
123
124 for (i = 0; i < ARRAY_SIZE(table->ifaces) && table->ifaces[i] != NULL; i++)
125 {
126 hr = CoCreateInstance(table->clsid, NULL, CLSCTX_INPROC_SERVER, table->ifaces[i], (void**)&unk);
127 if (hr == S_OK) IUnknown_Release(unk);
128
129 table->supported[i] = hr == S_OK;
130 if (hr != S_OK) win_skip("class %s, iface %s not supported\n", table->name, debugstr_msxml_guid(table->ifaces[i]));
131 }
132
133 table++;
134 }
135}
136
138{
140 while (table->clsid)
141 {
142 if (table->clsid == clsid)
143 {
144 int i;
145
146 for (i = 0; i < ARRAY_SIZE(table->ifaces) && table->ifaces[i] != NULL; i++)
147 if (table->ifaces[i] == riid) return table->supported[i];
148 }
149
150 table++;
151 }
152 return FALSE;
153}
154
155typedef struct
156{
159} dispevent;
160
162{
163 return CONTAINING_RECORD(iface, dispevent, IDispatch_iface);
164}
165
167{
168 *ppvObject = NULL;
169
170 if ( IsEqualGUID( riid, &IID_IDispatch) ||
172 {
173 *ppvObject = iface;
174 }
175 else
176 return E_NOINTERFACE;
177
178 IDispatch_AddRef( iface );
179
180 return S_OK;
181}
182
184{
186 return InterlockedIncrement( &This->ref );
187}
188
190{
193
194 if (ref == 0)
195 free(This);
196
197 return ref;
198}
199
201{
203 *pctinfo = 0;
204 return S_OK;
205}
206
208 LCID lcid, ITypeInfo **ppTInfo)
209{
211 return S_OK;
212}
213
215 LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
216{
218 return S_OK;
219}
220
222 LCID lcid, WORD flags, DISPPARAMS *params, VARIANT *result,
223 EXCEPINFO *excepInfo, UINT *argErr)
224{
225 ok(member == 0, "expected 0 member, got %ld\n", member);
226 ok(lcid == LOCALE_SYSTEM_DEFAULT, "expected LOCALE_SYSTEM_DEFAULT, got lcid %lx\n", lcid);
227 ok(flags == DISPATCH_METHOD, "expected DISPATCH_METHOD, got %d\n", flags);
228
229 ok(params->cArgs == 0, "got %d\n", params->cArgs);
230 ok(params->cNamedArgs == 0, "got %d\n", params->cNamedArgs);
231 ok(params->rgvarg == NULL, "got %p\n", params->rgvarg);
232 ok(params->rgdispidNamedArgs == NULL, "got %p\n", params->rgdispidNamedArgs);
233
234 ok(result == NULL, "got %p\n", result);
235 ok(excepInfo == NULL, "got %p\n", excepInfo);
236 ok(argErr == NULL, "got %p\n", argErr);
237
239 return E_FAIL;
240}
241
242static const IDispatchVtbl dispeventVtbl =
243{
251};
252
254{
255 dispevent *event = malloc(sizeof(*event));
256
257 event->IDispatch_iface.lpVtbl = &dispeventVtbl;
258 event->ref = 1;
259
260 return &event->IDispatch_iface;
261}
262
263/* IStream */
264static HRESULT WINAPI istream_QueryInterface(IStream *iface, REFIID riid, void **ppvObject)
265{
266 *ppvObject = NULL;
267
268 if (IsEqualGUID(riid, &IID_IStream) ||
270 *ppvObject = iface;
271 else
272 return E_NOINTERFACE;
273
274 return S_OK;
275}
276
278{
279 return 2;
280}
281
283{
284 return 1;
285}
286
288{
289 ok(0, "unexpected call\n");
290 return E_NOTIMPL;
291}
292
293static HRESULT WINAPI istream_Write(IStream *iface, const void *ptr, ULONG len, ULONG *written)
294{
295 *written = len/2;
296 return S_OK;
297}
298
300{
301 ok(0, "unexpected call\n");
302 return E_NOTIMPL;
303}
304
306{
307 ok(0, "unexpected call\n");
308 return E_NOTIMPL;
309}
310
313{
314 ok(0, "unexpected call\n");
315 return E_NOTIMPL;
316}
317
319{
320 ok(0, "unexpected call\n");
321 return E_NOTIMPL;
322}
323
325{
326 ok(0, "unexpected call\n");
327 return E_NOTIMPL;
328}
329
331 ULARGE_INTEGER len, DWORD locktype)
332{
333 ok(0, "unexpected call\n");
334 return E_NOTIMPL;
335}
336
338 ULARGE_INTEGER len, DWORD locktype)
339{
340 ok(0, "unexpected call\n");
341 return E_NOTIMPL;
342}
343
344static HRESULT WINAPI istream_Stat(IStream *iface, STATSTG *pstatstg, DWORD flag)
345{
346 ok(0, "unexpected call\n");
347 return E_NOTIMPL;
348}
349
351{
352 ok(0, "unexpected call\n");
353 return E_NOTIMPL;
354}
355
356static const IStreamVtbl StreamVtbl = {
371};
372
374
376{
377 if (IsEqualIID(&IID_IResponse, riid) ||
380 {
381 *obj = iface;
382 return S_OK;
383 }
384
385 if (!IsEqualIID(&IID_IStream, riid) && !IsEqualIID(&IID_ISequentialStream, riid))
386 ok(0, "unexpected call\n");
387 return E_NOINTERFACE;
388}
389
391{
392 return 2;
393}
394
396{
397 return 1;
398}
399
401{
402 ok(0, "unexpected call\n");
403 return E_NOTIMPL;
404}
405
407{
408 ok(0, "unexpected call\n");
409 return E_NOTIMPL;
410}
411
413 UINT cnames, LCID lcid, DISPID *rgDispId)
414{
415 ok(0, "unexpected call\n");
416 return E_NOTIMPL;
417}
418
420 WORD flags, DISPPARAMS *params, VARIANT *result, EXCEPINFO *ei, UINT *argerr)
421{
422 ok(0, "unexpected call\n");
423 return E_NOTIMPL;
424}
425
427{
428 ok(0, "unexpected call\n");
429 return E_NOTIMPL;
430}
431
433{
434 ok(0, "unexpected call\n");
435 return E_NOTIMPL;
436}
437
438static HRESULT WINAPI response_get_ContentType(IResponse *iface, BSTR *pbstrContentTypeRet)
439{
440 ok(0, "unexpected call\n");
441 return E_NOTIMPL;
442}
443
444static HRESULT WINAPI response_put_ContentType(IResponse *iface, BSTR bstrContentType)
445{
446 ok(0, "unexpected call\n");
447 return E_NOTIMPL;
448}
449
450static HRESULT WINAPI response_get_Expires(IResponse *iface, VARIANT *pvarExpiresMinutesRet)
451{
452 ok(0, "unexpected call\n");
453 return E_NOTIMPL;
454}
455
456static HRESULT WINAPI response_put_Expires(IResponse *iface, LONG lExpiresMinutes)
457{
458 ok(0, "unexpected call\n");
459 return E_NOTIMPL;
460}
461
463{
464 ok(0, "unexpected call\n");
465 return E_NOTIMPL;
466}
467
469{
470 ok(0, "unexpected call\n");
471 return E_NOTIMPL;
472}
473
475{
476 ok(0, "unexpected call\n");
477 return E_NOTIMPL;
478}
479
480static HRESULT WINAPI response_get_Status(IResponse *iface, BSTR *pbstrStatusRet)
481{
482 ok(0, "unexpected call\n");
483 return E_NOTIMPL;
484}
485
487{
488 ok(0, "unexpected call\n");
489 return E_NOTIMPL;
490}
491
492static HRESULT WINAPI response_Add(IResponse *iface, BSTR bstrHeaderValue, BSTR bstrHeaderName)
493{
494 ok(0, "unexpected call\n");
495 return E_NOTIMPL;
496}
497
498static HRESULT WINAPI response_AddHeader(IResponse *iface, BSTR bstrHeaderName, BSTR bstrHeaderValue)
499{
500 ok(0, "unexpected call\n");
501 return E_NOTIMPL;
502}
503
505{
506 ok(0, "unexpected call\n");
507 return E_NOTIMPL;
508}
509
511{
512 HRESULT hr;
513 LONG bound;
514 UINT dim;
515
516 ok(V_VT(&input) == (VT_ARRAY | VT_UI1), "got wrong input type %x\n", V_VT(&input));
517
519 ok(dim == 1, "got wrong array dimensions %u\n", dim);
520
521 bound = 1;
522 hr = SafeArrayGetLBound(V_ARRAY(&input), 1, &bound);
523 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
524 ok(bound == 0, "wrong array low bound %ld\n", bound);
525
526 bound = 0;
527 hr = SafeArrayGetUBound(V_ARRAY(&input), 1, &bound);
528 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
529 ok(bound > 0, "wrong array high bound %ld\n", bound);
530
531 return E_NOTIMPL;
532}
533
535{
536 ok(0, "unexpected call\n");
537 return E_NOTIMPL;
538}
539
541{
542 ok(0, "unexpected call\n");
543 return E_NOTIMPL;
544}
545
547{
548 ok(0, "unexpected call\n");
549 return E_NOTIMPL;
550}
551
553{
554 ok(0, "unexpected call\n");
555 return E_NOTIMPL;
556}
557
559{
560 ok(0, "unexpected call\n");
561 return E_NOTIMPL;
562}
563
564static HRESULT WINAPI response_WriteBlock(IResponse *iface, short iBlockNumber)
565{
566 ok(0, "unexpected call\n");
567 return E_NOTIMPL;
568}
569
571{
572 ok(0, "unexpected call\n");
573 return E_NOTIMPL;
574}
575
576static HRESULT WINAPI response_get_CharSet(IResponse *iface, BSTR *pbstrCharSetRet)
577{
578 ok(0, "unexpected call\n");
579 return E_NOTIMPL;
580}
581
583{
584 ok(0, "unexpected call\n");
585 return E_NOTIMPL;
586}
587
588static HRESULT WINAPI response_Pics(IResponse *iface, BSTR bstrHeaderValue)
589{
590 ok(0, "unexpected call\n");
591 return E_NOTIMPL;
592}
593
594static HRESULT WINAPI response_get_CacheControl(IResponse *iface, BSTR *pbstrCacheControl)
595{
596 ok(0, "unexpected call\n");
597 return E_NOTIMPL;
598}
599
600static HRESULT WINAPI response_put_CacheControl(IResponse *iface, BSTR bstrCacheControl)
601{
602 ok(0, "unexpected call\n");
603 return E_NOTIMPL;
604}
605
607{
608 ok(0, "unexpected call\n");
609 return E_NOTIMPL;
610}
611
613{
614 ok(0, "unexpected call\n");
615 return E_NOTIMPL;
616}
617
619{
620 ok(0, "unexpected call\n");
621 return E_NOTIMPL;
622}
623
625{
626 ok(0, "unexpected call\n");
627 return E_NOTIMPL;
628}
629
630static const IResponseVtbl testresponsevtbl =
631{
670};
671
673
674#define EXPECT_CHILDREN(node) _expect_children((IXMLDOMNode*)node, __LINE__)
676{
678 HRESULT hr;
679
680 b = VARIANT_FALSE;
681 hr = IXMLDOMNode_hasChildNodes(node, &b);
682 ok_(__FILE__,line)(hr == S_OK, "hasChildNodes() failed, %#lx.\n", hr);
683 ok_(__FILE__,line)(b == VARIANT_TRUE, "no children, %d\n", b);
684}
685
686#define EXPECT_NO_CHILDREN(node) _expect_no_children((IXMLDOMNode*)node, __LINE__)
688{
690 HRESULT hr;
691
692 b = VARIANT_TRUE;
693 hr = IXMLDOMNode_hasChildNodes(node, &b);
694 ok_(__FILE__,line)(hr == S_FALSE, "hasChildNodes() failed, %#lx.\n", hr);
695 ok_(__FILE__,line)(b == VARIANT_FALSE, "no children, %d\n", b);
696}
697
698#define EXPECT_REF(node,ref) _expect_ref((IUnknown*)node, ref, __LINE__)
700{
701 ULONG rc;
702 IUnknown_AddRef(obj);
703 rc = IUnknown_Release(obj);
704 ok_(__FILE__,line)(rc == ref, "expected refcount %ld, got %ld\n", ref, rc);
705}
706
707#define EXPECT_LIST_LEN(list,len) _expect_list_len(list, len, __LINE__)
709{
710 LONG length;
711 HRESULT hr;
712
713 length = 0;
714 hr = IXMLDOMNodeList_get_length(list, &length);
715 ok_(__FILE__,line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
716 ok_(__FILE__,line)(length == len, "got %ld, expected %ld\n", length, len);
717}
718
719#define EXPECT_PARSE_ERROR(doc, hr_exp, hr_todo) _expect_parse_error(doc, hr_exp, hr_todo, __LINE__)
720static void _expect_parse_error(IXMLDOMDocument *doc, HRESULT hr_exp, BOOL hr_todo, int line)
721{
723 HRESULT hr;
724 LONG code;
725
726 error = NULL;
727 hr = IXMLDOMDocument_get_parseError(doc, &error);
728 ok_(__FILE__,line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
729 ok_(__FILE__,line)(!!error, "got NULL parseError\n");
730
731 code = 0xdeadbeef;
732 hr = IXMLDOMParseError_get_errorCode(error, &code);
733 if (FAILED(hr_exp))
734 {
735 ok_(__FILE__,line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
736 ok_(__FILE__,line)(FAILED(code), "expected failure HRESULT\n");
737 todo_wine_if(hr_todo)
738 ok_(__FILE__,line)(hr_exp == code, "expected %#lx, unexpected hr %#lx.\n", hr_exp, code);
739 }
740 else
741 {
742 ok_(__FILE__,line)(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
743 ok_(__FILE__,line)(SUCCEEDED(code), "expected successful HRESULT\n");
744 }
745
746 IXMLDOMParseError_Release(error);
747}
748
749static const WCHAR szComplete1[] = L"<?xml version='1.0'?>\n<open></open>\n";
750static const char complete4A[] =
751 "<?xml version=\'1.0\'?>\n"
752 "<lc dl=\'str1\'>\n"
753 "<bs vr=\'str2\' sz=\'1234\'>"
754 "fn1.txt\n"
755 "</bs>\n"
756 "<pr id=\'str3\' vr=\'1.2.3\' pn=\'wine 20050804\'>\n"
757 "fn2.txt\n"
758 "</pr>\n"
759 "<empty></empty>\n"
760 "<fo>\n"
761 "<ba>\n"
762 "f1\n"
763 "</ba>\n"
764 "</fo>\n"
765 "</lc>\n";
766
767static const WCHAR szComplete5[] =
768 L"<S:search xmlns:D=\"DAV:\" xmlns:C=\"urn:schemas-microsoft-com:office:clipgallery\" xmlns:S=\"urn:schemas-microsoft-com:office:clipgallery:search\">"
769 "<S:scope><S:deep>/</S:deep></S:scope><S:contentfreetext><C:textorproperty/>computer</S:contentfreetext></S:search>";
770
771static const char complete7[] = {
772 "<?xml version=\"1.0\"?>\n\t"
773 "<root>\n"
774 "\t<a/>\n"
775 "\t<b/>\n"
776 "\t<c/>\n"
777 "</root>"
778};
779
780#define DECL_GBK \
781"<?xml version=\"1.0\" encoding=\"gbk\"?>"
782
783static const char gbkxml[] =
785"<open></open>";
786
787#define DECL_ISO8859_1 \
788"<?xml version=\"1.0\" encoding=\"ISO8859-1\"?>"
789
790static const char iso8859_1_xml[] =
792"<open></open>";
793
794#define DECL_WIN_936 \
795"<?xml version=\"1.0\" encoding=\"Windows-936\"?>"
796
797static const char win936xml[] =
799"<open></open>";
800
801#define DECL_WIN_1252 \
802"<?xml version=\"1.0\" encoding=\"Windows-1252\"?>"
803
804static const char win1252xml[] =
806"<open></open>";
807
808static const char win1252decl[] =
810;
811
812static const char nocontent[] = "no xml content here";
813
814static const char szExampleXML[] =
815"<?xml version='1.0' encoding='utf-8'?>\n"
816"<root xmlns:foo='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29' a=\"attr a\" foo:b=\"attr b\" >\n"
817" <elem>\n"
818" <a>A1 field</a>\n"
819" <b>B1 field</b>\n"
820" <c>C1 field</c>\n"
821" <d>D1 field</d>\n"
822" <description xmlns:foo='http://www.winehq.org' xmlns:bar='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'>\n"
823" <html xmlns='http://www.w3.org/1999/xhtml'>\n"
824" <![CDATA[]]> This is<strong> a</strong> <i>description</i><dot>. </dot><bar:x/>\n"
825" </html>\n"
826" <html xml:space='preserve' xmlns='http://www.w3.org/1999/xhtml'>\n"
827" This is <strong>a</strong> <i>description</i> with preserved whitespace. <bar:x/>\n"
828" </html>\n"
829" </description>\n"
830" </elem>\n"
831"\n"
832" <elem a='a'>\n"
833" <a>A2 field</a>\n"
834" <b>B2 field</b>\n"
835" <c type=\"old\">C2 field</c>\n"
836" <d>D2 field</d>\n"
837" </elem>\n"
838"\n"
839" <elem xmlns='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'>\n"
840" <a>A3 field</a>\n"
841" <b>B3 field</b>\n"
842" <c>C3 field</c>\n"
843" </elem>\n"
844"\n"
845" <elem>\n"
846" <a>A4 field</a>\n"
847" <b>B4 field</b>\n"
848" <foo:c>C4 field</foo:c>\n"
849" <d>D4 field</d>\n"
850" </elem>\n"
851"</root>\n";
852
853static const char charrefsxml[] =
854"<?xml version='1.0'?>"
855"<a>"
856"<b1> Text &#65; end </b1>"
857"<b2>&#65;&#66; &#67; </b2>"
858"</a>";
859
860static const CHAR szNodeTypesXML[] =
861"<?xml version='1.0'?>"
862"<!-- comment node 0 -->"
863"<root id='0' depth='0'>"
864" <!-- comment node 1 -->"
865" text node 0"
866" <x id='1' depth='1'>"
867" <?foo value='PI for x'?>"
868" <!-- comment node 2 -->"
869" text node 1"
870" <a id='3' depth='2'/>"
871" <b id='4' depth='2'/>"
872" <c id='5' depth='2'/>"
873" </x>"
874" <y id='2' depth='1'>"
875" <?bar value='PI for y'?>"
876" <!-- comment node 3 -->"
877" text node 2"
878" <a id='6' depth='2'/>"
879" <b id='7' depth='2'/>"
880" <c id='8' depth='2'/>"
881" </y>"
882"</root>";
883
884static const CHAR szTransformXML[] =
885"<?xml version=\"1.0\"?>\n"
886"<greeting>\n"
887"Hello World\n"
888"</greeting>";
889
890static const CHAR szTransformSSXML[] =
891"<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">\n"
892" <xsl:output method=\"html\"/>\n"
893" <xsl:template match=\"/\">\n"
894" <xsl:apply-templates select=\"greeting\"/>\n"
895" </xsl:template>\n"
896" <xsl:template match=\"greeting\">\n"
897" <html>\n"
898" <body>\n"
899" <h1>\n"
900" <xsl:value-of select=\".\"/>\n"
901" </h1>\n"
902" </body>\n"
903" </html>\n"
904" </xsl:template>\n"
905"</xsl:stylesheet>";
906
907static const CHAR szTransformOutput[] =
908"<html><body><h1>"
909"Hello World"
910"</h1></body></html>";
911
912static const CHAR szTypeValueXML[] =
913"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
914"<root xmlns:dt=\"urn:schemas-microsoft-com:datatypes\">\n"
915" <string>Wine</string>\n"
916" <string2 dt:dt=\"string\">String </string2>\n"
917" <string3> Wine Wine </string3>\n"
918" <string4>\nWine Wine\t</string4>\n"
919" <string5> </string5>\n"
920" <nested><s1> s1 </s1><s2>\ns2 s2\t</s2></nested>\n"
921" <number dt:dt=\"number\">12.44</number>\n"
922" <number2 dt:dt=\"NUMbEr\">-3.71e3</number2>\n"
923" <int dt:dt=\"int\">-13</int>\n"
924" <fixed dt:dt=\"fixed.14.4\">7322.9371</fixed>\n"
925" <bool dt:dt=\"boolean\">1</bool>\n"
926" <datetime dt:dt=\"datetime\">2009-11-18T03:21:33.12</datetime>\n"
927" <datetimetz dt:dt=\"datetime.tz\">2003-07-11T11:13:57+03:00</datetimetz>\n"
928" <date dt:dt=\"date\">3721-11-01</date>\n"
929" <time dt:dt=\"time\">13:57:12.31321</time>\n"
930" <timetz dt:dt=\"time.tz\">23:21:01.13+03:21</timetz>\n"
931" <i1 dt:dt=\"i1\">-13</i1>\n"
932" <i2 dt:dt=\"i2\">31915</i2>\n"
933" <i4 dt:dt=\"i4\">-312232</i4>\n"
934" <ui1 dt:dt=\"ui1\">123</ui1>\n"
935" <ui2 dt:dt=\"ui2\">48282</ui2>\n"
936" <ui4 dt:dt=\"ui4\">949281</ui4>\n"
937" <r4 dt:dt=\"r4\">213124.0</r4>\n"
938" <r8 dt:dt=\"r8\">0.412</r8>\n"
939" <float dt:dt=\"float\">41221.421</float>\n"
940" <uuid dt:dt=\"uuid\">333C7BC4-460F-11D0-BC04-0080C7055a83</uuid>\n"
941" <binhex dt:dt=\"bin.hex\">fffca012003c</binhex>\n"
942" <binbase64 dt:dt=\"bin.base64\">YmFzZTY0IHRlc3Q=</binbase64>\n"
943" <binbase64_1 dt:dt=\"bin.base64\">\nYmFzZTY0\nIHRlc3Q=\n</binbase64_1>\n"
944" <binbase64_2 dt:dt=\"bin.base64\">\nYmF\r\t z ZTY0\nIHRlc3Q=\n</binbase64_2>\n"
945"</root>";
946
948"<?xml version=\"1.0\"?>"
949"<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" >"
950"<xsl:output method=\"html\"/>\n"
951"<xsl:template match=\"/\">"
952"<HTML><BODY><TABLE>"
953" <xsl:apply-templates select='document(\"";
954
956"\")/bottle/wine'>"
957" <xsl:sort select=\"cost\"/><xsl:sort select=\"name\"/>"
958" </xsl:apply-templates>"
959"</TABLE></BODY></HTML>"
960"</xsl:template>"
961"<xsl:template match=\"bottle\">"
962" <TR><xsl:apply-templates select=\"name\" /><xsl:apply-templates select=\"cost\" /></TR>"
963"</xsl:template>"
964"<xsl:template match=\"name\">"
965" <TD><xsl:apply-templates /></TD>"
966"</xsl:template>"
967"<xsl:template match=\"cost\">"
968" <TD><xsl:apply-templates /></TD>"
969"</xsl:template>"
970"</xsl:stylesheet>";
971
972static const CHAR szBasicTransformXML[] =
973"<?xml version=\"1.0\"?><bottle><wine><name>Wine</name><cost>$25.00</cost></wine></bottle>";
974
976"<HTML><BODY><TABLE><TD>Wine</TD><TD>$25.00</TD></TABLE></BODY></HTML>";
977
978#define SZ_EMAIL_DTD \
979"<!DOCTYPE email ["\
980" <!ELEMENT email (recipients,from,reply-to?,subject,body,attachment*)>"\
981" <!ATTLIST email attachments IDREFS #REQUIRED>"\
982" <!ATTLIST email sent (yes|no) \"no\">"\
983" <!ELEMENT recipients (to+,cc*)>"\
984" <!ELEMENT to (#PCDATA)>"\
985" <!ATTLIST to name CDATA #IMPLIED>"\
986" <!ELEMENT cc (#PCDATA)>"\
987" <!ATTLIST cc name CDATA #IMPLIED>"\
988" <!ELEMENT from (#PCDATA)>"\
989" <!ATTLIST from name CDATA #IMPLIED>"\
990" <!ELEMENT reply-to (#PCDATA)>"\
991" <!ATTLIST reply-to name CDATA #IMPLIED>"\
992" <!ELEMENT subject ANY>"\
993" <!ELEMENT body ANY>"\
994" <!ATTLIST body enc CDATA #FIXED \"UTF-8\">"\
995" <!ELEMENT attachment (#PCDATA)>"\
996" <!ATTLIST attachment id ID #REQUIRED>"\
997"]>"
998
999static const CHAR szEmailXML[] =
1000"<?xml version=\"1.0\"?>"
1002"<email attachments=\"patch1\">"
1003" <recipients>"
1004" <to>wine-patches@winehq.org</to>"
1005" </recipients>"
1006" <from name=\"Anonymous\">user@localhost</from>"
1007" <subject>msxml3/tests: DTD validation (try 87)</subject>"
1008" <body>"
1009" It no longer causes spontaneous combustion..."
1010" </body>"
1011" <attachment id=\"patch1\">0001-msxml3-tests-DTD-validation.patch</attachment>"
1012"</email>";
1013
1014static const CHAR szEmailXML_0D[] =
1015"<?xml version=\"1.0\"?>"
1017"<email attachments=\"patch1\">"
1018" <recipients>"
1019" <to>wine-patches@winehq.org</to>"
1020" </recipients>"
1021" <from name=\"Anonymous\">user@localhost</from>"
1022" <subject>msxml3/tests: DTD validation (try 88)</subject>"
1023" <body>"
1024" <undecl />"
1025" XML_ELEMENT_UNDECLARED 0xC00CE00D"
1026" </body>"
1027" <attachment id=\"patch1\">0001-msxml3-tests-DTD-validation.patch</attachment>"
1028"</email>";
1029
1030static const CHAR szEmailXML_0E[] =
1031"<?xml version=\"1.0\"?>"
1033"<email attachments=\"patch1\">"
1034" <recipients>"
1035" <to>wine-patches@winehq.org</to>"
1036" </recipients>"
1037" <from name=\"Anonymous\">user@localhost</from>"
1038" <subject>msxml3/tests: DTD validation (try 89)</subject>"
1039" <body>"
1040" XML_ELEMENT_ID_NOT_FOUND 0xC00CE00E"
1041" </body>"
1042" <attachment id=\"patch\">0001-msxml3-tests-DTD-validation.patch</attachment>"
1043"</email>";
1044
1045static const CHAR szEmailXML_11[] =
1046"<?xml version=\"1.0\"?>"
1048"<email attachments=\"patch1\">"
1049" <recipients>"
1050" </recipients>"
1051" <from name=\"Anonymous\">user@localhost</from>"
1052" <subject>msxml3/tests: DTD validation (try 90)</subject>"
1053" <body>"
1054" XML_EMPTY_NOT_ALLOWED 0xC00CE011"
1055" </body>"
1056" <attachment id=\"patch1\">0001-msxml3-tests-DTD-validation.patch</attachment>"
1057"</email>";
1058
1059static const CHAR szEmailXML_13[] =
1060"<?xml version=\"1.0\"?>"
1062"<msg attachments=\"patch1\">"
1063" <recipients>"
1064" <to>wine-patches@winehq.org</to>"
1065" </recipients>"
1066" <from name=\"Anonymous\">user@localhost</from>"
1067" <subject>msxml3/tests: DTD validation (try 91)</subject>"
1068" <body>"
1069" XML_ROOT_NAME_MISMATCH 0xC00CE013"
1070" </body>"
1071" <attachment id=\"patch1\">0001-msxml3-tests-DTD-validation.patch</attachment>"
1072"</msg>";
1073
1074static const CHAR szEmailXML_14[] =
1075"<?xml version=\"1.0\"?>"
1077"<email attachments=\"patch1\">"
1078" <to>wine-patches@winehq.org</to>"
1079" <from name=\"Anonymous\">user@localhost</from>"
1080" <subject>msxml3/tests: DTD validation (try 92)</subject>"
1081" <body>"
1082" XML_INVALID_CONTENT 0xC00CE014"
1083" </body>"
1084" <attachment id=\"patch1\">0001-msxml3-tests-DTD-validation.patch</attachment>"
1085"</email>";
1086
1087static const CHAR szEmailXML_15[] =
1088"<?xml version=\"1.0\"?>"
1090"<email attachments=\"patch1\" ip=\"127.0.0.1\">"
1091" <recipients>"
1092" <to>wine-patches@winehq.org</to>"
1093" </recipients>"
1094" <from name=\"Anonymous\">user@localhost</from>"
1095" <subject>msxml3/tests: DTD validation (try 93)</subject>"
1096" <body>"
1097" XML_ATTRIBUTE_NOT_DEFINED 0xC00CE015"
1098" </body>"
1099" <attachment id=\"patch1\">0001-msxml3-tests-DTD-validation.patch</attachment>"
1100"</email>";
1101
1102static const CHAR szEmailXML_16[] =
1103"<?xml version=\"1.0\"?>"
1105"<email attachments=\"patch1\">"
1106" <recipients>"
1107" <to>wine-patches@winehq.org</to>"
1108" </recipients>"
1109" <from name=\"Anonymous\">user@localhost</from>"
1110" <subject>msxml3/tests: DTD validation (try 94)</subject>"
1111" <body enc=\"ASCII\">"
1112" XML_ATTRIBUTE_FIXED 0xC00CE016"
1113" </body>"
1114" <attachment id=\"patch1\">0001-msxml3-tests-DTD-validation.patch</attachment>"
1115"</email>";
1116
1117static const CHAR szEmailXML_17[] =
1118"<?xml version=\"1.0\"?>"
1120"<email attachments=\"patch1\" sent=\"true\">"
1121" <recipients>"
1122" <to>wine-patches@winehq.org</to>"
1123" </recipients>"
1124" <from name=\"Anonymous\">user@localhost</from>"
1125" <subject>msxml3/tests: DTD validation (try 95)</subject>"
1126" <body>"
1127" XML_ATTRIBUTE_VALUE 0xC00CE017"
1128" </body>"
1129" <attachment id=\"patch1\">0001-msxml3-tests-DTD-validation.patch</attachment>"
1130"</email>";
1131
1132static const CHAR szEmailXML_18[] =
1133"<?xml version=\"1.0\"?>"
1135"<email attachments=\"patch1\">"
1136" oops"
1137" <recipients>"
1138" <to>wine-patches@winehq.org</to>"
1139" </recipients>"
1140" <from name=\"Anonymous\">user@localhost</from>"
1141" <subject>msxml3/tests: DTD validation (try 96)</subject>"
1142" <body>"
1143" XML_ILLEGAL_TEXT 0xC00CE018"
1144" </body>"
1145" <attachment id=\"patch1\">0001-msxml3-tests-DTD-validation.patch</attachment>"
1146"</email>";
1147
1148static const CHAR szEmailXML_20[] =
1149"<?xml version=\"1.0\"?>"
1151"<email>"
1152" <recipients>"
1153" <to>wine-patches@winehq.org</to>"
1154" </recipients>"
1155" <from name=\"Anonymous\">user@localhost</from>"
1156" <subject>msxml3/tests: DTD validation (try 97)</subject>"
1157" <body>"
1158" XML_REQUIRED_ATTRIBUTE_MISSING 0xC00CE020"
1159" </body>"
1160" <attachment id=\"patch1\">0001-msxml3-tests-DTD-validation.patch</attachment>"
1161"</email>";
1162
1163static const char xpath_simple_list[] =
1164"<?xml version=\"1.0\"?>"
1165"<root>"
1166" <a attr1=\"1\" attr2=\"2\" />"
1167" <b/>"
1168" <c/>"
1169" <d/>"
1170"</root>";
1171
1172static const char default_ns_doc[] = {
1173 "<?xml version=\"1.0\"?>"
1174 "<a xmlns:ns=\"nshref\" xml:lang=\"ru\" ns:b=\"b attr\" xml:c=\"c attr\" "
1175 " d=\"d attr\" />"
1176};
1177
1178static const char attributes_map[] = {
1179 "<?xml version=\"1.0\"?>"
1180 "<a attr1=\"value1\" attr2=\"value2\" attr3=\"value3\" attr4=\"value4\" />"
1181};
1182
1183static const WCHAR nonexistent_fileW[] = L"c:\\Nonexistent.xml";
1184
1185static const WCHAR szStrangeChars[] = L"&x \x2103";
1186
1187#define expect_bstr_eq_and_free(bstr, expect) { \
1188 BSTR bstrExp = alloc_str_from_narrow(expect); \
1189 ok(lstrcmpW(bstr, bstrExp) == 0, "String differs\n"); \
1190 SysFreeString(bstr); \
1191 SysFreeString(bstrExp); \
1192}
1193
1194#define expect_eq(expr, value, type, format) { type ret = (expr); ok((value) == ret, #expr " expected " format " got " format "\n", value, ret); }
1195
1196#define ole_expect(expr, expect) { \
1197 HRESULT r = expr; \
1198 ok(r == (expect), #expr " returned %x, expected %x\n", r, expect); \
1199}
1200
1201#define double_eq(x, y) ok((x)-(y)<=1e-14*(x) && (x)-(y)>=-1e-14*(x), "expected %.16g, got %.16g\n", x, y)
1202
1203static void* _create_object(const GUID *clsid, const char *name, const IID *iid, int line)
1204{
1205 void *obj = NULL;
1206 HRESULT hr;
1207
1208 hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, iid, &obj);
1209 ok(hr == S_OK, "failed to create %s instance: hr %#lx.\n", name, hr);
1210
1211 return obj;
1212}
1213
1214#define _create(cls) cls, #cls
1215
1216#define create_document(iid) _create_object(&_create(CLSID_DOMDocument2), iid, __LINE__)
1217#define create_document_version(v, iid) _create_object(&_create(CLSID_DOMDocument ## v), iid, __LINE__)
1218#define create_cache(iid) _create_object(&_create(CLSID_XMLSchemaCache), iid, __LINE__)
1219#define create_xsltemplate(iid) _create_object(&_create(CLSID_XSLTemplate), iid, __LINE__)
1220
1221static BSTR alloc_str_from_narrow(const char *str)
1222{
1223 int len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
1224 BSTR ret = SysAllocStringLen(NULL, len - 1); /* NUL character added automatically */
1226 return ret;
1227}
1228
1231
1232static BSTR _bstr_(const char *str)
1233{
1237}
1238
1239static void free_bstrs(void)
1240{
1241 int i;
1242 for (i = 0; i < alloced_bstrs_count; i++)
1245}
1246
1247static VARIANT _variantbstr_(const char *str)
1248{
1249 VARIANT v;
1250 V_VT(&v) = VT_BSTR;
1251 V_BSTR(&v) = _bstr_(str);
1252 return v;
1253}
1254
1255static BOOL compareIgnoreReturns(BSTR sLeft, BSTR sRight)
1256{
1257 for (;;)
1258 {
1259 while (*sLeft == '\r' || *sLeft == '\n') sLeft++;
1260 while (*sRight == '\r' || *sRight == '\n') sRight++;
1261 if (*sLeft != *sRight) return FALSE;
1262 if (!*sLeft) return TRUE;
1263 sLeft++;
1264 sRight++;
1265 }
1266}
1267
1269{
1270 switch (type)
1271 {
1272 case NODE_ATTRIBUTE:
1273 strcpy(buf, "A");
1274 break;
1275 case NODE_ELEMENT:
1276 strcpy(buf, "E");
1277 break;
1278 case NODE_DOCUMENT:
1279 strcpy(buf, "D");
1280 break;
1281 case NODE_TEXT:
1282 strcpy(buf, "T");
1283 break;
1284 case NODE_COMMENT:
1285 strcpy(buf, "C");
1286 break;
1288 strcpy(buf, "P");
1289 break;
1290 default:
1291 wsprintfA(buf, "[%d]", type);
1292 }
1293}
1294
1296{
1297 HRESULT r;
1298 int pos = 0;
1299
1300 IXMLDOMNode_AddRef(node);
1301 do
1302 {
1303 IXMLDOMNode *new_node;
1304
1305 pos++;
1306 r = IXMLDOMNode_get_previousSibling(node, &new_node);
1307 ok(SUCCEEDED(r), "get_previousSibling failed\n");
1308 IXMLDOMNode_Release(node);
1309 node = new_node;
1310 } while (r == S_OK);
1311 return pos;
1312}
1313
1315{
1316 HRESULT hr = S_OK;
1318
1319 if (node == NULL)
1320 {
1321 lstrcpyA(buf, "(null)");
1322 return;
1323 }
1324
1325 IXMLDOMNode_AddRef(node);
1326 while (hr == S_OK)
1327 {
1328 IXMLDOMNode *new_node;
1329
1330 hr = IXMLDOMNode_get_nodeType(node, &type);
1331 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1333 buf+=strlen(buf);
1334
1335 if (type == NODE_ATTRIBUTE)
1336 {
1337 BSTR bstr;
1338 hr = IXMLDOMNode_get_nodeName(node, &bstr);
1339 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1340 *(buf++) = '\'';
1341 wsprintfA(buf, "%ws", bstr);
1342 buf += strlen(buf);
1343 *(buf++) = '\'';
1344 SysFreeString(bstr);
1345
1346 hr = IXMLDOMNode_selectSingleNode(node, _bstr_(".."), &new_node);
1347 }
1348 else
1349 {
1350 hr = IXMLDOMNode_get_parentNode(node, &new_node);
1352 buf += strlen(buf);
1353 }
1354
1355 ok(SUCCEEDED(hr), "Unexpected hr %#lx.\n", hr);
1356 IXMLDOMNode_Release(node);
1357 node = new_node;
1358 if (hr == S_OK)
1359 *(buf++) = '.';
1360 }
1361
1362 *buf = 0;
1363}
1364
1366{
1367 static char buf[4096];
1368 char *pos = buf;
1369 LONG len = 0;
1370 HRESULT hr;
1371 int i;
1372
1373 if (list == NULL)
1374 {
1375 strcpy(buf, "(null)");
1376 return buf;
1377 }
1378 hr = IXMLDOMNodeList_get_length(list, &len);
1379 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1380 for (i = 0; i < len; i++)
1381 {
1383 if (i > 0)
1384 *(pos++) = ' ';
1385 hr = IXMLDOMNodeList_nextNode(list, &node);
1386 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1388 pos += strlen(pos);
1389 IXMLDOMNode_Release(node);
1390 }
1391 *pos = 0;
1392 return buf;
1393}
1394
1395#define expect_node(node, expstr) { char str[4096]; node_to_string(node, str); ok(strcmp(str, expstr)==0, "Invalid node: %s, expected %s\n", str, expstr); }
1396#define expect_list_and_release(list, expstr) { char *str = list_to_string(list); ok(strcmp(str, expstr)==0, "Invalid node list: %s, expected %s\n", str, expstr); if (list) IXMLDOMNodeList_Release(list); }
1397
1401};
1402
1404 const CLSID *clsid;
1405 const char *name;
1406 struct docload_ret_t ret[2]; /* 0 - ::load(), 1 - ::loadXML() */
1407};
1408
1410 { &CLSID_DOMDocument, "CLSID_DOMDocument", {{VARIANT_FALSE, S_FALSE }, {VARIANT_TRUE, S_OK } }},
1411 { &CLSID_DOMDocument2, "CLSID_DOMDocument2", {{VARIANT_FALSE, S_FALSE }, {VARIANT_FALSE, S_FALSE } }},
1412 { &CLSID_DOMDocument26, "CLSID_DOMDocument26", {{VARIANT_FALSE, S_FALSE }, {VARIANT_TRUE, S_OK } }},
1413 { &CLSID_DOMDocument30, "CLSID_DOMDocument30", {{VARIANT_FALSE, S_FALSE }, {VARIANT_FALSE, S_FALSE } }},
1414 { &CLSID_DOMDocument40, "CLSID_DOMDocument40", {{VARIANT_FALSE, S_FALSE }, {VARIANT_FALSE, S_FALSE } }},
1415 { &CLSID_DOMDocument60, "CLSID_DOMDocument60", {{VARIANT_FALSE, S_FALSE }, {VARIANT_FALSE, S_FALSE } }},
1416 { NULL }
1417};
1418
1419static const char* leading_spaces_xmldata[] = {
1420 "\n<?xml version=\"1.0\" encoding=\"UTF-16\" ?><root/>",
1421 " <?xml version=\"1.0\"?><root/>",
1422 "\n<?xml version=\"1.0\"?><root/>",
1423 "\t<?xml version=\"1.0\"?><root/>",
1424 "\r\n<?xml version=\"1.0\"?><root/>",
1425 "\r<?xml version=\"1.0\"?><root/>",
1426 "\r\r\r\r\t\t \n\n <?xml version=\"1.0\"?><root/>",
1427 0
1428};
1429
1430static void test_domdoc( void )
1431{
1432 IXMLDOMDocument *doc;
1436 IXMLDOMText *nodetext = NULL;
1437 IXMLDOMComment *node_comment = NULL;
1438 IXMLDOMAttribute *node_attr = NULL;
1439 IXMLDOMNode *nodeChild = NULL;
1441 const struct leading_spaces_t *class_ptr;
1442 const char **data_ptr;
1444 VARIANT var;
1445 BSTR str;
1446 LONG code, ref;
1447 LONG nLength = 0;
1448 WCHAR buff[100];
1449 char path[MAX_PATH];
1450 HRESULT hr;
1451 int index;
1452
1454 strcat(path, "leading_spaces.xml");
1455
1456 /* Load document with leading spaces
1457 *
1458 * Test all CLSIDs with all test data XML strings
1459 */
1460 class_ptr = leading_spaces_classdata;
1461 index = 0;
1462 while (class_ptr->clsid)
1463 {
1464 HRESULT hr;
1465 int i;
1466
1467 if (is_clsid_supported(class_ptr->clsid, &IID_IXMLDOMDocument))
1468 {
1469 hr = CoCreateInstance(class_ptr->clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (void**)&doc);
1470 }
1471 else
1472 {
1473 class_ptr++;
1474 index++;
1475 continue;
1476 }
1477
1478 data_ptr = leading_spaces_xmldata;
1479 i = 0;
1480 while (*data_ptr) {
1481 BSTR data = _bstr_(*data_ptr);
1482 DWORD written;
1483 HANDLE file;
1484
1486 ok(file != INVALID_HANDLE_VALUE, "can't create file %s: %lu\n", path, GetLastError());
1487
1488 WriteFile(file, data, lstrlenW(data)*sizeof(WCHAR), &written, NULL);
1490
1491 b = 0xc;
1492 V_VT(&var) = VT_BSTR;
1493 V_BSTR(&var) = _bstr_(path);
1494 hr = IXMLDOMDocument_load(doc, var, &b);
1495 ok(hr == class_ptr->ret[0].hr, "Unexpected hr %#lx.\n", hr);
1496 ok(b == class_ptr->ret[0].b, "%d:%d, got %d, expected %d\n", index, i, b, class_ptr->ret[0].b);
1497
1499
1500 b = 0xc;
1501 hr = IXMLDOMDocument_loadXML(doc, data, &b);
1502 ok(hr == class_ptr->ret[1].hr, "Unexpected hr %#lx.\n", hr);
1503 ok(b == class_ptr->ret[1].b, "%d:%d, got %d, expected %d\n", index, i, b, class_ptr->ret[1].b);
1504
1505 data_ptr++;
1506 i++;
1507 }
1508
1509 class_ptr++;
1510 index++;
1511 free_bstrs();
1512 }
1513
1514 doc = create_document(&IID_IXMLDOMDocument);
1515 if (!doc) return;
1516
1517 check_interface(doc, &IID_IXMLDOMDocument, TRUE);
1520 check_interface(doc, &IID_IObjectSafety, TRUE);
1523 check_interface(doc, &IID_IDispatchEx, TRUE);
1524
1525if (0)
1526{
1527 /* crashes on native */
1528 IXMLDOMDocument_loadXML( doc, (BSTR)0x1, NULL );
1529}
1530
1531 /* try some stupid things */
1532 hr = IXMLDOMDocument_loadXML( doc, NULL, NULL );
1533 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
1534
1535 b = VARIANT_TRUE;
1536 hr = IXMLDOMDocument_loadXML( doc, NULL, &b );
1537 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
1538 ok( b == VARIANT_FALSE, "failed to load XML string\n");
1539
1540 /* try to load a document from a nonexistent file */
1541 b = VARIANT_TRUE;
1543 VariantInit(&var);
1544 V_VT(&var) = VT_BSTR;
1545 V_BSTR(&var) = str;
1546
1547 hr = IXMLDOMDocument_load( doc, var, &b);
1548 ok(hr == S_FALSE, "loadXML succeeded\n");
1549 ok( b == VARIANT_FALSE, "succeeded in loading XML string\n");
1550 SysFreeString( str );
1551
1552 str = (void *)0xdeadbeef;
1553 hr = IXMLDOMDocument_get_url(doc, &str);
1554 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
1555 ok(str == NULL, "got %p\n", str);
1556
1557 /* try load an empty document */
1558 b = VARIANT_TRUE;
1559 str = SysAllocString( L"" );
1560 hr = IXMLDOMDocument_loadXML( doc, str, &b );
1561 ok(hr == S_FALSE, "loadXML succeeded\n");
1562 ok( b == VARIANT_FALSE, "succeeded in loading XML string\n");
1563 SysFreeString( str );
1564
1565 hr = IXMLDOMDocument_get_async( doc, &b );
1566 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1567 ok( b == VARIANT_TRUE, "Wrong default value\n");
1568
1569 /* check that there's no document element */
1570 element = NULL;
1571 hr = IXMLDOMDocument_get_documentElement( doc, &element );
1572 ok(hr == S_FALSE, "should be no document element\n");
1573
1574 /* try finding a node */
1575 node = NULL;
1576 str = SysAllocString( L"str1" );
1577 hr = IXMLDOMDocument_selectSingleNode( doc, str, &node );
1578 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
1579 SysFreeString( str );
1580
1581 b = VARIANT_TRUE;
1582 str = SysAllocString( L"<?xml version='1.0'?>\n" );
1583 hr = IXMLDOMDocument_loadXML( doc, str, &b );
1584 ok(hr == S_FALSE, "loadXML succeeded\n");
1585 ok( b == VARIANT_FALSE, "succeeded in loading XML string\n");
1586 SysFreeString( str );
1587
1588 /* check that there's no document element */
1589 element = (IXMLDOMElement*)1;
1590 hr = IXMLDOMDocument_get_documentElement( doc, &element );
1591 ok(hr == S_FALSE, "should be no document element\n");
1592 ok( element == NULL, "Element should be NULL\n");
1593
1594 /* test for BSTR handling, pass broken BSTR */
1595 memcpy(&buff[2], szComplete1, sizeof(szComplete1));
1596 /* just a big length */
1597 *(DWORD*)buff = 0xf0f0;
1598 b = VARIANT_FALSE;
1599 hr = IXMLDOMDocument_loadXML( doc, &buff[2], &b );
1600 ok(hr == S_OK, "loadXML failed\n");
1601 ok( b == VARIANT_TRUE, "failed to load XML string\n");
1602
1603 /* loadXML ignores the encoding attribute and always expects Unicode */
1604 b = VARIANT_FALSE;
1605 str = SysAllocString( L"<?xml version='1.0' encoding='Windows-1252'?>\n<open></open>\n" );
1606 hr = IXMLDOMDocument_loadXML( doc, str, &b );
1607 ok(hr == S_OK, "loadXML failed\n");
1608 ok( b == VARIANT_TRUE, "failed to load XML string\n");
1609 SysFreeString( str );
1610
1611 /* try a BSTR containing a Windows-1252 document */
1612 b = VARIANT_TRUE;
1614 hr = IXMLDOMDocument_loadXML( doc, str, &b );
1615 ok(hr == S_FALSE, "loadXML succeeded\n");
1616 ok( b == VARIANT_FALSE, "succeeded in loading XML string\n");
1617 SysFreeString( str );
1618
1619 /* try a BSTR containing a ISO8859-1 document */
1620 b = VARIANT_TRUE;
1622 hr = IXMLDOMDocument_loadXML( doc, str, &b );
1623 ok(hr == S_FALSE, "loadXML succeeded\n");
1624 ok( b == VARIANT_FALSE, "succeeded in loading XML string\n");
1625 SysFreeString( str );
1626
1627 /* try to load something valid */
1628 b = VARIANT_FALSE;
1630 hr = IXMLDOMDocument_loadXML( doc, str, &b );
1631 ok(hr == S_OK, "loadXML failed\n");
1632 ok( b == VARIANT_TRUE, "failed to load XML string\n");
1633 SysFreeString( str );
1634
1635 /* check if nodename is correct */
1636 hr = IXMLDOMDocument_get_nodeName( doc, NULL );
1637 ok ( hr == E_INVALIDARG, "get_nodeName (NULL) wrong code\n");
1638
1639 str = (void *)0xdeadbeef;
1640 hr = IXMLDOMDocument_get_baseName( doc, &str );
1641 ok ( hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
1642 ok (str == NULL, "got %p\n", str);
1643
1644 /* content doesn't matter here */
1645 str = NULL;
1646 hr = IXMLDOMDocument_get_nodeName( doc, &str );
1647 ok ( hr == S_OK, "get_nodeName wrong code\n");
1648 ok ( str != NULL, "str is null\n");
1649 ok( !lstrcmpW( str, L"#document" ), "incorrect nodeName\n");
1650 SysFreeString( str );
1651
1652 /* test put_text */
1653 hr = IXMLDOMDocument_put_text( doc, _bstr_("Should fail") );
1654 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
1655
1656 /* check that there's a document element */
1657 element = NULL;
1658 hr = IXMLDOMDocument_get_documentElement( doc, &element );
1659 ok(hr == S_OK, "should be a document element\n");
1660 if( element )
1661 {
1663
1664 hr = IXMLDOMElement_QueryInterface( element, &IID_IObjectIdentity, (void**)&ident );
1665 ok(hr == E_NOINTERFACE, "Unexpected hr %#lx.\n", hr);
1666
1667 IXMLDOMElement_Release( element );
1668 element = NULL;
1669 }
1670
1671 /* as soon as we call loadXML again, the document element will disappear */
1672 b = 2;
1673 hr = IXMLDOMDocument_loadXML( doc, NULL, NULL );
1674 ok(hr == S_FALSE, "loadXML failed\n");
1675 ok( b == 2, "variant modified\n");
1676 hr = IXMLDOMDocument_get_documentElement( doc, &element );
1677 ok(hr == S_FALSE, "should be no document element\n");
1678
1679 /* try to load something else simple and valid */
1680 b = VARIANT_FALSE;
1681 str = SysAllocString( L"<?xml version='1.0'?>\n<a></a>\n" );
1682 hr = IXMLDOMDocument_loadXML( doc, str, &b );
1683 ok(hr == S_OK, "loadXML failed\n");
1684 ok( b == VARIANT_TRUE, "failed to load XML string\n");
1685 SysFreeString( str );
1686
1687 /* try something a little more complicated */
1688 b = FALSE;
1689 hr = IXMLDOMDocument_loadXML( doc, _bstr_(complete4A), &b );
1690 ok(hr == S_OK, "loadXML failed\n");
1691 ok( b == VARIANT_TRUE, "failed to load XML string\n");
1692
1693 hr = IXMLDOMDocument_get_parseError( doc, &error );
1694 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1695
1696 hr = IXMLDOMParseError_get_errorCode( error, &code );
1697 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
1698 ok( code == 0, "code %ld\n", code );
1699 IXMLDOMParseError_Release( error );
1700
1701 /* test createTextNode */
1702 hr = IXMLDOMDocument_createTextNode(doc, _bstr_(""), &nodetext);
1703 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1704 IXMLDOMText_Release(nodetext);
1705
1706 str = SysAllocString( L"open" );
1707 hr = IXMLDOMDocument_createTextNode(doc, str, NULL);
1708 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
1709 hr = IXMLDOMDocument_createTextNode(doc, str, &nodetext);
1710 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1711 SysFreeString( str );
1712 if(nodetext)
1713 {
1714 hr = IXMLDOMText_QueryInterface(nodetext, &IID_IXMLDOMElement, (void**)&element);
1715 ok(hr == E_NOINTERFACE, "Unexpected hr %#lx.\n", hr);
1716
1717 /* Text Last Child Checks */
1718 hr = IXMLDOMText_get_lastChild(nodetext, NULL);
1719 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
1720
1721 nodeChild = (IXMLDOMNode*)0x1;
1722 hr = IXMLDOMText_get_lastChild(nodetext, &nodeChild);
1723 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
1724 ok(nodeChild == NULL, "nodeChild not NULL\n");
1725
1726 /* test length property */
1727 hr = IXMLDOMText_get_length(nodetext, NULL);
1728 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
1729
1730 hr = IXMLDOMText_get_length(nodetext, &nLength);
1731 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1732 ok(nLength == 4, "expected 4 got %ld\n", nLength);
1733
1734 /* put data Tests */
1735 hr = IXMLDOMText_put_data(nodetext, _bstr_("This &is a ; test <>\\"));
1736 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1737
1738 /* get data Tests */
1739 hr = IXMLDOMText_get_data(nodetext, &str);
1740 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1741 ok(!lstrcmpW(str, L"This &is a ; test <>\\"), "incorrect put_data string\n");
1743
1744 /* Confirm XML text is good */
1745 hr = IXMLDOMText_get_xml(nodetext, &str);
1746 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1747 ok(!lstrcmpW(str, L"This &amp;is a ; test &lt;&gt;\\"), "incorrect xml string\n");
1749
1750 /* Confirm we get the put_data Text back */
1751 hr = IXMLDOMText_get_text(nodetext, &str);
1752 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1753 ok(!lstrcmpW(str, L"This &is a ; test <>\\"), "incorrect xml string\n");
1755
1756 /* test substringData */
1757 hr = IXMLDOMText_substringData(nodetext, 0, 4, NULL);
1758 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
1759
1760 /* test substringData - Invalid offset */
1761 str = (void *)0xdeadbeef;
1762 hr = IXMLDOMText_substringData(nodetext, -1, 4, &str);
1763 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
1764 ok( str == NULL, "incorrect string\n");
1765
1766 /* test substringData - Invalid offset */
1767 str = (void *)0xdeadbeef;
1768 hr = IXMLDOMText_substringData(nodetext, 30, 0, &str);
1769 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
1770 ok( str == NULL, "incorrect string\n");
1771
1772 /* test substringData - Invalid size */
1773 str = (void *)0xdeadbeef;
1774 hr = IXMLDOMText_substringData(nodetext, 0, -1, &str);
1775 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
1776 ok( str == NULL, "incorrect string\n");
1777
1778 /* test substringData - Invalid size */
1779 str = (void *)0xdeadbeef;
1780 hr = IXMLDOMText_substringData(nodetext, 2, 0, &str);
1781 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
1782 ok( str == NULL, "incorrect string\n");
1783
1784 /* test substringData - Start of string */
1785 hr = IXMLDOMText_substringData(nodetext, 0, 4, &str);
1786 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1787 ok(!lstrcmpW(str, L"This"), "incorrect substringData string\n");
1789
1790 /* test substringData - Middle of string */
1791 hr = IXMLDOMText_substringData(nodetext, 13, 4, &str);
1792 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1793 ok(!lstrcmpW(str, L"test"), "incorrect substringData string\n");
1795
1796 /* test substringData - End of string */
1797 hr = IXMLDOMText_substringData(nodetext, 20, 4, &str);
1798 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1799 ok(!lstrcmpW(str, L"\\"), "incorrect substringData string\n");
1801
1802 /* test appendData */
1803 hr = IXMLDOMText_appendData(nodetext, NULL);
1804 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1805
1806 hr = IXMLDOMText_appendData(nodetext, _bstr_(""));
1807 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1808
1809 hr = IXMLDOMText_appendData(nodetext, _bstr_("Append"));
1810 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1811
1812 hr = IXMLDOMText_get_text(nodetext, &str);
1813 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1814 ok(!lstrcmpW(str, L"This &is a ; test <>\\Append"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
1816
1817 /* test insertData */
1819 hr = IXMLDOMText_insertData(nodetext, -1, str);
1820 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1821
1822 hr = IXMLDOMText_insertData(nodetext, -1, NULL);
1823 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1824
1825 hr = IXMLDOMText_insertData(nodetext, 1000, str);
1826 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1827
1828 hr = IXMLDOMText_insertData(nodetext, 1000, NULL);
1829 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1830
1831 hr = IXMLDOMText_insertData(nodetext, 0, NULL);
1832 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1833
1834 hr = IXMLDOMText_insertData(nodetext, 0, str);
1835 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1837
1838 hr = IXMLDOMText_insertData(nodetext, -1, _bstr_("Inserting"));
1839 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
1840
1841 hr = IXMLDOMText_insertData(nodetext, 1000, _bstr_("Inserting"));
1842 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
1843
1844 hr = IXMLDOMText_insertData(nodetext, 0, _bstr_("Begin "));
1845 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1846
1847 hr = IXMLDOMText_insertData(nodetext, 17, _bstr_("Middle"));
1848 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1849
1850 hr = IXMLDOMText_insertData(nodetext, 39, _bstr_(" End"));
1851 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1852
1853 hr = IXMLDOMText_get_text(nodetext, &str);
1854 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1855 ok(!lstrcmpW(str, L"Begin This &is a Middle; test <>\\Append End"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
1857
1858 /* delete data */
1859 /* invalid arguments */
1860 hr = IXMLDOMText_deleteData(nodetext, -1, 1);
1861 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
1862
1863 hr = IXMLDOMText_deleteData(nodetext, 0, 0);
1864 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1865
1866 hr = IXMLDOMText_deleteData(nodetext, 0, -1);
1867 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
1868
1869 hr = IXMLDOMText_get_length(nodetext, &nLength);
1870 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1871 ok(nLength == 43, "expected 43 got %ld\n", nLength);
1872
1873 hr = IXMLDOMText_deleteData(nodetext, nLength, 1);
1874 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1875
1876 hr = IXMLDOMText_deleteData(nodetext, nLength+1, 1);
1877 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
1878
1879 /* delete from start */
1880 hr = IXMLDOMText_deleteData(nodetext, 0, 5);
1881 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1882
1883 hr = IXMLDOMText_get_length(nodetext, &nLength);
1884 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1885 ok(nLength == 38, "expected 38 got %ld\n", nLength);
1886
1887 hr = IXMLDOMText_get_text(nodetext, &str);
1888 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1889 ok(!lstrcmpW(str, L"This &is a Middle; test <>\\Append End"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
1891
1892 /* delete from end */
1893 hr = IXMLDOMText_deleteData(nodetext, 35, 3);
1894 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1895
1896 hr = IXMLDOMText_get_length(nodetext, &nLength);
1897 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1898 ok(nLength == 35, "expected 35 got %ld\n", nLength);
1899
1900 hr = IXMLDOMText_get_text(nodetext, &str);
1901 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1902 ok(!lstrcmpW(str, L"This &is a Middle; test <>\\Append"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
1904
1905 /* delete from inside */
1906 hr = IXMLDOMText_deleteData(nodetext, 1, 33);
1907 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1908
1909 hr = IXMLDOMText_get_length(nodetext, &nLength);
1910 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1911 ok(nLength == 2, "expected 2 got %ld\n", nLength);
1912
1913 hr = IXMLDOMText_get_text(nodetext, &str);
1914 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1915 ok(!lstrcmpW(str, L""), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
1917
1918 /* delete whole data ... */
1919 hr = IXMLDOMText_get_length(nodetext, &nLength);
1920 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1921
1922 hr = IXMLDOMText_deleteData(nodetext, 0, nLength);
1923 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1924 /* ... and try again with empty string */
1925 hr = IXMLDOMText_deleteData(nodetext, 0, nLength);
1926 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1927
1928 /* test put_data */
1929 V_VT(&var) = VT_BSTR;
1930 V_BSTR(&var) = SysAllocString(L"str1");
1931 hr = IXMLDOMText_put_nodeValue(nodetext, var);
1932 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1933 VariantClear(&var);
1934
1935 hr = IXMLDOMText_get_text(nodetext, &str);
1936 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1937 ok( !lstrcmpW( str, L"str1" ), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str) );
1939
1940 /* test put_data */
1941 V_VT(&var) = VT_I4;
1942 V_I4(&var) = 99;
1943 hr = IXMLDOMText_put_nodeValue(nodetext, var);
1944 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1945 VariantClear(&var);
1946
1947 hr = IXMLDOMText_get_text(nodetext, &str);
1948 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1949 ok(!lstrcmpW(str, L"99"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
1951
1952 /* ::replaceData() */
1953 V_VT(&var) = VT_BSTR;
1954 V_BSTR(&var) = SysAllocString(L"str1");
1955 hr = IXMLDOMText_put_nodeValue(nodetext, var);
1956 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1957 VariantClear(&var);
1958
1959 hr = IXMLDOMText_replaceData(nodetext, 6, 0, NULL);
1960 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
1961 hr = IXMLDOMText_get_text(nodetext, &str);
1962 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1963 ok(!lstrcmpW(str, L"str1"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
1965
1966 hr = IXMLDOMText_replaceData(nodetext, 0, 0, NULL);
1967 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1968 hr = IXMLDOMText_get_text(nodetext, &str);
1969 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1970 ok(!lstrcmpW(str, L"str1"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
1972
1973 /* NULL pointer means delete */
1974 hr = IXMLDOMText_replaceData(nodetext, 0, 1, NULL);
1975 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1976 hr = IXMLDOMText_get_text(nodetext, &str);
1977 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1978 ok(!lstrcmpW(str, L"tr1"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
1980
1981 /* empty string means delete */
1982 hr = IXMLDOMText_replaceData(nodetext, 0, 1, _bstr_(""));
1983 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1984 hr = IXMLDOMText_get_text(nodetext, &str);
1985 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1986 ok(!lstrcmpW(str, L"r1"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
1988
1989 /* zero count means insert */
1990 hr = IXMLDOMText_replaceData(nodetext, 0, 0, _bstr_("a"));
1991 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1992 hr = IXMLDOMText_get_text(nodetext, &str);
1993 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1994 ok(!lstrcmpW(str, L"ar1"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
1996
1997 hr = IXMLDOMText_replaceData(nodetext, 0, 2, NULL);
1998 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
1999
2000 hr = IXMLDOMText_insertData(nodetext, 0, _bstr_("m"));
2001 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2002 hr = IXMLDOMText_get_text(nodetext, &str);
2003 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2004 ok(!lstrcmpW(str, L"m1"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
2006
2007 /* nonempty string, count greater than its length */
2008 hr = IXMLDOMText_replaceData(nodetext, 0, 2, _bstr_("a1.2"));
2009 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2010 hr = IXMLDOMText_get_text(nodetext, &str);
2011 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2012 ok(!lstrcmpW(str, L"a1.2"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
2014
2015 /* nonempty string, count less than its length */
2016 hr = IXMLDOMText_replaceData(nodetext, 0, 1, _bstr_("wine"));
2017 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2018 hr = IXMLDOMText_get_text(nodetext, &str);
2019 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2020 ok(!lstrcmpW(str, L"wine1.2"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
2022
2023 IXMLDOMText_Release( nodetext );
2024 }
2025
2026 /* test Create Comment */
2027 hr = IXMLDOMDocument_createComment(doc, NULL, NULL);
2028 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
2029 node_comment = (IXMLDOMComment*)0x1;
2030
2031 /* empty comment */
2032 hr = IXMLDOMDocument_createComment(doc, _bstr_(""), &node_comment);
2033 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2034 str = NULL;
2035 hr = IXMLDOMComment_get_data(node_comment, &str);
2036 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2037 ok( str && SysStringLen(str) == 0, "expected empty string data\n");
2038 IXMLDOMComment_Release(node_comment);
2040
2041 hr = IXMLDOMDocument_createComment(doc, NULL, &node_comment);
2042 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2043 str = NULL;
2044 hr = IXMLDOMComment_get_data(node_comment, &str);
2045 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2046 ok( str && (SysStringLen(str) == 0), "expected empty string data\n");
2047 IXMLDOMComment_Release(node_comment);
2049
2050 str = SysAllocString(L"A Comment");
2051 hr = IXMLDOMDocument_createComment(doc, str, &node_comment);
2053 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2054 if(node_comment)
2055 {
2056 /* Last Child Checks */
2057 hr = IXMLDOMComment_get_lastChild(node_comment, NULL);
2058 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
2059
2060 nodeChild = (IXMLDOMNode*)0x1;
2061 hr = IXMLDOMComment_get_lastChild(node_comment, &nodeChild);
2062 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
2063 ok(nodeChild == NULL, "pLastChild not NULL\n");
2064
2065 /* baseName */
2066 str = (void *)0xdeadbeef;
2067 hr = IXMLDOMComment_get_baseName(node_comment, &str);
2068 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
2069 ok(str == NULL, "Expected NULL\n");
2070
2071 IXMLDOMComment_Release( node_comment );
2072 }
2073
2074 /* test Create Attribute */
2075 str = SysAllocString(L"Attr");
2076 hr = IXMLDOMDocument_createAttribute(doc, NULL, NULL);
2077 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
2078 hr = IXMLDOMDocument_createAttribute(doc, str, &node_attr);
2079 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2080 IXMLDOMAttribute_Release( node_attr);
2082
2083 /* test Processing Instruction */
2085 hr = IXMLDOMDocument_createProcessingInstruction(doc, str, str, NULL);
2086 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
2087 hr = IXMLDOMDocument_createProcessingInstruction(doc, NULL, str, &nodePI);
2088 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
2089 hr = IXMLDOMDocument_createProcessingInstruction(doc, str, str, &nodePI);
2090 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
2092
2093 hr = IXMLDOMDocument_createProcessingInstruction(doc, _bstr_("xml"), _bstr_("version=\"1.0\""), &nodePI);
2094 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2095 if(nodePI)
2096 {
2097 /* Last Child Checks */
2098 hr = IXMLDOMProcessingInstruction_get_lastChild(nodePI, NULL);
2099 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
2100
2101 nodeChild = (IXMLDOMNode*)0x1;
2102 hr = IXMLDOMProcessingInstruction_get_lastChild(nodePI, &nodeChild);
2103 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
2104 ok(nodeChild == NULL, "nodeChild not NULL\n");
2105
2106 /* test nodeName */
2107 hr = IXMLDOMProcessingInstruction_get_nodeName(nodePI, &str);
2108 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2109 ok(!lstrcmpW(str, L"xml"), "incorrect nodeName string\n");
2111
2112 /* test baseName */
2113 str = NULL;
2114 hr = IXMLDOMProcessingInstruction_get_baseName(nodePI, &str);
2115 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2116 ok(!lstrcmpW(str, L"xml"), "incorrect nodeName string\n");
2118
2119 /* test Target */
2120 hr = IXMLDOMProcessingInstruction_get_target(nodePI, &str);
2121 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2122 ok(!lstrcmpW(str, L"xml"), "incorrect target string\n");
2124
2125 /* test get_data */
2126 hr = IXMLDOMProcessingInstruction_get_data(nodePI, &str);
2127 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2128 ok(!lstrcmpW(str, L"version=\"1.0\""), "incorrect data string\n");
2130
2131 /* test put_data */
2132 hr = IXMLDOMProcessingInstruction_put_data(nodePI, _bstr_("version=\"1.0\" encoding=\"UTF-8\""));
2133 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
2134
2135 /* test put_data */
2136 V_VT(&var) = VT_BSTR;
2137 V_BSTR(&var) = SysAllocString(L"open"); /* Doesn't matter what the string is, cannot set an xml node. */
2138 hr = IXMLDOMProcessingInstruction_put_nodeValue(nodePI, var);
2139 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
2140 VariantClear(&var);
2141
2142 /* test get nodeName */
2143 hr = IXMLDOMProcessingInstruction_get_nodeName(nodePI, &str);
2144 ok(!lstrcmpW(str, L"xml"), "incorrect nodeName string\n");
2145 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2147
2148 IXMLDOMProcessingInstruction_Release(nodePI);
2149 }
2150
2151 ref = IXMLDOMDocument_Release( doc );
2152 ok( ref == 0, "got %ld\n", ref);
2153
2154 free_bstrs();
2155}
2156
2157static void test_persiststream(void)
2158{
2159 IPersistStreamInit *streaminit;
2161 IXMLDOMDocument *doc;
2164 HRESULT hr;
2165 CLSID clsid;
2166
2167 doc = create_document(&IID_IXMLDOMDocument);
2168
2169 hr = IXMLDOMDocument_QueryInterface(doc, &IID_IPersistStreamInit, (void**)&streaminit);
2170 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2171
2172 hr = IPersistStreamInit_InitNew(streaminit);
2173 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2174
2175 hr = IPersistStreamInit_GetSizeMax(streaminit, &size);
2176 ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr);
2177
2178 hr = IXMLDOMDocument_QueryInterface(doc, &IID_IPersistStream, (void **)&stream);
2179 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2180 ok((IUnknown *)stream == (IUnknown *)streaminit, "got %p, %p\n", stream, streaminit);
2181
2184
2185 hr = IPersistStreamInit_GetClassID(streaminit, NULL);
2186 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
2187
2188 memset(&clsid, 0, sizeof(clsid));
2189 hr = IPersistStreamInit_GetClassID(streaminit, &clsid);
2190 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2191 ok(IsEqualGUID(&clsid, &CLSID_DOMDocument2), "wrong clsid %s\n", wine_dbgstr_guid(&clsid));
2192
2193 IPersistStream_Release(stream);
2194
2195 /* test Load */
2197 hr = IPersistStreamInit_Load(streaminit, istream);
2198 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2199 IStream_Release(istream);
2201
2202 istream = SHCreateMemStream((const BYTE*)"", 0);
2203 hr = IPersistStreamInit_Load(streaminit, istream);
2204 todo_wine ok(hr == XML_E_MISSINGROOT, "Unexpected hr %#lx.\n", hr);
2205 ok(FAILED(hr), "got success\n");
2206 IStream_Release(istream);
2208
2209 IPersistStreamInit_Release(streaminit);
2210 IXMLDOMDocument_Release(doc);
2211}
2212
2213static void test_domnode( void )
2214{
2215 IXMLDOMDocument *doc, *owner = NULL;
2218 IXMLDOMNode *node = NULL, *next = NULL;
2223 HRESULT hr;
2224 BSTR str;
2225 VARIANT var;
2226 LONG count;
2227
2228 doc = create_document(&IID_IXMLDOMDocument);
2229
2230 b = FALSE;
2231 hr = IXMLDOMDocument_loadXML( doc, _bstr_(complete4A), &b );
2232 ok(hr == S_OK, "loadXML failed\n");
2233 ok( b == VARIANT_TRUE, "failed to load XML string\n");
2234
2235 EXPECT_CHILDREN(doc);
2236
2237 hr = IXMLDOMDocument_get_documentElement( doc, &element );
2238 ok(hr == S_OK, "should be a document element\n");
2239 ok( element != NULL, "should be an element\n");
2240
2241 VariantInit(&var);
2242 ok( V_VT(&var) == VT_EMPTY, "variant init failed\n");
2243
2244 hr = IXMLDOMDocument_get_nodeValue( doc, NULL );
2245 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
2246
2247 hr = IXMLDOMDocument_get_nodeValue( doc, &var );
2248 ok(hr == S_FALSE, "get_nodeValue returned wrong code\n");
2249 ok( V_VT(&var) == VT_NULL, "variant wasn't empty\n");
2250 ok( V_BSTR(&var) == NULL, "variant value wasn't null\n");
2251
2252 if (element)
2253 {
2254 IXMLDOMNamedNodeMap *attributes;
2255
2256 owner = NULL;
2257 hr = IXMLDOMElement_get_ownerDocument( element, &owner );
2258 ok(hr == S_OK, "get_ownerDocument return code\n");
2259 ok( owner != doc, "get_ownerDocument return\n");
2260 IXMLDOMDocument_Release(owner);
2261
2263 hr = IXMLDOMElement_get_nodeType( element, &type);
2264 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2265 ok( type == NODE_ELEMENT, "node not an element\n");
2266
2267 str = NULL;
2268 hr = IXMLDOMElement_get_baseName( element, &str );
2269 ok(hr == S_OK, "get_baseName returned wrong code\n");
2270 ok( !lstrcmpW(str, L"lc"), "Unexpected basename.\n");
2272
2273 /* check if nodename is correct */
2274 hr = IXMLDOMElement_get_nodeName( element, NULL );
2275 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
2276
2277 /* content doesn't matter here */
2278 str = NULL;
2279 hr = IXMLDOMElement_get_nodeName( element, &str );
2280 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2281 ok ( str != NULL, "str is null\n");
2282 ok( !lstrcmpW( str, L"lc" ), "Unexpected nodeName\n");
2283 SysFreeString( str );
2284
2286 V_VT(&var) = VT_I4;
2287 V_I4(&var) = 0x1234;
2288 hr = IXMLDOMElement_getAttribute( element, str, &var );
2289 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
2290 ok( V_VT(&var) == VT_NULL || V_VT(&var) == VT_EMPTY, "vt = %x\n", V_VT(&var));
2291 VariantClear(&var);
2293
2294 str = SysAllocString( L"dl" );
2295 V_VT(&var) = VT_I4;
2296 V_I4(&var) = 0x1234;
2297 hr = IXMLDOMElement_getAttribute( element, str, &var );
2298 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2299 ok( V_VT(&var) == VT_BSTR, "vt = %x\n", V_VT(&var));
2300 ok( !lstrcmpW(V_BSTR(&var), L"str1"), "wrong attr value\n");
2301 VariantClear( &var );
2302
2303 hr = IXMLDOMElement_getAttribute( element, NULL, &var );
2304 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
2305
2306 hr = IXMLDOMElement_getAttribute( element, str, NULL );
2307 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
2308
2309 attr = NULL;
2310 hr = IXMLDOMElement_getAttributeNode( element, str, &attr);
2311 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2312 ok( attr != NULL, "getAttributeNode returned NULL\n" );
2313 if (attr)
2314 {
2315 hr = IXMLDOMAttribute_get_parentNode( attr, NULL );
2316 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
2317
2318 /* attribute doesn't have a parent in msxml interpretation */
2319 node = (IXMLDOMNode*)0xdeadbeef;
2320 hr = IXMLDOMAttribute_get_parentNode( attr, &node );
2321 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
2322 ok( node == NULL, "Expected NULL, got %p\n", node );
2323
2324 IXMLDOMAttribute_Release(attr);
2325 }
2326
2327 SysFreeString( str );
2328
2329 hr = IXMLDOMElement_get_attributes( element, &map );
2330 ok(hr == S_OK, "get_attributes returned wrong code\n");
2331 ok( map != NULL, "should be attributes\n");
2332
2334
2335 hr = IXMLDOMElement_get_childNodes( element, &list );
2336 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2337 hr = IXMLDOMNodeList_nextNode( list, &node ); /* <bs> */
2338 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2339 IXMLDOMNode_Release( node );
2340 hr = IXMLDOMNodeList_nextNode( list, &node ); /* <pr> */
2341 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2342 IXMLDOMNode_Release( node );
2343 hr = IXMLDOMNodeList_nextNode( list, &node ); /* <empty> */
2344 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2345 hr = IXMLDOMNode_get_attributes( node, &attributes );
2346 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2347 next = (IXMLDOMNode*)0xdeadbeef;
2348 hr = IXMLDOMNamedNodeMap_nextNode( attributes, &next );
2349 ok(hr == S_FALSE, "Unexpected %#lx.\n", hr);
2350 ok( next == NULL, "Expected NULL, ret %p\n", next );
2351 IXMLDOMNamedNodeMap_Release( attributes );
2352 IXMLDOMNode_Release( node );
2353 node = NULL;
2354 next = NULL;
2355 IXMLDOMNodeList_Release( list );
2356 list = NULL;
2357 }
2358 else
2359 ok( FALSE, "no element\n");
2360
2361 if (map)
2362 {
2363 str = SysAllocString( L"dl" );
2364 hr = IXMLDOMNamedNodeMap_getNamedItem( map, str, &node );
2365 ok(hr == S_OK, "getNamedItem returned wrong code\n");
2366 ok( node != NULL, "should be attributes\n");
2367 IXMLDOMNode_Release(node);
2368 SysFreeString( str );
2369
2370 str = SysAllocString( L"dl" );
2371 hr = IXMLDOMNamedNodeMap_getNamedItem( map, str, NULL );
2372 ok(hr == E_INVALIDARG, "getNamedItem should return E_INVALIDARG\n");
2373 SysFreeString( str );
2374
2375 /* something that isn't in complete4A */
2376 str = SysAllocString( L"open" );
2377 node = (IXMLDOMNode *) 1;
2378 hr = IXMLDOMNamedNodeMap_getNamedItem( map, str, &node );
2379 ok(hr == S_FALSE, "getNamedItem found a node that wasn't there\n");
2380 ok( node == NULL, "getNamedItem should have returned NULL\n");
2381 SysFreeString( str );
2382
2383 /* test indexed access of attributes */
2384 hr = IXMLDOMNamedNodeMap_get_length( map, NULL );
2385 ok ( hr == E_INVALIDARG, "get_length should return E_INVALIDARG\n");
2386
2387 hr = IXMLDOMNamedNodeMap_get_length( map, &count );
2388 ok ( hr == S_OK, "get_length wrong code\n");
2389 ok ( count == 1, "get_length != 1\n");
2390
2391 node = NULL;
2392 hr = IXMLDOMNamedNodeMap_get_item( map, -1, &node);
2393 ok ( hr == S_FALSE, "get_item (-1) wrong code\n");
2394 ok ( node == NULL, "there is no node\n");
2395
2396 node = NULL;
2397 hr = IXMLDOMNamedNodeMap_get_item( map, 1, &node);
2398 ok ( hr == S_FALSE, "get_item (1) wrong code\n");
2399 ok ( node == NULL, "there is no attribute\n");
2400
2401 node = NULL;
2402 hr = IXMLDOMNamedNodeMap_get_item( map, 0, &node);
2403 ok ( hr == S_OK, "get_item (0) wrong code\n");
2404 ok ( node != NULL, "should be attribute\n");
2405
2406 hr = IXMLDOMNode_get_nodeName( node, NULL );
2407 ok ( hr == E_INVALIDARG, "get_nodeName (NULL) wrong code\n");
2408
2409 /* content doesn't matter here */
2410 str = NULL;
2411 hr = IXMLDOMNode_get_nodeName( node, &str );
2412 ok ( hr == S_OK, "get_nodeName wrong code\n");
2413 ok ( str != NULL, "str is null\n");
2414 ok( !lstrcmpW( str, L"dl" ), "incorrect node name\n");
2415 SysFreeString( str );
2416 IXMLDOMNode_Release( node );
2417
2418 /* test sequential access of attributes */
2419 node = NULL;
2420 hr = IXMLDOMNamedNodeMap_nextNode( map, &node );
2421 ok ( hr == S_OK, "nextNode (first time) wrong code\n");
2422 ok ( node != NULL, "nextNode, should be attribute\n");
2423 IXMLDOMNode_Release( node );
2424
2425 hr = IXMLDOMNamedNodeMap_nextNode( map, &node );
2426 ok ( hr != S_OK, "nextNode (second time) wrong code\n");
2427 ok ( node == NULL, "nextNode, there is no attribute\n");
2428
2429 hr = IXMLDOMNamedNodeMap_reset( map );
2430 ok ( hr == S_OK, "reset should return S_OK\n");
2431
2432 hr = IXMLDOMNamedNodeMap_nextNode( map, &node );
2433 ok ( hr == S_OK, "nextNode (third time) wrong code\n");
2434 ok ( node != NULL, "nextNode, should be attribute\n");
2435 }
2436 else
2437 ok( FALSE, "no map\n");
2438
2439 if (node)
2440 {
2442 hr = IXMLDOMNode_get_nodeType( node, &type);
2443 ok(hr == S_OK, "get_nodeType returned wrong code\n");
2444 ok( type == NODE_ATTRIBUTE, "node not an attribute\n");
2445
2446 str = NULL;
2447 hr = IXMLDOMNode_get_baseName( node, NULL );
2448 ok(hr == E_INVALIDARG, "get_baseName returned wrong code\n");
2449
2450 str = NULL;
2451 hr = IXMLDOMNode_get_baseName( node, &str );
2452 ok(hr == S_OK, "get_baseName returned wrong code\n");
2453 ok( !lstrcmpW(str, L"dl"), "Unexpected basename.\n");
2454 SysFreeString( str );
2455
2456 hr = IXMLDOMNode_get_childNodes( node, NULL );
2457 ok(hr == E_INVALIDARG, "get_childNodes returned wrong code\n");
2458
2459 hr = IXMLDOMNode_get_childNodes( node, &list );
2460 ok(hr == S_OK, "get_childNodes returned wrong code\n");
2461
2462 if (list)
2463 {
2464 hr = IXMLDOMNodeList_nextNode( list, &next );
2465 ok(hr == S_OK, "nextNode returned wrong code\n");
2466 }
2467 else
2468 ok( FALSE, "no childlist\n");
2469
2470 if (next)
2471 {
2473
2475 hr = IXMLDOMNode_get_nodeType( next, &type);
2476 ok(hr == S_OK, "get_nodeType returned wrong code\n");
2477 ok( type == NODE_TEXT, "node not text\n");
2478
2479 str = (void *)0xdeadbeef;
2480 hr = IXMLDOMNode_get_baseName( next, &str );
2481 ok(hr == S_FALSE, "get_baseName returned wrong code\n");
2482 ok( str == NULL, "basename was wrong\n");
2484 }
2485 else
2486 ok( FALSE, "no next\n");
2487
2488 if (next)
2489 IXMLDOMNode_Release( next );
2490 next = NULL;
2491 if (list)
2492 IXMLDOMNodeList_Release( list );
2493 list = NULL;
2494 if (node)
2495 IXMLDOMNode_Release( node );
2496 }
2497 else
2498 ok( FALSE, "no node\n");
2499 node = NULL;
2500
2501 if (map)
2502 IXMLDOMNamedNodeMap_Release( map );
2503
2504 /* now traverse the tree from the root element */
2505 if (element)
2506 {
2507 hr = IXMLDOMElement_get_childNodes( element, &list );
2508 ok(hr == S_OK, "get_childNodes returned wrong code\n");
2509
2510 /* using get_item for child list doesn't advance the position */
2511 hr = IXMLDOMNodeList_get_item(list, 1, &node);
2512 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2513 expect_node(node, "E2.E2.D1");
2514 IXMLDOMNode_Release(node);
2515 hr = IXMLDOMNodeList_nextNode(list, &node);
2516 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2517 expect_node(node, "E1.E2.D1");
2518 IXMLDOMNode_Release(node);
2519 hr = IXMLDOMNodeList_reset(list);
2520 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2521
2522 IXMLDOMNodeList_AddRef(list);
2523 expect_list_and_release(list, "E1.E2.D1 E2.E2.D1 E3.E2.D1 E4.E2.D1");
2524 hr = IXMLDOMNodeList_reset(list);
2525 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2526
2527 node = (void*)0xdeadbeef;
2528 str = SysAllocString(L"dl");
2529 hr = IXMLDOMElement_selectSingleNode( element, str, &node );
2531 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
2532 ok( node == NULL, "node %p\n", node );
2533
2534 node = (void*)0xdeadbeef;
2535 hr = IXMLDOMElement_selectSingleNode( element, _bstr_("In Valid"), &node );
2536 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
2537 ok( node == NULL, "node %p\n", node );
2538
2539 str = SysAllocString(L"bs");
2540 hr = IXMLDOMElement_selectSingleNode( element, str, &node );
2542 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2543 IXMLDOMNode_Release( node );
2544 }
2545 else
2546 ok( FALSE, "no element\n");
2547
2548 if (list)
2549 {
2550 hr = IXMLDOMNodeList_get_item(list, 0, NULL);
2551 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
2552
2553 hr = IXMLDOMNodeList_get_length(list, NULL);
2554 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
2555
2556 hr = IXMLDOMNodeList_get_length( list, &count );
2557 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2558 ok( count == 4, "get_length got %ld\n", count );
2559
2560 hr = IXMLDOMNodeList_nextNode(list, NULL);
2561 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
2562
2563 hr = IXMLDOMNodeList_nextNode( list, &node );
2564 ok(hr == S_OK, "nextNode returned wrong code\n");
2565 }
2566 else
2567 ok( FALSE, "no list\n");
2568
2569 if (node)
2570 {
2572 hr = IXMLDOMNode_get_nodeType( node, &type);
2573 ok(hr == S_OK, "get_nodeType returned wrong code\n");
2574 ok( type == NODE_ELEMENT, "node not text\n");
2575
2576 hr = IXMLDOMNode_hasChildNodes( node, NULL );
2577 ok(hr == E_INVALIDARG, "hasChildNodes bad return\n");
2578
2580
2581 str = NULL;
2582 hr = IXMLDOMNode_get_baseName( node, &str );
2583 ok(hr == S_OK, "get_baseName returned wrong code\n");
2584 ok( !lstrcmpW(str, L"bs"), "Unexpected basename.\n");
2586 }
2587 else
2588 ok( FALSE, "no node\n");
2589
2590 if (node)
2591 IXMLDOMNode_Release( node );
2592 if (list)
2593 IXMLDOMNodeList_Release( list );
2594 if (element)
2595 IXMLDOMElement_Release( element );
2596
2597 b = FALSE;
2599 hr = IXMLDOMDocument_loadXML( doc, str, &b );
2600 ok(hr == S_OK, "loadXML failed\n");
2601 ok( b == VARIANT_TRUE, "failed to load XML string\n");
2602 SysFreeString( str );
2603
2604 EXPECT_CHILDREN(doc);
2605
2606 hr = IXMLDOMDocument_get_documentElement( doc, &element );
2607 ok(hr == S_OK, "should be a document element\n");
2608 ok( element != NULL, "should be an element\n");
2609
2610 if (element)
2611 {
2612 BSTR tag = NULL;
2613
2614 /* check if the tag is correct */
2615 hr = IXMLDOMElement_get_tagName( element, &tag );
2616 ok(hr == S_OK, "couldn't get tag name\n");
2617 ok( tag != NULL, "tag was null\n");
2618 ok( !lstrcmpW( tag, L"S:search" ), "incorrect tag name\n");
2619 SysFreeString( tag );
2620
2621 IXMLDOMElement_Release( element );
2622 }
2623 ok(IXMLDOMDocument_Release( doc ) == 0, "document is not destroyed\n");
2624
2625 free_bstrs();
2626}
2627
2628typedef struct {
2632
2634 { NODE_ELEMENT, &IID_IXMLDOMElement },
2635 { NODE_ATTRIBUTE, &IID_IXMLDOMAttribute },
2636 { NODE_TEXT, &IID_IXMLDOMText },
2637 { NODE_CDATA_SECTION, &IID_IXMLDOMCDATASection },
2638 { NODE_ENTITY_REFERENCE, &IID_IXMLDOMEntityReference },
2639 { NODE_PROCESSING_INSTRUCTION, &IID_IXMLDOMProcessingInstruction },
2640 { NODE_COMMENT, &IID_IXMLDOMComment },
2641 { NODE_DOCUMENT_FRAGMENT, &IID_IXMLDOMDocumentFragment },
2643};
2644
2645static void test_refs(void)
2646{
2647 IXMLDOMImplementation *impl, *impl2;
2648 IXMLDOMElement *element, *elem2;
2649 IXMLDOMNodeList *node_list = NULL;
2650 IXMLDOMNode *node, *node2, *node3;
2651 const refcount_test_t *ptr;
2652 IXMLDOMDocument *doc;
2653 IUnknown *unk, *unk2;
2655 HRESULT hr;
2656 LONG ref;
2657
2658 doc = create_document(&IID_IXMLDOMDocument);
2659
2661 while (ptr->type != NODE_INVALID)
2662 {
2663 IUnknown *node_typed, *node_typed2;
2664 IDispatchEx *dispex, *dispex2;
2665 IDispatch *disp, *disp2;
2666 VARIANT type;
2667
2668 V_VT(&type) = VT_I1;
2669 V_I1(&type) = ptr->type;
2670
2671 EXPECT_REF(doc, 1);
2672 hr = IXMLDOMDocument_createNode(doc, type, _bstr_("name"), NULL, &node);
2673 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2674 EXPECT_REF(doc, 1);
2675 EXPECT_REF(node, 1);
2676
2677 /* try IDispatch and IUnknown from IXMLDOMNode */
2678 hr = IXMLDOMNode_QueryInterface(node, &IID_IUnknown, (void**)&unk);
2679 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2680 EXPECT_REF(unk, 2);
2681todo_wine {
2682 EXPECT_REF(node, 1);
2683 ok(unk != (IUnknown*)node, "%d: got %p and %p\n", ptr->type, unk, node);
2684}
2685 EXPECT_REF(unk, 2);
2686 hr = IUnknown_QueryInterface(unk, &IID_IDispatch, (void**)&disp);
2687 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2688 todo_wine ok(unk != (IUnknown*)disp, "%d: got %p and %p\n", ptr->type, unk, disp);
2689 EXPECT_REF(unk, 3);
2690 todo_wine EXPECT_REF(disp, 1);
2691
2692 EXPECT_REF(unk, 3);
2693 hr = IUnknown_QueryInterface(unk, &IID_IDispatch, (void**)&disp2);
2694 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2695 todo_wine ok(disp != disp2, "%d: got %p and %p\n", ptr->type, disp, disp2);
2696 EXPECT_REF(unk, 4);
2697 todo_wine EXPECT_REF(disp2, 1);
2698
2699 IDispatch_Release(disp);
2700 IDispatch_Release(disp2);
2701
2702 /* get IXMLDOMNode from this IUnknown */
2703 EXPECT_REF(unk, 2);
2704 hr = IUnknown_QueryInterface(unk, &IID_IXMLDOMNode, (void**)&node2);
2705 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2706 todo_wine ok(unk != (IUnknown*)node2, "%d: got %p and %p\n", ptr->type, unk, node2);
2707 EXPECT_REF(unk, 3);
2708 todo_wine EXPECT_REF(node2, 1);
2709
2710 EXPECT_REF(unk, 3);
2711 hr = IUnknown_QueryInterface(unk, &IID_IXMLDOMNode, (void**)&node3);
2712 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2713 todo_wine ok(node2 != node3, "%d: got %p and %p\n", ptr->type, node2, node3);
2714 EXPECT_REF(unk, 4);
2715 todo_wine EXPECT_REF(node3, 1);
2716
2717 IXMLDOMNode_Release(node2);
2718 IXMLDOMNode_Release(node3);
2719
2720 /* try IDispatchEx from IUnknown */
2721 EXPECT_REF(unk, 2);
2722 hr = IUnknown_QueryInterface(unk, &IID_IDispatchEx, (void**)&dispex);
2723 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2724 ok(unk != (IUnknown*)dispex, "%d: got %p and %p\n", ptr->type, unk, dispex);
2725 EXPECT_REF(unk, 3);
2726 todo_wine EXPECT_REF(dispex, 1);
2727
2728 EXPECT_REF(unk, 3);
2729 hr = IUnknown_QueryInterface(unk, &IID_IDispatchEx, (void**)&dispex2);
2730 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2731 todo_wine ok(dispex != dispex2, "%d: got %p and %p\n", ptr->type, dispex, dispex2);
2732 EXPECT_REF(unk, 4);
2733 todo_wine EXPECT_REF(dispex2, 1);
2734
2735 IDispatchEx_Release(dispex);
2736 IDispatchEx_Release(dispex2);
2737
2738 /* try corresponding IXMLDOM* */
2739 EXPECT_REF(unk, 2);
2740 hr = IUnknown_QueryInterface(unk, ptr->iid, (void**)&node_typed);
2741 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2742 EXPECT_REF(unk, 3);
2743 hr = IUnknown_QueryInterface(unk, ptr->iid, (void**)&node_typed2);
2744 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2745 EXPECT_REF(unk, 4);
2746 todo_wine ok(node_typed != node_typed2, "%d: got %p and %p\n", ptr->type, node_typed, node_typed2);
2747 IUnknown_Release(node_typed);
2748 IUnknown_Release(node_typed2);
2749
2750 /* try invalid IXMLDOM* */
2751 hr = IUnknown_QueryInterface(unk, (ptr+1)->iid, (void**)&node_typed);
2752 ok(hr == E_NOINTERFACE, "Unexpected hr %#lx.\n", hr);
2753
2754 IUnknown_Release(unk);
2755
2756 EXPECT_REF(node, 1);
2757 hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMNode, (void**)&node2);
2758 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2759 EXPECT_REF(node, 2);
2760 ok(node == node2, "%d: got %p and %p\n", ptr->type, node, node2);
2761
2762 EXPECT_REF(node, 2);
2763 hr = IXMLDOMNode_QueryInterface(node, ptr->iid, (void**)&node_typed);
2764 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2765 EXPECT_REF(node, 3);
2766todo_wine {
2767 EXPECT_REF(node_typed, 2);
2768 ok((IUnknown*)node != node_typed, "%d: got %p and %p\n", ptr->type, node, node_typed);
2769}
2770 IUnknown_Release(node_typed);
2771
2772 IXMLDOMNode_Release(node2);
2773 IXMLDOMNode_Release(node);
2774
2775 ptr++;
2776 }
2777
2778 EXPECT_REF(doc, 1);
2779 ref = IXMLDOMDocument_Release(doc);
2780 ok( ref == 0, "ref %ld\n", ref);
2781
2782 /* check IUnknown after releasing DOM iface */
2783 doc = create_document(&IID_IXMLDOMDocument);
2784 EXPECT_REF(doc, 1);
2785 hr = IXMLDOMDocument_QueryInterface(doc, &IID_IUnknown, (void**)&unk);
2786 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2787todo_wine {
2788 EXPECT_REF(unk, 3);
2789 EXPECT_REF(doc, 1);
2790}
2791 IXMLDOMDocument_Release(doc);
2792 EXPECT_REF(unk, 1);
2793 IUnknown_Release(unk);
2794
2795 doc = create_document(&IID_IXMLDOMDocument);
2796
2797 EXPECT_REF(doc, 1);
2798 hr = IXMLDOMDocument_QueryInterface(doc, &IID_IUnknown, (void**)&unk);
2799 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2800todo_wine {
2801 EXPECT_REF(unk, 3);
2802 EXPECT_REF(doc, 1);
2803}
2804 IUnknown_Release(unk);
2805
2806 /* IXMLDOMImplementation */
2807 EXPECT_REF(doc, 1);
2808 hr = IXMLDOMDocument_get_implementation(doc, &impl);
2809 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2810 EXPECT_REF(doc, 1);
2811 EXPECT_REF(impl, 1);
2812 hr = IXMLDOMDocument_get_implementation(doc, &impl2);
2813 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2814 EXPECT_REF(doc, 1);
2815 EXPECT_REF(impl2, 1);
2816 ok(impl != impl2, "got %p, %p\n", impl, impl2);
2817 IXMLDOMImplementation_Release(impl);
2818 IXMLDOMImplementation_Release(impl2);
2819
2820 hr = IXMLDOMDocument_loadXML( doc, _bstr_(complete4A), &b );
2821 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2822 ok( b == VARIANT_TRUE, "failed to load XML string\n");
2823
2824 EXPECT_REF(doc, 1);
2825 IXMLDOMDocument_AddRef( doc );
2826 EXPECT_REF(doc, 2);
2827 IXMLDOMDocument_AddRef( doc );
2828 EXPECT_REF(doc, 3);
2829
2830 IXMLDOMDocument_Release( doc );
2831 IXMLDOMDocument_Release( doc );
2832
2833 EXPECT_REF(doc, 1);
2834 hr = IXMLDOMDocument_QueryInterface(doc, &IID_IUnknown, (void**)&unk);
2835 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2836todo_wine {
2837 EXPECT_REF(unk, 3);
2838 EXPECT_REF(doc, 1);
2839}
2840 hr = IXMLDOMDocument_get_documentElement(doc, &element);
2841 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2842todo_wine {
2843 EXPECT_REF(doc, 1);
2844 EXPECT_REF(element, 2);
2845}
2846 hr = IXMLDOMDocument_get_documentElement(doc, &elem2);
2847 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2848
2849todo_wine {
2850 EXPECT_REF(doc, 1);
2851 EXPECT_REF(element, 2);
2852 EXPECT_REF(elem2, 2);
2853}
2854 IXMLDOMElement_AddRef(element);
2856 IXMLDOMElement_Release(element);
2857
2858 /* get IUnknown from a node doesn't touch node instance refcount */
2859 hr = IXMLDOMElement_QueryInterface(element, &IID_IUnknown, (void**)&unk);
2860 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2861 EXPECT_REF(element, 2);
2862todo_wine {
2863 EXPECT_REF(unk, 4);
2864 EXPECT_REF(elem2, 2);
2865}
2866 hr = IXMLDOMElement_QueryInterface(elem2, &IID_IUnknown, (void**)&unk2);
2867 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2868todo_wine {
2869 EXPECT_REF(unk, 5);
2870 EXPECT_REF(unk2, 5);
2871}
2872 EXPECT_REF(element, 2);
2873 EXPECT_REF(elem2, 2);
2874
2875 todo_wine ok(unk == unk2, "got %p and %p\n", unk, unk2);
2876 IUnknown_Release(unk);
2877
2878 /* IUnknown refcount is not affected by node refcount */
2879 todo_wine EXPECT_REF(unk2, 4);
2880 IXMLDOMElement_AddRef(elem2);
2881 todo_wine EXPECT_REF(unk2, 4);
2882 IXMLDOMElement_Release(elem2);
2883
2884 IXMLDOMElement_Release(elem2);
2885 todo_wine EXPECT_REF(unk2, 3);
2886
2887 IUnknown_Release(unk2);
2888
2889 hr = IXMLDOMElement_get_childNodes( element, &node_list );
2890 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2891
2893 EXPECT_REF(node_list, 1);
2894
2895 hr = IXMLDOMNodeList_get_item( node_list, 0, &node );
2896 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2897 EXPECT_REF(node_list, 1);
2898 EXPECT_REF(node, 1);
2899
2900 hr = IXMLDOMNodeList_get_item( node_list, 0, &node2 );
2901 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2902 EXPECT_REF(node_list, 1);
2903 EXPECT_REF(node2, 1);
2904
2905 ref = IXMLDOMNode_Release( node );
2906 ok( ref == 0, "ref %ld\n", ref );
2907 ref = IXMLDOMNode_Release( node2 );
2908 ok( ref == 0, "ref %ld\n", ref );
2909
2910 ref = IXMLDOMNodeList_Release( node_list );
2911 ok( ref == 0, "ref %ld\n", ref );
2912
2913 ok( node != node2, "node %p node2 %p\n", node, node2 );
2914
2915 ref = IXMLDOMDocument_Release( doc );
2916 todo_wine ok( ref == 0, "ref %ld\n", ref );
2917
2919
2920 /* IUnknown must be unique however we obtain it */
2921 hr = IXMLDOMElement_QueryInterface(element, &IID_IUnknown, (void**)&unk);
2922 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2923 EXPECT_REF(element, 2);
2924 hr = IXMLDOMElement_QueryInterface(element, &IID_IXMLDOMNode, (void**)&node);
2925 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2927 hr = IXMLDOMNode_QueryInterface(node, &IID_IUnknown, (void**)&unk2);
2928 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2930 ok(unk == unk2, "unk %p unk2 %p\n", unk, unk2);
2931 todo_wine ok(element != (void*)node, "node %p element %p\n", node, element);
2932
2933 IUnknown_Release( unk2 );
2934 IUnknown_Release( unk );
2935 IXMLDOMNode_Release( node );
2937
2938 IXMLDOMElement_Release( element );
2939
2940 free_bstrs();
2941}
2942
2943static void test_create(void)
2944{
2945 VARIANT var;
2946 BSTR str, name;
2947 IXMLDOMDocument *doc;
2951 IXMLDOMCDATASection *cdata;
2953 IXMLDOMNamedNodeMap *attr_map;
2954 IUnknown *unk;
2955 HRESULT hr;
2956 LONG ref;
2957 LONG num;
2958
2959 doc = create_document(&IID_IXMLDOMDocument);
2960
2961 EXPECT_REF(doc, 1);
2962
2963 /* types not supported for creation */
2964 V_VT(&var) = VT_I1;
2966 node = (IXMLDOMNode*)0x1;
2967 hr = IXMLDOMDocument_createNode( doc, var, NULL, NULL, &node );
2968 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
2969 ok( node == (void*)0x1, "expected same ptr, got %p\n", node);
2970
2971 V_VT(&var) = VT_I1;
2973 node = (IXMLDOMNode*)0x1;
2974 hr = IXMLDOMDocument_createNode( doc, var, NULL, NULL, &node );
2975 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
2976 ok( node == (void*)0x1, "expected same ptr, got %p\n", node);
2977
2978 V_VT(&var) = VT_I1;
2979 V_I1(&var) = NODE_ENTITY;
2980 node = (IXMLDOMNode*)0x1;
2981 hr = IXMLDOMDocument_createNode( doc, var, NULL, NULL, &node );
2982 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
2983 ok( node == (void*)0x1, "expected same ptr, got %p\n", node);
2984
2985 V_VT(&var) = VT_I1;
2987 node = (IXMLDOMNode*)0x1;
2988 hr = IXMLDOMDocument_createNode( doc, var, NULL, NULL, &node );
2989 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
2990 ok( node == (void*)0x1, "expected same ptr, got %p\n", node);
2991
2992 /* NODE_COMMENT */
2993 V_VT(&var) = VT_I1;
2994 V_I1(&var) = NODE_COMMENT;
2995 node = NULL;
2996 hr = IXMLDOMDocument_createNode( doc, var, NULL, NULL, &node );
2997 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
2998 ok( node != NULL, "\n");
2999
3000 hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMComment, (void**)&comment);
3001 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3002 IXMLDOMNode_Release(node);
3003
3004 str = NULL;
3005 hr = IXMLDOMComment_get_data(comment, &str);
3006 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3007 ok( str && SysStringLen(str) == 0, "expected empty comment, %p\n", str);
3008 IXMLDOMComment_Release(comment);
3010
3011 node = (IXMLDOMNode*)0x1;
3012 hr = IXMLDOMDocument_createNode( doc, var, _bstr_(""), NULL, &node );
3013 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3014
3015 hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMComment, (void**)&comment);
3016 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3017 IXMLDOMNode_Release(node);
3018
3019 str = NULL;
3020 hr = IXMLDOMComment_get_data(comment, &str);
3021 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3022 ok( str && SysStringLen(str) == 0, "expected empty comment, %p\n", str);
3023 IXMLDOMComment_Release(comment);
3025
3026 node = (IXMLDOMNode*)0x1;
3027 hr = IXMLDOMDocument_createNode( doc, var, _bstr_("blah"), NULL, &node );
3028 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3029
3030 hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMComment, (void**)&comment);
3031 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3032 IXMLDOMNode_Release(node);
3033
3034 str = NULL;
3035 hr = IXMLDOMComment_get_data(comment, &str);
3036 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3037 ok( str && SysStringLen(str) == 0, "expected empty comment, %p\n", str);
3038 IXMLDOMComment_Release(comment);
3040
3041 /* NODE_TEXT */
3042 V_VT(&var) = VT_I1;
3043 V_I1(&var) = NODE_TEXT;
3044 node = NULL;
3045 hr = IXMLDOMDocument_createNode( doc, var, NULL, NULL, &node );
3046 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3047 ok( node != NULL, "\n");
3048
3049 hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMText, (void**)&text);
3050 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3051 IXMLDOMNode_Release(node);
3052
3053 str = NULL;
3054 hr = IXMLDOMText_get_data(text, &str);
3055 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3056 ok( str && SysStringLen(str) == 0, "expected empty comment, %p\n", str);
3057 IXMLDOMText_Release(text);
3059
3060 node = (IXMLDOMNode*)0x1;
3061 hr = IXMLDOMDocument_createNode( doc, var, _bstr_(""), NULL, &node );
3062 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3063
3064 hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMText, (void**)&text);
3065 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3066 IXMLDOMNode_Release(node);
3067
3068 str = NULL;
3069 hr = IXMLDOMText_get_data(text, &str);
3070 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3071 ok( str && SysStringLen(str) == 0, "expected empty comment, %p\n", str);
3072 IXMLDOMText_Release(text);
3074
3075 node = (IXMLDOMNode*)0x1;
3076 hr = IXMLDOMDocument_createNode( doc, var, _bstr_("blah"), NULL, &node );
3077 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3078
3079 hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMText, (void**)&text);
3080 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3081 IXMLDOMNode_Release(node);
3082
3083 str = NULL;
3084 hr = IXMLDOMText_get_data(text, &str);
3085 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3086 ok( str && SysStringLen(str) == 0, "expected empty comment, %p\n", str);
3087 IXMLDOMText_Release(text);
3089
3090 /* NODE_CDATA_SECTION */
3091 V_VT(&var) = VT_I1;
3093 node = NULL;
3094 hr = IXMLDOMDocument_createNode( doc, var, NULL, NULL, &node );
3095 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3096 ok( node != NULL, "\n");
3097
3098 hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMCDATASection, (void**)&cdata);
3099 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3100 IXMLDOMNode_Release(node);
3101
3102 str = NULL;
3103 hr = IXMLDOMCDATASection_get_data(cdata, &str);
3104 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3105 ok( str && SysStringLen(str) == 0, "expected empty comment, %p\n", str);
3106 IXMLDOMCDATASection_Release(cdata);
3108
3109 node = (IXMLDOMNode*)0x1;
3110 hr = IXMLDOMDocument_createNode( doc, var, _bstr_(""), NULL, &node );
3111 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3112
3113 hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMCDATASection, (void**)&cdata);
3114 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3115 IXMLDOMNode_Release(node);
3116
3117 str = NULL;
3118 hr = IXMLDOMCDATASection_get_data(cdata, &str);
3119 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3120 ok( str && SysStringLen(str) == 0, "expected empty comment, %p\n", str);
3121 IXMLDOMCDATASection_Release(cdata);
3123
3124 node = (IXMLDOMNode*)0x1;
3125 hr = IXMLDOMDocument_createNode( doc, var, _bstr_("blah"), NULL, &node );
3126 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3127
3128 hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMCDATASection, (void**)&cdata);
3129 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3130 IXMLDOMNode_Release(node);
3131
3132 str = NULL;
3133 hr = IXMLDOMCDATASection_get_data(cdata, &str);
3134 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3135 ok( str && SysStringLen(str) == 0, "expected empty comment, %p\n", str);
3136 IXMLDOMCDATASection_Release(cdata);
3138
3139 /* NODE_ATTRIBUTE */
3140 V_VT(&var) = VT_I1;
3142 node = (IXMLDOMNode*)0x1;
3143 hr = IXMLDOMDocument_createNode( doc, var, NULL, NULL, &node );
3144 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
3145 ok( node == (void*)0x1, "expected same ptr, got %p\n", node);
3146
3147 V_VT(&var) = VT_I1;
3149 node = (IXMLDOMNode*)0x1;
3150 hr = IXMLDOMDocument_createNode( doc, var, _bstr_(""), NULL, &node );
3151 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
3152 ok( node == (void*)0x1, "expected same ptr, got %p\n", node);
3153
3154 V_VT(&var) = VT_I1;
3156 str = SysAllocString( L"lc" );
3157 hr = IXMLDOMDocument_createNode( doc, var, str, NULL, &node );
3158 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3159 if (SUCCEEDED(hr)) IXMLDOMNode_Release(node);
3161
3162 /* a name is required for attribute, try a BSTR with first null wchar */
3163 V_VT(&var) = VT_I1;
3165 str = SysAllocString( L"str1" );
3166 str[0] = 0;
3167 node = (IXMLDOMNode*)0x1;
3168 hr = IXMLDOMDocument_createNode( doc, var, str, NULL, &node );
3169 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
3170 ok( node == (void*)0x1, "expected same ptr, got %p\n", node);
3172
3173 /* NODE_PROCESSING_INSTRUCTION */
3174 V_VT(&var) = VT_I1;
3176 node = (IXMLDOMNode*)0x1;
3177 hr = IXMLDOMDocument_createNode( doc, var, NULL, NULL, &node );
3178 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
3179 ok( node == (void*)0x1, "expected same ptr, got %p\n", node);
3180
3181 V_VT(&var) = VT_I1;
3183 node = (IXMLDOMNode*)0x1;
3184 hr = IXMLDOMDocument_createNode( doc, var, _bstr_(""), NULL, &node );
3185 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
3186 ok( node == (void*)0x1, "expected same ptr, got %p\n", node);
3187
3188 V_VT(&var) = VT_I1;
3190 hr = IXMLDOMDocument_createNode( doc, var, _bstr_("pi"), NULL, NULL );
3191 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
3192
3193 /* NODE_ENTITY_REFERENCE */
3194 V_VT(&var) = VT_I1;
3196 node = (IXMLDOMNode*)0x1;
3197 hr = IXMLDOMDocument_createNode( doc, var, NULL, NULL, &node );
3198 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
3199 ok( node == (void*)0x1, "expected same ptr, got %p\n", node);
3200
3201 V_VT(&var) = VT_I1;
3203 node = (IXMLDOMNode*)0x1;
3204 hr = IXMLDOMDocument_createNode( doc, var, _bstr_(""), NULL, &node );
3205 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
3206 ok( node == (void*)0x1, "expected same ptr, got %p\n", node);
3207
3208 /* NODE_ELEMENT */
3209 V_VT(&var) = VT_I1;
3210 V_I1(&var) = NODE_ELEMENT;
3211 node = (IXMLDOMNode*)0x1;
3212 hr = IXMLDOMDocument_createNode( doc, var, NULL, NULL, &node );
3213 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
3214 ok( node == (void*)0x1, "expected same ptr, got %p\n", node);
3215
3216 V_VT(&var) = VT_I1;
3217 V_I1(&var) = NODE_ELEMENT;
3218 node = (IXMLDOMNode*)0x1;
3219 hr = IXMLDOMDocument_createNode( doc, var, _bstr_(""), NULL, &node );
3220 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
3221 ok( node == (void*)0x1, "expected same ptr, got %p\n", node);
3222
3223 V_VT(&var) = VT_I1;
3224 V_I1(&var) = NODE_ELEMENT;
3225 str = SysAllocString( L"lc" );
3226 hr = IXMLDOMDocument_createNode( doc, var, str, NULL, &node );
3227 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3228 if( SUCCEEDED(hr) ) IXMLDOMNode_Release( node );
3229
3230 V_VT(&var) = VT_I1;
3231 V_I1(&var) = NODE_ELEMENT;
3232 hr = IXMLDOMDocument_createNode( doc, var, str, NULL, NULL );
3233 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
3234
3235 V_VT(&var) = VT_R4;
3236 V_R4(&var) = NODE_ELEMENT;
3237 hr = IXMLDOMDocument_createNode( doc, var, str, NULL, &node );
3238 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3239 if( SUCCEEDED(hr) ) IXMLDOMNode_Release( node );
3240
3241 V_VT(&var) = VT_BSTR;
3242 V_BSTR(&var) = SysAllocString( L"1" );
3243 hr = IXMLDOMDocument_createNode( doc, var, str, NULL, &node );
3244 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3245 if( SUCCEEDED(hr) ) IXMLDOMNode_Release( node );
3246 VariantClear(&var);
3247
3248 V_VT(&var) = VT_BSTR;
3249 V_BSTR(&var) = SysAllocString( L"1Garbage" );
3250 hr = IXMLDOMDocument_createNode( doc, var, str, NULL, &node );
3251 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
3252 if( SUCCEEDED(hr) ) IXMLDOMNode_Release( node );
3253 VariantClear(&var);
3254
3255 V_VT(&var) = VT_I4;
3256 V_I4(&var) = NODE_ELEMENT;
3257 hr = IXMLDOMDocument_createNode( doc, var, str, NULL, &node );
3258 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3259
3260 EXPECT_REF(doc, 1);
3261 hr = IXMLDOMDocument_appendChild( doc, node, &root );
3262 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3263 ok( node == root, "%p %p\n", node, root );
3264 EXPECT_REF(doc, 1);
3265
3266 EXPECT_REF(node, 2);
3267
3268 ref = IXMLDOMNode_Release( node );
3269 ok(ref == 1, "ref %ld\n", ref);
3270 SysFreeString( str );
3271
3272 V_VT(&var) = VT_I4;
3273 V_I4(&var) = NODE_ELEMENT;
3274 str = SysAllocString( L"bs" );
3275 hr = IXMLDOMDocument_createNode( doc, var, str, NULL, &node );
3276 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3277 SysFreeString( str );
3278
3279 EXPECT_REF(node, 1);
3280
3281 hr = IXMLDOMNode_QueryInterface( node, &IID_IUnknown, (void**)&unk );
3282 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3283
3284 EXPECT_REF(unk, 2);
3285
3286 V_VT(&var) = VT_EMPTY;
3287 child = NULL;
3288 hr = IXMLDOMNode_insertBefore( root, (IXMLDOMNode*)unk, var, &child );
3289 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3290 ok( unk == (IUnknown*)child, "%p %p\n", unk, child );
3291
3292 todo_wine EXPECT_REF(unk, 4);
3293
3294 IXMLDOMNode_Release( child );
3295 IUnknown_Release( unk );
3296
3297 V_VT(&var) = VT_NULL;
3299 hr = IXMLDOMNode_insertBefore( root, node, var, &child );
3300 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3301 ok( node == child, "%p %p\n", node, child );
3302 IXMLDOMNode_Release( child );
3303
3304 V_VT(&var) = VT_NULL;
3306 hr = IXMLDOMNode_insertBefore( root, node, var, NULL );
3307 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3308 IXMLDOMNode_Release( node );
3309
3310 hr = IXMLDOMNode_QueryInterface( root, &IID_IXMLDOMElement, (void**)&element );
3311 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3312
3313 hr = IXMLDOMElement_get_attributes( element, &attr_map );
3314 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3315 hr = IXMLDOMNamedNodeMap_get_length( attr_map, &num );
3316 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3317 ok( num == 0, "num %ld\n", num );
3318 IXMLDOMNamedNodeMap_Release( attr_map );
3319
3320 V_VT(&var) = VT_BSTR;
3321 V_BSTR(&var) = SysAllocString( L"str1" );
3322 name = SysAllocString( L"dl" );
3323 hr = IXMLDOMElement_setAttribute( element, name, var );
3324 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3325 hr = IXMLDOMElement_get_attributes( element, &attr_map );
3326 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3327 hr = IXMLDOMNamedNodeMap_get_length( attr_map, &num );
3328 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3329 ok( num == 1, "num %ld\n", num );
3330 IXMLDOMNamedNodeMap_Release( attr_map );
3331 VariantClear(&var);
3332
3333 V_VT(&var) = VT_BSTR;
3334 V_BSTR(&var) = SysAllocString( L"str2" );
3335 hr = IXMLDOMElement_setAttribute( element, name, var );
3336 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3337 hr = IXMLDOMElement_get_attributes( element, &attr_map );
3338 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3339 hr = IXMLDOMNamedNodeMap_get_length( attr_map, &num );
3340 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3341 ok( num == 1, "num %ld\n", num );
3342 IXMLDOMNamedNodeMap_Release( attr_map );
3343 VariantClear(&var);
3344 hr = IXMLDOMElement_getAttribute( element, name, &var );
3345 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3346 ok( !lstrcmpW(V_BSTR(&var), L"str2"), "wrong attr value\n");
3347 VariantClear(&var);
3349
3350 V_VT(&var) = VT_BSTR;
3351 V_BSTR(&var) = SysAllocString( L"str1" );
3352 name = SysAllocString( L"lc" );
3353 hr = IXMLDOMElement_setAttribute( element, name, var );
3354 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3355 hr = IXMLDOMElement_get_attributes( element, &attr_map );
3356 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3357 hr = IXMLDOMNamedNodeMap_get_length( attr_map, &num );
3358 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3359 ok( num == 2, "num %ld\n", num );
3360 IXMLDOMNamedNodeMap_Release( attr_map );
3361 VariantClear(&var);
3363
3364 V_VT(&var) = VT_I4;
3365 V_I4(&var) = 10;
3366 name = SysAllocString( L"bs" );
3367 hr = IXMLDOMElement_setAttribute( element, name, var );
3368 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3369 VariantClear(&var);
3370 hr = IXMLDOMElement_getAttribute( element, name, &var );
3371 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3372 ok( V_VT(&var) == VT_BSTR, "variant type %x\n", V_VT(&var));
3373 VariantClear(&var);
3375
3376 /* Create an Attribute */
3377 V_VT(&var) = VT_I4;
3379 str = SysAllocString( L"Attr" );
3380 hr = IXMLDOMDocument_createNode( doc, var, str, NULL, &node );
3381 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3382 ok( node != NULL, "node was null\n");
3384
3385 IXMLDOMElement_Release( element );
3386 IXMLDOMNode_Release( root );
3387 IXMLDOMDocument_Release( doc );
3388}
3389
3391 const char *query;
3392 const char *result;
3393 int len;
3394};
3395
3396static const struct queryresult_t elementsbytagname[] = {
3397 { "", "P1.D1 E2.D1 E1.E2.D1 T1.E1.E2.D1 E2.E2.D1 T1.E2.E2.D1 E3.E2.D1 E4.E2.D1 E1.E4.E2.D1 T1.E1.E4.E2.D1", 10 },
3398 { "*", "E2.D1 E1.E2.D1 E2.E2.D1 E3.E2.D1 E4.E2.D1 E1.E4.E2.D1", 6 },
3399 { "bs", "E1.E2.D1", 1 },
3400 { "dl", "", 0 },
3401 { "str1","", 0 },
3402 { NULL }
3403};
3404
3406{
3407 const struct queryresult_t *ptr = elementsbytagname;
3408 IXMLDOMNodeList *node_list;
3409 IXMLDOMDocument *doc;
3411 WCHAR buff[100];
3413 HRESULT hr;
3414 LONG len;
3415 BSTR str;
3416
3417 doc = create_document(&IID_IXMLDOMDocument);
3418
3419 hr = IXMLDOMDocument_loadXML( doc, _bstr_(complete4A), &b );
3420 ok(hr == S_OK, "loadXML failed\n");
3421 ok( b == VARIANT_TRUE, "failed to load XML string\n");
3422
3423 /* null arguments cases */
3424 hr = IXMLDOMDocument_getElementsByTagName(doc, NULL, &node_list);
3425 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
3426 hr = IXMLDOMDocument_getElementsByTagName(doc, _bstr_("*"), NULL);
3427 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
3428
3429 while (ptr->query)
3430 {
3431 hr = IXMLDOMDocument_getElementsByTagName(doc, _bstr_(ptr->query), &node_list);
3432 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3433 hr = IXMLDOMNodeList_get_length(node_list, &len);
3434 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3435 ok(len == ptr->len, "%s: got len %ld, expected %d\n", ptr->query, len, ptr->len);
3436 expect_list_and_release(node_list, ptr->result);
3437
3438 free_bstrs();
3439 ptr++;
3440 }
3441
3442 /* broken query BSTR */
3443 memcpy(&buff[2], L"*", 2 * sizeof(WCHAR));
3444 /* just a big length */
3445 *(DWORD*)buff = 0xf0f0;
3446 hr = IXMLDOMDocument_getElementsByTagName(doc, &buff[2], &node_list);
3447 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3448 hr = IXMLDOMNodeList_get_length( node_list, &len );
3449 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3450 ok( len == 6, "len %ld\n", len );
3451 IXMLDOMNodeList_Release( node_list );
3452
3453 /* test for element */
3454 hr = IXMLDOMDocument_get_documentElement(doc, &elem);
3455 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3456
3457 str = SysAllocString( L"*" );
3458
3459 /* null arguments cases */
3460 hr = IXMLDOMElement_getElementsByTagName(elem, NULL, &node_list);
3461 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
3462 hr = IXMLDOMElement_getElementsByTagName(elem, str, NULL);
3463 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
3464
3465 hr = IXMLDOMElement_getElementsByTagName(elem, str, &node_list);
3466 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3467 hr = IXMLDOMNodeList_get_length( node_list, &len );
3468 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3469 ok( len == 5, "len %ld\n", len );
3470 expect_list_and_release(node_list, "E1.E2.D1 E2.E2.D1 E3.E2.D1 E4.E2.D1 E1.E4.E2.D1");
3471 SysFreeString( str );
3472
3473 /* broken query BSTR */
3474 memcpy(&buff[2], L"*", 2 * sizeof(WCHAR));
3475 /* just a big length */
3476 *(DWORD*)buff = 0xf0f0;
3477 hr = IXMLDOMElement_getElementsByTagName(elem, &buff[2], &node_list);
3478 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3479 hr = IXMLDOMNodeList_get_length( node_list, &len );
3480 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3481 ok( len == 5, "len %ld\n", len );
3482 IXMLDOMNodeList_Release( node_list );
3483
3484 IXMLDOMElement_Release(elem);
3485
3486 IXMLDOMDocument_Release( doc );
3487
3488 free_bstrs();
3489}
3490
3491static void test_get_text(void)
3492{
3493 BSTR str;
3495 IXMLDOMDocument *doc;
3496 IXMLDOMNode *node, *node2, *node3;
3497 IXMLDOMNode *nodeRoot;
3498 IXMLDOMNodeList *node_list;
3499 IXMLDOMNamedNodeMap *node_map;
3500 HRESULT hr;
3501 LONG len;
3502
3503 doc = create_document(&IID_IXMLDOMDocument);
3504
3505 hr = IXMLDOMDocument_loadXML( doc, _bstr_(complete4A), &b );
3506 ok(hr == S_OK, "loadXML failed\n");
3507 ok( b == VARIANT_TRUE, "failed to load XML string\n");
3508
3509 str = SysAllocString( L"bs" );
3510 hr = IXMLDOMDocument_getElementsByTagName( doc, str, &node_list );
3511 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3513
3514 /* Test to get all child node text. */
3515 hr = IXMLDOMDocument_QueryInterface(doc, &IID_IXMLDOMNode, (void**)&nodeRoot);
3516 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3517 if (hr == S_OK)
3518 {
3519 hr = IXMLDOMNode_get_text( nodeRoot, &str );
3520 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3521 expect_bstr_eq_and_free(str, "fn1.txt\n \nfn2.txt\n \nf1");
3522
3523 IXMLDOMNode_Release(nodeRoot);
3524 }
3525
3526 hr = IXMLDOMNodeList_get_length( node_list, NULL );
3527 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
3528
3529 hr = IXMLDOMNodeList_get_length( node_list, &len );
3530 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3531 ok( len == 1, "expect 1 got %ld\n", len );
3532
3533 hr = IXMLDOMNodeList_get_item( node_list, 0, NULL );
3534 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
3535
3536 hr = IXMLDOMNodeList_nextNode( node_list, NULL );
3537 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
3538
3539 hr = IXMLDOMNodeList_get_item( node_list, 0, &node );
3540 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3541 IXMLDOMNodeList_Release( node_list );
3542
3543 /* Invalid output parameter*/
3544 hr = IXMLDOMNode_get_text( node, NULL );
3545 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
3546
3547 hr = IXMLDOMNode_get_text( node, &str );
3548 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3549 ok( !lstrcmpW(str, L"fn1.txt"), "wrong string\n" );
3551
3552 hr = IXMLDOMNode_get_attributes( node, &node_map );
3553 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3554
3555 str = SysAllocString( L"vr" );
3556 hr = IXMLDOMNamedNodeMap_getNamedItem( node_map, str, &node2 );
3557 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3559
3560 hr = IXMLDOMNode_get_text( node2, &str );
3561 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3562 ok( !lstrcmpW(str, L"str2"), "Unexpected string.\n" );
3564
3565 hr = IXMLDOMNode_get_firstChild( node2, &node3 );
3566 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3567
3568 hr = IXMLDOMNode_get_text( node3, &str );
3569 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3570 ok( !lstrcmpW(str, L"str2"), "Unexpected string.\n" );
3572
3573
3574 IXMLDOMNode_Release( node3 );
3575 IXMLDOMNode_Release( node2 );
3576 IXMLDOMNamedNodeMap_Release( node_map );
3577 IXMLDOMNode_Release( node );
3578 IXMLDOMDocument_Release( doc );
3579
3580 free_bstrs();
3581}
3582
3583static void test_get_childNodes(void)
3584{
3585 IXMLDOMNodeList *node_list, *node_list2;
3586 IEnumVARIANT *enum1, *enum2, *enum3;
3588 IXMLDOMDocument *doc;
3589 IXMLDOMNode *node, *node2;
3591 IUnknown *unk1, *unk2;
3592 ULONG fetched;
3593 VARIANT v[2];
3594 HRESULT hr;
3595 BSTR str;
3596 LONG len;
3597
3598 doc = create_document(&IID_IXMLDOMDocument);
3599
3600 hr = IXMLDOMDocument_loadXML( doc, _bstr_(complete4A), &b );
3601 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3602 ok( b == VARIANT_TRUE, "failed to load XML string\n");
3603
3604 hr = IXMLDOMDocument_get_documentElement( doc, &element );
3605 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3606
3607 hr = IXMLDOMElement_get_childNodes( element, &node_list );
3608 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3609
3610 hr = IXMLDOMNodeList_get_length( node_list, &len );
3611 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3612 ok( len == 4, "len %ld\n", len);
3613
3614 /* refcount tests for IEnumVARIANT support */
3615 EXPECT_REF(node_list, 1);
3616 hr = IXMLDOMNodeList_QueryInterface(node_list, &IID_IEnumVARIANT, (void**)&enum1);
3617 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3618 EXPECT_REF(node_list, 1);
3619 EXPECT_REF(enum1, 2);
3620
3621 EXPECT_REF(node_list, 1);
3622 hr = IXMLDOMNodeList_QueryInterface(node_list, &IID_IEnumVARIANT, (void**)&enum2);
3623 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3624 EXPECT_REF(node_list, 1);
3625 ok(enum2 == enum1, "got %p, %p\n", enum2, enum1);
3626 IEnumVARIANT_Release(enum2);
3627
3628 hr = IXMLDOMNodeList_QueryInterface(node_list, &IID_IUnknown, (void**)&unk1);
3629 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3630 hr = IEnumVARIANT_QueryInterface(enum1, &IID_IUnknown, (void**)&unk2);
3631 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3632 EXPECT_REF(node_list, 3);
3633 EXPECT_REF(enum1, 2);
3634 ok(unk1 == unk2, "got %p, %p\n", unk1, unk2);
3635 IUnknown_Release(unk1);
3636 IUnknown_Release(unk2);
3637
3638 EXPECT_REF(node_list, 1);
3639 hr = IXMLDOMNodeList__newEnum(node_list, (IUnknown**)&enum2);
3640 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3641 EXPECT_REF(node_list, 2);
3642 EXPECT_REF(enum2, 1);
3643 ok(enum2 != enum1, "got %p, %p\n", enum2, enum1);
3644
3645 /* enumerator created with _newEnum() doesn't share IUnknown* with main object */
3646 hr = IXMLDOMNodeList_QueryInterface(node_list, &IID_IUnknown, (void**)&unk1);
3647 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3648 hr = IEnumVARIANT_QueryInterface(enum2, &IID_IUnknown, (void**)&unk2);
3649 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3650 EXPECT_REF(node_list, 3);
3651 EXPECT_REF(enum2, 2);
3652 ok(unk1 != unk2, "got %p, %p\n", unk1, unk2);
3653 IUnknown_Release(unk1);
3654 IUnknown_Release(unk2);
3655
3656 hr = IXMLDOMNodeList__newEnum(node_list, (IUnknown**)&enum3);
3657 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3658 ok(enum2 != enum3, "got %p, %p\n", enum2, enum3);
3659 IEnumVARIANT_Release(enum3);
3660 IEnumVARIANT_Release(enum2);
3661
3662 /* iteration tests */
3663 hr = IXMLDOMNodeList_get_item(node_list, 0, &node);
3664 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3665 hr = IXMLDOMNode_get_nodeName(node, &str);
3666 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3667 ok(!lstrcmpW(str, L"bs"), "got %s\n", wine_dbgstr_w(str));
3669 IXMLDOMNode_Release(node);
3670
3671 hr = IXMLDOMNodeList_nextNode(node_list, &node);
3672 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3673 hr = IXMLDOMNode_get_nodeName(node, &str);
3674 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3675 ok(!lstrcmpW(str, L"bs"), "got %s\n", wine_dbgstr_w(str));
3677 IXMLDOMNode_Release(node);
3678
3679 V_VT(&v[0]) = VT_EMPTY;
3680 hr = IEnumVARIANT_Next(enum1, 1, &v[0], NULL);
3681 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3682 ok(V_VT(&v[0]) == VT_DISPATCH, "got var type %d\n", V_VT(&v[0]));
3683 hr = IDispatch_QueryInterface(V_DISPATCH(&v[0]), &IID_IXMLDOMNode, (void**)&node);
3684 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3685 hr = IXMLDOMNode_get_nodeName(node, &str);
3686 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3687 ok(!lstrcmpW(str, L"bs"), "got node name %s\n", wine_dbgstr_w(str));
3689 IXMLDOMNode_Release(node);
3690 VariantClear(&v[0]);
3691
3692 V_VT(&v[1]) = VT_EMPTY;
3693 V_VT(&v[0]) = VT_EMPTY;
3694 hr = IEnumVARIANT_Next(enum1, 2, v, &fetched);
3695 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3696 ok(V_VT(&v[0]) == VT_DISPATCH, "got var type %d\n", V_VT(&v[0]));
3697 ok(V_VT(&v[1]) == VT_DISPATCH, "got var type %d\n", V_VT(&v[1]));
3698 ok(fetched == 2, "got %ld, expected 2\n", fetched);
3699 hr = IDispatch_QueryInterface(V_DISPATCH(&v[0]), &IID_IXMLDOMNode, (void**)&node);
3700 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3701 hr = IXMLDOMNode_get_nodeName(node, &str);
3702 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3703 ok(!lstrcmpW(str, L"pr"), "got node name %s\n", wine_dbgstr_w(str));
3705 IXMLDOMNode_Release(node);
3706 hr = IDispatch_QueryInterface(V_DISPATCH(&v[1]), &IID_IXMLDOMNode, (void**)&node);
3707 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3708 hr = IXMLDOMNode_get_nodeName(node, &str);
3709 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3710 ok(!lstrcmpW(str, L"empty"), "got node name %s\n", wine_dbgstr_w(str));
3712 IXMLDOMNode_Release(node);
3713 VariantClear(&v[1]);
3714 VariantClear(&v[0]);
3715
3716 V_VT(&v[1]) = VT_NULL;
3717 V_VT(&v[0]) = VT_EMPTY;
3718 hr = IEnumVARIANT_Next(enum1, 2, v, &fetched);
3719 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
3720 ok(V_VT(&v[0]) == VT_DISPATCH, "got var type %d\n", V_VT(&v[0]));
3721 ok(V_VT(&v[1]) == VT_EMPTY, "got var type %d\n", V_VT(&v[1]));
3722 ok(fetched == 1, "got %ld, expected 1\n", fetched);
3723 hr = IDispatch_QueryInterface(V_DISPATCH(&v[0]), &IID_IXMLDOMNode, (void**)&node);
3724 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3725 hr = IXMLDOMNode_get_nodeName(node, &str);
3726 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3727 ok(!lstrcmpW(str, L"fo"), "got node name %s\n", wine_dbgstr_w(str));
3729 VariantClear(&v[0]);
3730
3731 hr = IXMLDOMNodeList_nextNode(node_list, &node);
3732 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3733 hr = IXMLDOMNode_get_nodeName(node, &str);
3734 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3735 ok(!lstrcmpW(str, L"pr"), "got %s\n", wine_dbgstr_w(str));
3737 IXMLDOMNode_Release(node);
3738
3739 IEnumVARIANT_Release(enum1);
3740
3741 hr = IXMLDOMNodeList_get_item( node_list, 2, &node );
3742 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3743
3744 hr = IXMLDOMNode_get_childNodes( node, &node_list2 );
3745 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3746
3747 hr = IXMLDOMNodeList_get_length( node_list2, &len );
3748 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3749 ok( len == 0, "len %ld\n", len);
3750
3751 hr = IXMLDOMNodeList_get_item( node_list2, 0, &node2);
3752 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
3753
3754 IXMLDOMNodeList_Release( node_list2 );
3755 IXMLDOMNode_Release( node );
3756 IXMLDOMNodeList_Release( node_list );
3757 IXMLDOMElement_Release( element );
3758
3759 /* test for children of <?xml ..?> node */
3760 hr = IXMLDOMDocument_get_firstChild(doc, &node);
3761 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3762
3763 str = NULL;
3764 hr = IXMLDOMNode_get_nodeName(node, &str);
3765 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3766 ok(!lstrcmpW(str, L"xml"), "got %s\n", wine_dbgstr_w(str));
3768
3769 /* it returns empty but valid node list */
3770 node_list = (void*)0xdeadbeef;
3771 hr = IXMLDOMNode_get_childNodes(node, &node_list);
3772 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3773
3774 len = -1;
3775 hr = IXMLDOMNodeList_get_length(node_list, &len);
3776 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3777 ok(len == 0, "got %ld\n", len);
3778
3779 IXMLDOMNodeList_Release( node_list );
3780 IXMLDOMNode_Release(node);
3781
3782 IXMLDOMDocument_Release( doc );
3783 free_bstrs();
3784}
3785
3786static void test_get_firstChild(void)
3787{
3788 IXMLDOMDocument *doc;
3791 HRESULT hr;
3792 BSTR str;
3793
3794 doc = create_document(&IID_IXMLDOMDocument);
3795
3796 hr = IXMLDOMDocument_loadXML( doc, _bstr_(complete4A), &b );
3797 ok(hr == S_OK, "loadXML failed\n");
3798 ok( b == VARIANT_TRUE, "failed to load XML string\n");
3799
3800 hr = IXMLDOMDocument_get_firstChild( doc, &node );
3801 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3802
3803 hr = IXMLDOMNode_get_nodeName( node, &str );
3804 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3805
3806 ok(!lstrcmpW(str, L"xml"), "expected \"xml\" node name, got %s\n", wine_dbgstr_w(str));
3807
3809 IXMLDOMNode_Release( node );
3810 IXMLDOMDocument_Release( doc );
3811
3812 free_bstrs();
3813}
3814
3815static void test_get_lastChild(void)
3816{
3817 IXMLDOMDocument *doc;
3820 HRESULT hr;
3821 BSTR str;
3822
3823 doc = create_document(&IID_IXMLDOMDocument);
3824
3825 hr = IXMLDOMDocument_loadXML( doc, _bstr_(complete4A), &b );
3826 ok(hr == S_OK, "loadXML failed\n");
3827 ok( b == VARIANT_TRUE, "failed to load XML string\n");
3828
3829 hr = IXMLDOMDocument_get_lastChild( doc, &node );
3830 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3831
3832 hr = IXMLDOMNode_get_nodeName( node, &str );
3833 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3834
3835 ok(!lstrcmpW(str, L"lc"), "Unexpected node name.\n");
3837
3838 hr = IXMLDOMNode_get_lastChild( node, &child );
3839 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3840
3841 hr = IXMLDOMNode_get_nodeName( child, &str );
3842 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3843
3844 ok(!lstrcmpW(str, L"fo"), "Unexpected node name.\n");
3846
3847 IXMLDOMNode_Release( child );
3848 IXMLDOMNode_Release( node );
3849 IXMLDOMDocument_Release( doc );
3850
3851 free_bstrs();
3852}
3853
3854static void test_removeChild(void)
3855{
3857 IXMLDOMDocument *doc;
3858 IXMLDOMElement *element, *lc_element;
3859 IXMLDOMNode *fo_node, *ba_node, *removed_node, *temp_node, *lc_node;
3860 IXMLDOMNodeList *root_list, *fo_list;
3861 HRESULT hr;
3862
3863 doc = create_document(&IID_IXMLDOMDocument);
3864
3865 hr = IXMLDOMDocument_loadXML( doc, _bstr_(complete4A), &b );
3866 ok(hr == S_OK, "loadXML failed\n");
3867 ok( b == VARIANT_TRUE, "failed to load XML string\n");
3868
3869 hr = IXMLDOMDocument_get_documentElement( doc, &element );
3870 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3872
3873 hr = IXMLDOMElement_get_childNodes( element, &root_list );
3874 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3875 EXPECT_REF(root_list, 1);
3876
3877 hr = IXMLDOMNodeList_get_item( root_list, 3, &fo_node );
3878 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3879 EXPECT_REF(fo_node, 1);
3880
3881 hr = IXMLDOMNode_get_childNodes( fo_node, &fo_list );
3882 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3883 EXPECT_REF(fo_list, 1);
3884
3885 hr = IXMLDOMNodeList_get_item( fo_list, 0, &ba_node );
3886 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3887 EXPECT_REF(ba_node, 1);
3888
3889 /* invalid parameter: NULL ptr */
3890 removed_node = (void*)0xdeadbeef;
3891 hr = IXMLDOMElement_removeChild( element, NULL, &removed_node );
3892 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
3893 ok( removed_node == (void*)0xdeadbeef, "%p\n", removed_node );
3894
3895 /* ba_node is a descendant of element, but not a direct child. */
3896 removed_node = (void*)0xdeadbeef;
3897 EXPECT_REF(ba_node, 1);
3898 EXPECT_CHILDREN(fo_node);
3899 hr = IXMLDOMElement_removeChild( element, ba_node, &removed_node );
3900 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
3901 ok( removed_node == NULL, "%p\n", removed_node );
3902 EXPECT_REF(ba_node, 1);
3903 EXPECT_CHILDREN(fo_node);
3904
3905 EXPECT_REF(ba_node, 1);
3906 EXPECT_REF(fo_node, 1);
3907 hr = IXMLDOMElement_removeChild( element, fo_node, &removed_node );
3908 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3909 ok( fo_node == removed_node, "node %p node2 %p\n", fo_node, removed_node );
3910 EXPECT_REF(fo_node, 2);
3911 EXPECT_REF(ba_node, 1);
3912
3913 /* try removing already removed child */
3914 temp_node = (void*)0xdeadbeef;
3915 hr = IXMLDOMElement_removeChild( element, fo_node, &temp_node );
3916 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
3917 ok( temp_node == NULL, "%p\n", temp_node );
3918 IXMLDOMNode_Release( fo_node );
3919
3920 /* the removed node has no parent anymore */
3921 hr = IXMLDOMNode_get_parentNode( removed_node, &temp_node );
3922 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
3923 ok( temp_node == NULL, "%p\n", temp_node );
3924
3925 IXMLDOMNode_Release( removed_node );
3926 IXMLDOMNode_Release( ba_node );
3927 IXMLDOMNodeList_Release( fo_list );
3928
3929 hr = IXMLDOMNodeList_get_item( root_list, 0, &lc_node );
3930 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3931
3932 hr = IXMLDOMNode_QueryInterface( lc_node, &IID_IXMLDOMElement, (void**)&lc_element );
3933 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3934
3935 /* MS quirk: passing wrong interface pointer works, too */
3936 hr = IXMLDOMElement_removeChild( element, (IXMLDOMNode*)lc_element, NULL );
3937 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3938 IXMLDOMElement_Release( lc_element );
3939
3940 temp_node = (void*)0xdeadbeef;
3941 hr = IXMLDOMNode_get_parentNode( lc_node, &temp_node );
3942 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
3943 ok( temp_node == NULL, "%p\n", temp_node );
3944
3945 IXMLDOMNode_Release( lc_node );
3946 IXMLDOMNodeList_Release( root_list );
3947 IXMLDOMElement_Release( element );
3948 IXMLDOMDocument_Release( doc );
3949
3950 free_bstrs();
3951}
3952
3953static void test_replaceChild(void)
3954{
3956 IXMLDOMDocument *doc;
3957 IXMLDOMElement *element, *ba_element;
3958 IXMLDOMNode *fo_node, *ba_node, *lc_node, *removed_node, *temp_node;
3959 IXMLDOMNodeList *root_list, *fo_list;
3960 IUnknown * unk1, *unk2;
3961 HRESULT hr;
3962 LONG len;
3963
3964 doc = create_document(&IID_IXMLDOMDocument);
3965
3966 hr = IXMLDOMDocument_loadXML( doc, _bstr_(complete4A), &b );
3967 ok(hr == S_OK, "loadXML failed\n");
3968 ok( b == VARIANT_TRUE, "failed to load XML string\n");
3969
3970 hr = IXMLDOMDocument_get_documentElement( doc, &element );
3971 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3972
3973 hr = IXMLDOMElement_get_childNodes( element, &root_list );
3974 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3975
3976 hr = IXMLDOMNodeList_get_item( root_list, 0, &lc_node );
3977 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3978
3979 hr = IXMLDOMNodeList_get_item( root_list, 3, &fo_node );
3980 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3981
3982 hr = IXMLDOMNode_get_childNodes( fo_node, &fo_list );
3983 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3984
3985 hr = IXMLDOMNodeList_get_item( fo_list, 0, &ba_node );
3986 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
3987
3988 IXMLDOMNodeList_Release( fo_list );
3989
3990 /* invalid parameter: NULL ptr for element to remove */
3991 removed_node = (void*)0xdeadbeef;
3992 hr = IXMLDOMElement_replaceChild( element, ba_node, NULL, &removed_node );
3993 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
3994 ok( removed_node == (void*)0xdeadbeef, "%p\n", removed_node );
3995
3996 /* invalid parameter: NULL for replacement element. (Sic!) */
3997 removed_node = (void*)0xdeadbeef;
3998 hr = IXMLDOMElement_replaceChild( element, NULL, fo_node, &removed_node );
3999 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
4000 ok( removed_node == (void*)0xdeadbeef, "%p\n", removed_node );
4001
4002 /* invalid parameter: OldNode is not a child */
4003 removed_node = (void*)0xdeadbeef;
4004 hr = IXMLDOMElement_replaceChild( element, lc_node, ba_node, &removed_node );
4005 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
4006 ok( removed_node == NULL, "%p\n", removed_node );
4007 IXMLDOMNode_Release( lc_node );
4008
4009 /* invalid parameter: would create loop */
4010 removed_node = (void*)0xdeadbeef;
4011 hr = IXMLDOMNode_replaceChild( fo_node, fo_node, ba_node, &removed_node );
4012 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
4013 ok( removed_node == NULL, "%p\n", removed_node );
4014
4015 hr = IXMLDOMElement_replaceChild( element, ba_node, fo_node, NULL );
4016 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4017
4018 hr = IXMLDOMNodeList_get_item( root_list, 3, &temp_node );
4019 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4020
4021 /* ba_node and temp_node refer to the same node, yet they
4022 are different interface pointers */
4023 ok( ba_node != temp_node, "ba_node %p temp_node %p\n", ba_node, temp_node);
4024 hr = IXMLDOMNode_QueryInterface( temp_node, &IID_IUnknown, (void**)&unk1);
4025 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4026 hr = IXMLDOMNode_QueryInterface( ba_node, &IID_IUnknown, (void**)&unk2);
4027 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4028 todo_wine ok( unk1 == unk2, "unk1 %p unk2 %p\n", unk1, unk2);
4029
4030 IUnknown_Release( unk1 );
4031 IUnknown_Release( unk2 );
4032
4033 /* ba_node should have been removed from below fo_node */
4034 hr = IXMLDOMNode_get_childNodes( fo_node, &fo_list );
4035 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4036
4037 /* MS quirk: replaceChild also accepts elements instead of nodes */
4038 hr = IXMLDOMNode_QueryInterface( ba_node, &IID_IXMLDOMElement, (void**)&ba_element);
4039 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4040 EXPECT_REF(ba_element, 2);
4041
4042 removed_node = NULL;
4043 hr = IXMLDOMElement_replaceChild( element, ba_node, (IXMLDOMNode*)ba_element, &removed_node );
4044 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4045 ok( removed_node != NULL, "got %p\n", removed_node);
4046 EXPECT_REF(ba_element, 3);
4047 IXMLDOMElement_Release( ba_element );
4048
4049 hr = IXMLDOMNodeList_get_length( fo_list, &len);
4050 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4051 ok(len == 0, "len %ld\n", len);
4052
4053 IXMLDOMNodeList_Release( fo_list );
4054
4055 IXMLDOMNode_Release(ba_node);
4056 IXMLDOMNode_Release(fo_node);
4057 IXMLDOMNode_Release(temp_node);
4058 IXMLDOMNodeList_Release( root_list );
4059 IXMLDOMElement_Release( element );
4060 IXMLDOMDocument_Release( doc );
4061
4062 free_bstrs();
4063}
4064
4065static void test_removeNamedItem(void)
4066{
4067 IXMLDOMDocument *doc;
4069 IXMLDOMNode *node, *removed_node, *removed_node2;
4070 IXMLDOMNodeList *root_list;
4073 HRESULT hr;
4074 BSTR str;
4075 LONG len;
4076
4077 doc = create_document(&IID_IXMLDOMDocument);
4078
4079 hr = IXMLDOMDocument_loadXML( doc, _bstr_(complete4A), &b );
4080 ok(hr == S_OK, "loadXML failed\n");
4081 ok( b == VARIANT_TRUE, "failed to load XML string\n");
4082
4083 hr = IXMLDOMDocument_get_documentElement( doc, &element );
4084 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4085
4086 hr = IXMLDOMElement_get_childNodes( element, &root_list );
4087 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4088
4089 hr = IXMLDOMNodeList_get_item( root_list, 1, &node );
4090 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4091
4092 hr = IXMLDOMNode_get_attributes( node, &map );
4093 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4094
4095 hr = IXMLDOMNamedNodeMap_get_length( map, &len );
4096 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4097 ok( len == 3, "length %ld\n", len);
4098
4099 removed_node = (void*)0xdeadbeef;
4100 hr = IXMLDOMNamedNodeMap_removeNamedItem( map, NULL, &removed_node );
4101 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
4102 ok(removed_node == (void*)0xdeadbeef, "got %p\n", removed_node);
4103
4104 removed_node = (void*)0xdeadbeef;
4105 str = SysAllocString(L"vr");
4106 hr = IXMLDOMNamedNodeMap_removeNamedItem( map, str, &removed_node );
4107 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4108
4109 removed_node2 = (void*)0xdeadbeef;
4110 hr = IXMLDOMNamedNodeMap_removeNamedItem( map, str, &removed_node2 );
4111 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
4112 ok(removed_node2 == NULL, "got %p\n", removed_node2 );
4113
4114 hr = IXMLDOMNamedNodeMap_get_length( map, &len );
4115 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4116 ok(len == 2, "length %ld\n", len);
4117
4118 hr = IXMLDOMNamedNodeMap_setNamedItem( map, removed_node, NULL );
4119 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4120 IXMLDOMNode_Release(removed_node);
4121
4122 hr = IXMLDOMNamedNodeMap_get_length( map, &len );
4123 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4124 ok(len == 3, "length %ld\n", len);
4125
4126 hr = IXMLDOMNamedNodeMap_removeNamedItem( map, str, NULL );
4127 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4128
4129 hr = IXMLDOMNamedNodeMap_get_length( map, &len );
4130 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4131 ok(len == 2, "length %ld\n", len);
4132
4133 hr = IXMLDOMNamedNodeMap_removeNamedItem( map, str, NULL );
4134 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
4135
4137
4138 IXMLDOMNamedNodeMap_Release( map );
4139 IXMLDOMNode_Release( node );
4140 IXMLDOMNodeList_Release( root_list );
4141 IXMLDOMElement_Release( element );
4142
4143 /* test with namespaces */
4144 hr = IXMLDOMDocument_loadXML( doc, _bstr_(default_ns_doc), &b );
4145 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4146
4147 hr = IXMLDOMDocument_selectSingleNode( doc, _bstr_("a"), &node );
4148 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4149
4150 hr = IXMLDOMNode_QueryInterface( node, &IID_IXMLDOMElement, (void**)&element );
4151 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4152 IXMLDOMNode_Release( node );
4153
4154 hr = IXMLDOMElement_get_attributes( element, &map );
4155 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4156
4157 removed_node = (void*)0xdeadbeef;
4158 hr = IXMLDOMNamedNodeMap_removeNamedItem( map, _bstr_("foo:bar"), &removed_node );
4159 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
4160 ok ( removed_node == NULL, "got %p\n", removed_node );
4161
4162 removed_node = NULL;
4163 hr = IXMLDOMNamedNodeMap_removeNamedItem( map, _bstr_("d"), &removed_node );
4164 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4165 IXMLDOMNode_Release( removed_node );
4166
4167 removed_node = NULL;
4168 hr = IXMLDOMNamedNodeMap_removeNamedItem( map, _bstr_("ns:b"), &removed_node );
4169 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4170#ifdef __REACTOS__
4171 if (removed_node != NULL)
4172#endif
4173 IXMLDOMNode_Release( removed_node );
4174
4175 removed_node = NULL;
4176 hr = IXMLDOMNamedNodeMap_removeNamedItem( map, _bstr_("xml:lang"), &removed_node );
4177 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4178#ifdef __REACTOS__
4179 if (removed_node != NULL)
4180#endif
4181 IXMLDOMNode_Release( removed_node );
4182
4183 len = -1;
4184 hr = IXMLDOMNamedNodeMap_get_length( map, &len );
4185 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4186 ok( len == 2, "length %ld\n", len );
4187
4188 IXMLDOMNamedNodeMap_Release( map );
4189 IXMLDOMElement_Release( element );
4190 IXMLDOMDocument_Release( doc );
4191 free_bstrs();
4192}
4193
4194#define test_IObjectSafety_set(p, r, r2, s, m, e, e2) _test_IObjectSafety_set(__LINE__,p, r, r2, s, m, e, e2)
4197 DWORD expected2)
4198{
4199 DWORD enabled, supported;
4200 HRESULT hr;
4201
4202 hr = IObjectSafety_SetInterfaceSafetyOptions(safety, NULL, set, mask);
4203 if (result == result2)
4204 ok_(__FILE__,line)(hr == result, "SetInterfaceSafetyOptions: expected %#lx, returned %#lx\n", result, hr );
4205 else
4206 ok_(__FILE__,line)(broken(hr == result) || hr == result2,
4207 "SetInterfaceSafetyOptions: expected %#lx, got %#lx\n", result2, hr );
4208
4209 supported = enabled = 0xCAFECAFE;
4210 hr = IObjectSafety_GetInterfaceSafetyOptions(safety, NULL, &supported, &enabled);
4211 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
4212 if (expected == expected2)
4213 ok_(__FILE__,line)(enabled == expected, "Expected %#lx, got %#lx\n", expected, enabled);
4214 else
4215 ok_(__FILE__,line)(broken(enabled == expected) || enabled == expected2,
4216 "Expected %#lx, got %#lx\n", expected2, enabled);
4217
4218 /* reset the safety options */
4219
4220 hr = IObjectSafety_SetInterfaceSafetyOptions(safety, NULL,
4221 INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_SECURITY_MANAGER,
4222 0);
4223 ok_(__FILE__,line)(hr == S_OK, "Unexpected hr %#lx.\n", hr );
4224
4225 hr = IObjectSafety_GetInterfaceSafetyOptions(safety, NULL, &supported, &enabled);
4226 ok_(__FILE__,line)(hr == S_OK, "Unexpected hr %#lx.\n", hr );
4227 ok_(__FILE__,line)(enabled == 0, "Expected 0, got %#lx\n", enabled);
4228}
4229
4230#define test_IObjectSafety_common(s) _test_IObjectSafety_common(__LINE__,s)
4231static void _test_IObjectSafety_common(unsigned line, IObjectSafety *safety)
4232{
4233 DWORD enabled = 0, supported = 0;
4234 HRESULT hr;
4235
4236 /* get */
4237 hr = IObjectSafety_GetInterfaceSafetyOptions(safety, NULL, NULL, &enabled);
4238 ok_(__FILE__,line)(hr == E_POINTER, "Unexpected hr %#lx.\n", hr );
4239 hr = IObjectSafety_GetInterfaceSafetyOptions(safety, NULL, &supported, NULL);
4240 ok_(__FILE__,line)(hr == E_POINTER, "Unexpected hr %#lx.\n", hr );
4241
4242 hr = IObjectSafety_GetInterfaceSafetyOptions(safety, NULL, &supported, &enabled);
4243 ok_(__FILE__,line)(hr == S_OK, "Unexpected hr %#lx.\n", hr );
4244 ok_(__FILE__,line)(broken(supported == (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA)) ||
4245 supported == (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACE_USES_SECURITY_MANAGER) /* msxml3 SP8+ */,
4246 "Expected (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACE_USES_SECURITY_MANAGER), "
4247 "got %#lx\n", supported);
4248 ok_(__FILE__,line)(enabled == 0, "Expected 0, got %#lx\n", enabled);
4249
4250 /* set -- individual flags */
4251
4253 INTERFACESAFE_FOR_UNTRUSTED_CALLER, INTERFACESAFE_FOR_UNTRUSTED_CALLER,
4254 INTERFACESAFE_FOR_UNTRUSTED_CALLER, INTERFACESAFE_FOR_UNTRUSTED_CALLER);
4255
4257 INTERFACESAFE_FOR_UNTRUSTED_DATA, INTERFACESAFE_FOR_UNTRUSTED_DATA,
4258 INTERFACESAFE_FOR_UNTRUSTED_DATA, INTERFACESAFE_FOR_UNTRUSTED_DATA);
4259
4261 INTERFACE_USES_SECURITY_MANAGER, INTERFACE_USES_SECURITY_MANAGER,
4262 0, INTERFACE_USES_SECURITY_MANAGER /* msxml3 SP8+ */);
4263
4264 /* set INTERFACE_USES_DISPEX */
4265
4266 test_IObjectSafety_set(safety, S_OK, E_FAIL /* msxml3 SP8+ */,
4267 INTERFACE_USES_DISPEX, INTERFACE_USES_DISPEX,
4268 0, 0);
4269
4270 test_IObjectSafety_set(safety, S_OK, E_FAIL /* msxml3 SP8+ */,
4271 INTERFACE_USES_DISPEX, 0,
4272 0, 0);
4273
4274 test_IObjectSafety_set(safety, S_OK, S_OK /* msxml3 SP8+ */,
4275 0, INTERFACE_USES_DISPEX,
4276 0, 0);
4277
4278 /* set option masking */
4279
4281 INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA,
4282 INTERFACESAFE_FOR_UNTRUSTED_CALLER,
4283 INTERFACESAFE_FOR_UNTRUSTED_CALLER,
4284 INTERFACESAFE_FOR_UNTRUSTED_CALLER);
4285
4287 INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA,
4288 INTERFACESAFE_FOR_UNTRUSTED_DATA,
4289 INTERFACESAFE_FOR_UNTRUSTED_DATA,
4290 INTERFACESAFE_FOR_UNTRUSTED_DATA);
4291
4293 INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA,
4294 INTERFACE_USES_SECURITY_MANAGER,
4295 0,
4296 0);
4297
4298 /* set -- inheriting previous settings */
4299
4300 hr = IObjectSafety_SetInterfaceSafetyOptions(safety, NULL,
4301 INTERFACESAFE_FOR_UNTRUSTED_CALLER,
4302 INTERFACESAFE_FOR_UNTRUSTED_CALLER);
4303 ok_(__FILE__,line)(hr == S_OK, "Unexpected hr %#lx.\n", hr );
4304 hr = IObjectSafety_GetInterfaceSafetyOptions(safety, NULL, &supported, &enabled);
4305 ok_(__FILE__,line)(hr == S_OK, "Unexpected hr %#lx.\n", hr );
4306 ok_(__FILE__,line)(enabled == INTERFACESAFE_FOR_UNTRUSTED_CALLER, "Expected INTERFACESAFE_FOR_UNTRUSTED_CALLER got %#lx\n", enabled);
4307 ok_(__FILE__,line)(broken(supported == (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA)) ||
4308 supported == (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACE_USES_SECURITY_MANAGER) /* msxml3 SP8+ */,
4309 "Expected (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACE_USES_SECURITY_MANAGER), "
4310 "got %#lx.\n", supported);
4311
4312 hr = IObjectSafety_SetInterfaceSafetyOptions(safety, NULL,
4313 INTERFACESAFE_FOR_UNTRUSTED_DATA,
4314 INTERFACESAFE_FOR_UNTRUSTED_DATA);
4315 ok_(__FILE__,line)(hr == S_OK, "Unexpected hr %#lx.\n", hr );
4316 hr = IObjectSafety_GetInterfaceSafetyOptions(safety, NULL, &supported, &enabled);
4317 ok_(__FILE__,line)(hr == S_OK, "Unexpected hr %#lx.\n", hr );
4318 ok_(__FILE__,line)(broken(enabled == INTERFACESAFE_FOR_UNTRUSTED_DATA) ||
4319 enabled == (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA),
4320 "Expected (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA) got %#lx\n", enabled);
4321 ok_(__FILE__,line)(broken(supported == (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA)) ||
4322 supported == (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACE_USES_SECURITY_MANAGER) /* msxml3 SP8+ */,
4323 "Expected (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACE_USES_SECURITY_MANAGER), "
4324 "got %#lx\n", supported);
4325}
4326
4327static void test_IXMLDOMDocument2(void)
4328{
4329 IXMLDOMDocument2 *doc2, *dtddoc2;
4330 IXMLDOMDocument *doc;
4332 IDispatchEx *dispex;
4334 VARIANT var;
4335 HRESULT hr;
4336 LONG res;
4337
4338 if (!is_clsid_supported(&CLSID_DOMDocument2, &IID_IXMLDOMDocument2)) return;
4339
4340 doc = create_document(&IID_IXMLDOMDocument);
4341 dtddoc2 = create_document(&IID_IXMLDOMDocument2);
4342
4343 hr = IXMLDOMDocument_QueryInterface( doc, &IID_IXMLDOMDocument2, (void**)&doc2 );
4344 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4345 ok( doc == (IXMLDOMDocument*)doc2, "interfaces differ\n");
4346
4347 hr = IXMLDOMDocument2_get_readyState(doc2, NULL);
4348 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
4349 hr = IXMLDOMDocument2_get_readyState(doc2, &res);
4350 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4351 ok(res == READYSTATE_COMPLETE, "expected READYSTATE_COMPLETE (4), got %ld\n", res);
4352
4353 err = NULL;
4354 hr = IXMLDOMDocument2_validate(doc2, NULL);
4355 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
4356 hr = IXMLDOMDocument2_validate(doc2, &err);
4357 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
4358 ok(err != NULL, "expected a pointer\n");
4359 if (err)
4360 {
4361 res = 0;
4362 hr = IXMLDOMParseError_get_errorCode(err, &res);
4363 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4364 /* XML_E_NOTWF */
4365 ok(res == E_XML_NOTWF, "Unexpected code %#lx.\n", res);
4366 IXMLDOMParseError_Release(err);
4367 }
4368
4369 hr = IXMLDOMDocument2_loadXML( doc2, _bstr_(complete4A), &b );
4370 ok(hr == S_OK, "loadXML failed\n");
4371 ok( b == VARIANT_TRUE, "failed to load XML string\n");
4372
4373 hr = IXMLDOMDocument_get_readyState(doc, &res);
4374 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4375 ok(res == READYSTATE_COMPLETE, "expected READYSTATE_COMPLETE (4), got %ld\n", res);
4376
4377 err = NULL;
4378 hr = IXMLDOMDocument2_validate(doc2, &err);
4379 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
4380 ok(err != NULL, "expected a pointer\n");
4381 if (err)
4382 {
4383 res = 0;
4384 hr = IXMLDOMParseError_get_errorCode(err, &res);
4385 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4386 /* XML_E_NODTD */
4387 ok(res == E_XML_NODTD, "Unexpected code %#lx.\n", res);
4388 IXMLDOMParseError_Release(err);
4389 }
4390
4391 hr = IXMLDOMDocument_QueryInterface( doc, &IID_IDispatchEx, (void**)&dispex );
4392 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4393 if(hr == S_OK)
4394 IDispatchEx_Release(dispex);
4395
4396 /* we will check if the variant got cleared */
4397 IXMLDOMDocument2_AddRef(doc2);
4398 EXPECT_REF(doc2, 3); /* doc, doc2, AddRef*/
4399
4400 V_VT(&var) = VT_UNKNOWN;
4401 V_UNKNOWN(&var) = (IUnknown *)doc2;
4402
4403 /* invalid calls */
4404 hr = IXMLDOMDocument2_getProperty(doc2, _bstr_("askldhfaklsdf"), &var);
4405 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
4406 expect_eq(V_VT(&var), VT_UNKNOWN, int, "%x");
4407 hr = IXMLDOMDocument2_getProperty(doc2, _bstr_("SelectionLanguage"), NULL);
4408 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
4409
4410 /* valid call */
4411 hr = IXMLDOMDocument2_getProperty(doc2, _bstr_("SelectionLanguage"), &var);
4412 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4413 expect_eq(V_VT(&var), VT_BSTR, int, "%x");
4414 expect_bstr_eq_and_free(V_BSTR(&var), "XSLPattern");
4415 V_VT(&var) = VT_R4;
4416
4417 /* the variant didn't get cleared*/
4418 expect_eq(IXMLDOMDocument2_Release(doc2), 2, int, "%d");
4419
4420 /* setProperty tests */
4421 hr = IXMLDOMDocument2_setProperty(doc2, _bstr_("askldhfaklsdf"), var);
4422 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
4423 hr = IXMLDOMDocument2_setProperty(doc2, _bstr_("SelectionLanguage"), var);
4424 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
4425 hr = IXMLDOMDocument2_setProperty(doc2, _bstr_("SelectionLanguage"), _variantbstr_("alskjdh faklsjd hfk"));
4426 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
4427 hr = IXMLDOMDocument2_setProperty(doc2, _bstr_("SelectionLanguage"), _variantbstr_("XSLPattern"));
4428 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4429 hr = IXMLDOMDocument2_setProperty(doc2, _bstr_("SelectionLanguage"), _variantbstr_("XPath"));
4430 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4431 hr = IXMLDOMDocument2_setProperty(doc2, _bstr_("SelectionLanguage"), _variantbstr_("XSLPattern"));
4432 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4433
4434 V_VT(&var) = VT_BSTR;
4435 V_BSTR(&var) = SysAllocString(L"");
4436 hr = IXMLDOMDocument2_setProperty(doc2, _bstr_("SelectionNamespaces"), var);
4437 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4438 VariantClear(&var);
4439
4440 V_VT(&var) = VT_I2;
4441 V_I2(&var) = 0;
4442 hr = IXMLDOMDocument2_setProperty(doc2, _bstr_("SelectionNamespaces"), var);
4443 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
4444
4445 /* contrary to what MSDN claims you can switch back from XPath to XSLPattern */
4446 hr = IXMLDOMDocument2_getProperty(doc2, _bstr_("SelectionLanguage"), &var);
4447 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4448 expect_eq(V_VT(&var), VT_BSTR, int, "%x");
4449 expect_bstr_eq_and_free(V_BSTR(&var), "XSLPattern");
4450
4451 IXMLDOMDocument2_Release( doc2 );
4452 IXMLDOMDocument_Release( doc );
4453
4454 /* DTD validation */
4455 hr = IXMLDOMDocument2_put_validateOnParse(dtddoc2, VARIANT_FALSE);
4456 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4457 hr = IXMLDOMDocument2_loadXML(dtddoc2, _bstr_(szEmailXML), &b);
4458 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4459 ok( b == VARIANT_TRUE, "failed to load XML string\n");
4460 err = NULL;
4461 hr = IXMLDOMDocument2_validate(dtddoc2, &err);
4462 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4463 ok(err != NULL, "expected pointer\n");
4464 if (err)
4465 {
4466 res = 0;
4467 hr = IXMLDOMParseError_get_errorCode(err, &res);
4468 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
4469 ok(res == 0, "Unexpected code %#lx.\n", res);
4470 IXMLDOMParseError_Release(err);
4471 }
4472
4473 hr = IXMLDOMDocument2_loadXML(dtddoc2, _bstr_(szEmailXML_0D), &b);
4474 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4475 ok( b == VARIANT_TRUE, "failed to load XML string\n");
4476 err = NULL;
4477 hr = IXMLDOMDocument2_validate(dtddoc2, &err);
4478 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
4479 ok(err != NULL, "expected pointer\n");
4480 if (err)
4481 {
4482 res = 0;
4483 hr = IXMLDOMParseError_get_errorCode(err, &res);
4484 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4485 /* XML_ELEMENT_UNDECLARED */
4486 todo_wine ok(res == 0xC00CE00D, "Unexpected code %#lx.\n", res);
4487 IXMLDOMParseError_Release(err);
4488 }
4489
4490 hr = IXMLDOMDocument2_loadXML(dtddoc2, _bstr_(szEmailXML_0E), &b);
4491 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4492 ok( b == VARIANT_TRUE, "failed to load XML string\n");
4493 err = NULL;
4494 hr = IXMLDOMDocument2_validate(dtddoc2, &err);
4495 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
4496 ok(err != NULL, "expected pointer\n");
4497 if (err)
4498 {
4499 res = 0;
4500 hr = IXMLDOMParseError_get_errorCode(err, &res);
4501 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4502 /* XML_ELEMENT_ID_NOT_FOUND */
4503 todo_wine ok(res == 0xC00CE00E, "Unexpected code %#lx.\n", res);
4504 IXMLDOMParseError_Release(err);
4505 }
4506
4507 hr = IXMLDOMDocument2_loadXML(dtddoc2, _bstr_(szEmailXML_11), &b);
4508 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4509 ok( b == VARIANT_TRUE, "failed to load XML string\n");
4510 err = NULL;
4511 hr = IXMLDOMDocument2_validate(dtddoc2, &err);
4512 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
4513 ok(err != NULL, "expected pointer\n");
4514 if (err)
4515 {
4516 res = 0;
4517 hr = IXMLDOMParseError_get_errorCode(err, &res);
4518 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4519 /* XML_EMPTY_NOT_ALLOWED */
4520 todo_wine ok(res == 0xC00CE011, "Unexpected code %#lx.\n", res);
4521 IXMLDOMParseError_Release(err);
4522 }
4523
4524 hr = IXMLDOMDocument2_loadXML(dtddoc2, _bstr_(szEmailXML_13), &b);
4525 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4526 ok( b == VARIANT_TRUE, "failed to load XML string\n");
4527 err = NULL;
4528 hr = IXMLDOMDocument2_validate(dtddoc2, &err);
4529 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
4530 ok(err != NULL, "expected pointer\n");
4531 if (err)
4532 {
4533 res = 0;
4534 hr = IXMLDOMParseError_get_errorCode(err, &res);
4535 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4536 /* XML_ROOT_NAME_MISMATCH */
4537 todo_wine ok(res == 0xC00CE013, "Unexpected code %#lx.\n", res);
4538 IXMLDOMParseError_Release(err);
4539 }
4540
4541 hr = IXMLDOMDocument2_loadXML(dtddoc2, _bstr_(szEmailXML_14), &b);
4542 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4543 ok( b == VARIANT_TRUE, "failed to load XML string\n");
4544 err = NULL;
4545 hr = IXMLDOMDocument2_validate(dtddoc2, &err);
4546 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
4547 ok(err != NULL, "expected pointer\n");
4548 if (err)
4549 {
4550 res = 0;
4551 hr = IXMLDOMParseError_get_errorCode(err, &res);
4552 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4553 /* XML_INVALID_CONTENT */
4554 todo_wine ok(res == 0xC00CE014, "Unexpected code %#lx.\n", res);
4555 IXMLDOMParseError_Release(err);
4556 }
4557
4558 hr = IXMLDOMDocument2_loadXML(dtddoc2, _bstr_(szEmailXML_15), &b);
4559 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4560 ok( b == VARIANT_TRUE, "failed to load XML string\n");
4561 err = NULL;
4562 hr = IXMLDOMDocument2_validate(dtddoc2, &err);
4563 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
4564 ok(err != NULL, "expected pointer\n");
4565 if (err)
4566 {
4567 res = 0;
4568 hr = IXMLDOMParseError_get_errorCode(err, &res);
4569 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4570 /* XML_ATTRIBUTE_NOT_DEFINED */
4571 todo_wine ok(res == 0xC00CE015, "Unexpected code %#lx.\n", res);
4572 IXMLDOMParseError_Release(err);
4573 }
4574
4575 hr = IXMLDOMDocument2_loadXML(dtddoc2, _bstr_(szEmailXML_16), &b);
4576 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4577 ok( b == VARIANT_TRUE, "failed to load XML string\n");
4578 err = NULL;
4579 hr = IXMLDOMDocument2_validate(dtddoc2, &err);
4580 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
4581 ok(err != NULL, "expected pointer\n");
4582 if (err)
4583 {
4584 res = 0;
4585 hr = IXMLDOMParseError_get_errorCode(err, &res);
4586 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4587 /* XML_ATTRIBUTE_FIXED */
4588 todo_wine ok(res == 0xC00CE016, "Unexpected code %#lx.\n", res);
4589 IXMLDOMParseError_Release(err);
4590 }
4591
4592 hr = IXMLDOMDocument2_loadXML(dtddoc2, _bstr_(szEmailXML_17), &b);
4593 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4594 ok( b == VARIANT_TRUE, "failed to load XML string\n");
4595 err = NULL;
4596 hr = IXMLDOMDocument2_validate(dtddoc2, &err);
4597 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
4598 ok(err != NULL, "expected pointer\n");
4599 if (err)
4600 {
4601 res = 0;
4602 hr = IXMLDOMParseError_get_errorCode(err, &res);
4603 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4604 /* XML_ATTRIBUTE_VALUE */
4605 todo_wine ok(res == 0xC00CE017, "Unexpected code %#lx.\n", res);
4606 IXMLDOMParseError_Release(err);
4607 }
4608
4609 hr = IXMLDOMDocument2_loadXML(dtddoc2, _bstr_(szEmailXML_18), &b);
4610 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4611 ok( b == VARIANT_TRUE, "failed to load XML string\n");
4612 err = NULL;
4613 hr = IXMLDOMDocument2_validate(dtddoc2, &err);
4614 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
4615 ok(err != NULL, "expected pointer\n");
4616 if (err)
4617 {
4618 res = 0;
4619 hr = IXMLDOMParseError_get_errorCode(err, &res);
4620 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4621 /* XML_ILLEGAL_TEXT */
4622 todo_wine ok(res == 0xC00CE018, "Unexpected code %#lx.\n", res);
4623 IXMLDOMParseError_Release(err);
4624 }
4625
4626 hr = IXMLDOMDocument2_loadXML(dtddoc2, _bstr_(szEmailXML_20), &b);
4627 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4628 ok( b == VARIANT_TRUE, "failed to load XML string\n");
4629 err = NULL;
4630 hr = IXMLDOMDocument2_validate(dtddoc2, &err);
4631 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
4632 ok(err != NULL, "expected pointer\n");
4633 if (err)
4634 {
4635 res = 0;
4636 hr = IXMLDOMParseError_get_errorCode(err, &res);
4637 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4638 /* XML_REQUIRED_ATTRIBUTE_MISSING */
4639 todo_wine ok(res == 0xC00CE020, "Unexpected code %#lx.\n", res);
4640 IXMLDOMParseError_Release(err);
4641 }
4642
4643 IXMLDOMDocument2_Release( dtddoc2 );
4644 free_bstrs();
4645}
4646
4647#define helper_ole_check_ver(expr) { \
4648 HRESULT hr = expr; \
4649 ok_(__FILE__, line)(hr == S_OK, "-> %i (%s): " #expr " returned %#lx.\n", __LINE__, ver, hr); \
4650}
4651
4652#define helper_expect_list_and_release(list, expstr) { \
4653 char *str = list_to_string(list); \
4654 ok_(__FILE__, line)(strcmp(str, expstr)==0, "=> %i (%s): Invalid node list: %s, expected %s\n", __LINE__, ver, str, expstr); \
4655 if (list) IXMLDOMNodeList_Release(list); \
4656}
4657
4658#define helper_expect_bstr_and_release(bstr, str) { \
4659 ok_(__FILE__, line)(lstrcmpW(bstr, _bstr_(str)) == 0, \
4660 "=> %i (%s): got %s\n", __LINE__, ver, wine_dbgstr_w(bstr)); \
4661 SysFreeString(bstr); \
4662}
4663
4664#define check_ws_ignored(ver, doc, str) _check_ws_ignored(__LINE__, ver, doc, str)
4665static inline void _check_ws_ignored(int line, const char *ver, IXMLDOMDocument2* doc, char const* str)
4666{
4667 IXMLDOMNode *node1, *node2;
4669 BSTR bstr;
4670
4671 helper_ole_check_ver(IXMLDOMDocument2_selectNodes(doc, _bstr_("//*[local-name()='html']"), &list));
4672 helper_ole_check_ver(IXMLDOMNodeList_get_item(list, 0, &node1));
4673 helper_ole_check_ver(IXMLDOMNodeList_get_item(list, 1, &node2));
4674 helper_ole_check_ver(IXMLDOMNodeList_reset(list));
4675 helper_expect_list_and_release(list, "E1.E5.E1.E2.D1 E2.E5.E1.E2.D1");
4676
4677 helper_ole_check_ver(IXMLDOMNode_get_childNodes(node1, &list));
4679 "[4]1.E1.E5.E1.E2.D1 T2.E1.E5.E1.E2.D1 E3.E1.E5.E1.E2.D1 "
4680 "E4.E1.E5.E1.E2.D1 E5.E1.E5.E1.E2.D1 E6.E1.E5.E1.E2.D1");
4681 helper_ole_check_ver(IXMLDOMNode_get_text(node1, &bstr));
4682 if (str)
4683 {
4685 }
4686 else
4687 {
4688 helper_expect_bstr_and_release(bstr, " This is a description.");
4689 }
4690 IXMLDOMNode_Release(node1);
4691
4692 helper_ole_check_ver(IXMLDOMNode_get_childNodes(node2, &list));
4694 "T1.E2.E5.E1.E2.D1 E2.E2.E5.E1.E2.D1 T3.E2.E5.E1.E2.D1 "
4695 "E4.E2.E5.E1.E2.D1 T5.E2.E5.E1.E2.D1 E6.E2.E5.E1.E2.D1 T7.E2.E5.E1.E2.D1");
4696 helper_ole_check_ver(IXMLDOMNode_get_text(node2, &bstr));
4698 "\n This is a description with preserved whitespace. \n ");
4699 IXMLDOMNode_Release(node2);
4700}
4701
4702#define check_ws_preserved(ver, doc, str) _check_ws_preserved(__LINE__, ver, doc, str)
4703static inline void _check_ws_preserved(int line, const char *ver, IXMLDOMDocument2* doc, char const* str)
4704{
4705 IXMLDOMNode *node1, *node2;
4707 BSTR bstr;
4708
4709 helper_ole_check_ver(IXMLDOMDocument2_selectNodes(doc, _bstr_("//*[local-name()='html']"), &list));
4710 helper_ole_check_ver(IXMLDOMNodeList_get_item(list, 0, &node1));
4711 helper_ole_check_ver(IXMLDOMNodeList_get_item(list, 1, &node2));
4712 helper_ole_check_ver(IXMLDOMNodeList_reset(list));
4713 helper_expect_list_and_release(list, "E2.E10.E2.E2.D1 E4.E10.E2.E2.D1");
4714
4715 helper_ole_check_ver(IXMLDOMNode_get_childNodes(node1, &list));
4717 "T1.E2.E10.E2.E2.D1 [4]2.E2.E10.E2.E2.D1 T3.E2.E10.E2.E2.D1 "
4718 "E4.E2.E10.E2.E2.D1 T5.E2.E10.E2.E2.D1 E6.E2.E10.E2.E2.D1 "
4719 "E7.E2.E10.E2.E2.D1 E8.E2.E10.E2.E2.D1 T9.E2.E10.E2.E2.D1");
4720 helper_ole_check_ver(IXMLDOMNode_get_text(node1, &bstr));
4721 if (str)
4722 {
4724 }
4725 else
4726 {
4727 helper_expect_bstr_and_release(bstr, "\n This is a description. \n ");
4728 }
4729 IXMLDOMNode_Release(node1);
4730
4731 helper_ole_check_ver(IXMLDOMNode_get_childNodes(node2, &list));
4733 "T1.E4.E10.E2.E2.D1 E2.E4.E10.E2.E2.D1 T3.E4.E10.E2.E2.D1 "
4734 "E4.E4.E10.E2.E2.D1 T5.E4.E10.E2.E2.D1 E6.E4.E10.E2.E2.D1 T7.E4.E10.E2.E2.D1");
4735 helper_ole_check_ver(IXMLDOMNode_get_text(node2, &bstr));
4737 "\n This is a description with preserved whitespace. \n ");
4738 IXMLDOMNode_Release(node2);
4739}
4740
4741static void test_preserve_charref(IXMLDOMDocument2 *doc, VARIANT_BOOL preserve)
4742{
4746 const WCHAR *text;
4748 HRESULT hr;
4749 BSTR s;
4750
4751 hr = IXMLDOMDocument2_put_preserveWhiteSpace(doc, preserve);
4752 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4753
4754 hr = IXMLDOMDocument2_loadXML(doc, _bstr_(charrefsxml), &b);
4755 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4756
4757 hr = IXMLDOMDocument2_get_documentElement(doc, &root);
4758 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4759
4760 hr = IXMLDOMElement_get_childNodes(root, &list);
4761 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4762 IXMLDOMElement_Release(root);
4763
4764 text = preserve == VARIANT_TRUE ? L" Text A end " : L"Text A end";
4765 hr = IXMLDOMNodeList_get_item(list, 0, &node);
4766 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4767 hr = IXMLDOMNode_get_text(node, &s);
4768 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4769 ok(!lstrcmpW(s, text), "0x%x, got %s\n", preserve, wine_dbgstr_w(s));
4771 IXMLDOMNode_Release(node);
4772
4773 text = preserve == VARIANT_TRUE ? L"AB C " : L"AB C";
4774 hr = IXMLDOMNodeList_get_item(list, 1, &node);
4775 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4776 hr = IXMLDOMNode_get_text(node, &s);
4777 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4778 ok(!lstrcmpW(s, text), "0x%x, got %s\n", preserve, wine_dbgstr_w(s));
4780 IXMLDOMNode_Release(node);
4781
4782 IXMLDOMNodeList_Release(list);
4783}
4784
4786 const CLSID *clsid;
4787 const char *name;
4788};
4789
4790static const struct whitespace_t whitespace_test_data[] = {
4791 { &CLSID_DOMDocument, "CLSID_DOMDocument" },
4792 { &CLSID_DOMDocument2, "CLSID_DOMDocument2" },
4793 { &CLSID_DOMDocument26, "CLSID_DOMDocument26" },
4794 { &CLSID_DOMDocument30, "CLSID_DOMDocument30" },
4795 { &CLSID_DOMDocument40, "CLSID_DOMDocument40" },
4796 { &CLSID_DOMDocument60, "CLSID_DOMDocument60" },
4797 { 0 }
4798};
4799
4800static void test_whitespace(void)
4801{
4802 const struct whitespace_t *class_ptr = whitespace_test_data;
4803
4804 while (class_ptr->clsid)
4805 {
4806 IXMLDOMDocument2 *doc1, *doc2, *doc3, *doc4;
4810 HRESULT hr;
4811 LONG len;
4812
4813 if (!is_clsid_supported(class_ptr->clsid, &IID_IXMLDOMDocument2))
4814 {
4815 class_ptr++;
4816 continue;
4817 }
4818
4819 hr = CoCreateInstance(class_ptr->clsid, NULL, CLSCTX_INPROC_SERVER,
4820 &IID_IXMLDOMDocument2, (void**)&doc1);
4821 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4822
4823 hr = CoCreateInstance(class_ptr->clsid, NULL, CLSCTX_INPROC_SERVER,
4824 &IID_IXMLDOMDocument2, (void**)&doc2);
4825 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4826
4827 hr = IXMLDOMDocument2_put_preserveWhiteSpace(doc2, VARIANT_TRUE);
4828 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4829 hr = IXMLDOMDocument2_get_preserveWhiteSpace(doc1, &b);
4830 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4831 ok(b == VARIANT_FALSE, "expected false\n");
4832 hr = IXMLDOMDocument2_get_preserveWhiteSpace(doc2, &b);
4833 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4834 ok(b == VARIANT_TRUE, "expected true\n");
4835
4836 hr = IXMLDOMDocument2_loadXML(doc1, _bstr_(szExampleXML), &b);
4837 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4838 ok(b == VARIANT_TRUE, "failed to load XML string\n");
4839 hr = IXMLDOMDocument2_loadXML(doc2, _bstr_(szExampleXML), &b);
4840 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4841 ok(b == VARIANT_TRUE, "failed to load XML string\n");
4842
4843 /* switch to XPath */
4844 hr = IXMLDOMDocument2_setProperty(doc1, _bstr_("SelectionLanguage"), _variantbstr_("XPath"));
4845 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4846 hr = IXMLDOMDocument2_setProperty(doc2, _bstr_("SelectionLanguage"), _variantbstr_("XPath"));
4847 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4848
4849 check_ws_ignored(class_ptr->name, doc1, NULL);
4850 check_ws_preserved(class_ptr->name, doc2, NULL);
4851
4852 /* new instances copy the property */
4853 hr = IXMLDOMDocument2_QueryInterface(doc1, &IID_IXMLDOMDocument2, (void**) &doc3);
4854 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4855 hr = IXMLDOMDocument2_QueryInterface(doc2, &IID_IXMLDOMDocument2, (void**) &doc4);
4856 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4857
4858 hr = IXMLDOMDocument2_get_preserveWhiteSpace(doc3, &b);
4859 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4860 ok(b == VARIANT_FALSE, "expected false\n");
4861 hr = IXMLDOMDocument2_get_preserveWhiteSpace(doc4, &b);
4862 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4863 ok(b == VARIANT_TRUE, "expected true\n");
4864
4865 check_ws_ignored(class_ptr->name, doc3, NULL);
4866 check_ws_preserved(class_ptr->name, doc4, NULL);
4867
4868 /* setting after loading xml affects trimming of leading/trailing ws only */
4869 hr = IXMLDOMDocument2_put_preserveWhiteSpace(doc1, VARIANT_TRUE);
4870 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4871 hr = IXMLDOMDocument2_put_preserveWhiteSpace(doc2, VARIANT_FALSE);
4872 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4873
4874 /* the trailing "\n " isn't there, because it was ws-only node */
4875 check_ws_ignored(class_ptr->name, doc1, " This is a description. ");
4876 check_ws_preserved(class_ptr->name, doc2, " This is a description.");
4877
4878 /* it takes effect on reload */
4879 hr = IXMLDOMDocument2_get_preserveWhiteSpace(doc1, &b);
4880 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4881 ok(b == VARIANT_TRUE, "expected true\n");
4882 hr = IXMLDOMDocument2_get_preserveWhiteSpace(doc2, &b);
4883 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4884 ok(b == VARIANT_FALSE, "expected false\n");
4885
4886 hr = IXMLDOMDocument2_loadXML(doc1, _bstr_(szExampleXML), &b);
4887 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4888 ok(b == VARIANT_TRUE, "failed to load XML string\n");
4889 hr = IXMLDOMDocument2_loadXML(doc2, _bstr_(szExampleXML), &b);
4890 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4891 ok(b == VARIANT_TRUE, "failed to load XML string\n");
4892
4893 check_ws_preserved(class_ptr->name, doc1, NULL);
4894 check_ws_ignored(class_ptr->name, doc2, NULL);
4895
4896 /* other instances follow suit */
4897 hr = IXMLDOMDocument2_get_preserveWhiteSpace(doc3, &b);
4898 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4899 ok(b == VARIANT_TRUE, "expected true\n");
4900 hr = IXMLDOMDocument2_get_preserveWhiteSpace(doc4, &b);
4901 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4902 ok(b == VARIANT_FALSE, "expected false\n");
4903
4904 check_ws_preserved(class_ptr->name, doc3, NULL);
4905 check_ws_ignored(class_ptr->name, doc4, NULL);
4906
4907 IXMLDOMDocument2_Release(doc2);
4908 IXMLDOMDocument2_Release(doc3);
4909 IXMLDOMDocument2_Release(doc4);
4910
4911 /* text with char references */
4912 test_preserve_charref(doc1, VARIANT_TRUE);
4913 test_preserve_charref(doc1, VARIANT_FALSE);
4914
4915 /* formatting whitespaces */
4916 hr = IXMLDOMDocument2_put_preserveWhiteSpace(doc1, VARIANT_FALSE);
4917 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4918
4919 hr = IXMLDOMDocument2_loadXML(doc1, _bstr_(complete7), &b);
4920 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4921 ok(b == VARIANT_TRUE, "for %x\n", b);
4922
4923 hr = IXMLDOMDocument2_get_documentElement(doc1, &root);
4924 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4925 hr = IXMLDOMElement_get_childNodes(root, &list);
4926 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4927 len = 0;
4928 hr = IXMLDOMNodeList_get_length(list, &len);
4929 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4930 ok(len == 3, "got %ld\n", len);
4931 IXMLDOMNodeList_Release(list);
4932 IXMLDOMElement_Release(root);
4933
4934 IXMLDOMDocument2_Release(doc1);
4935
4936 free_bstrs();
4937
4938 class_ptr++;
4939 }
4940}
4941
4942typedef struct {
4943 const GUID *clsid;
4944 const char *name;
4945 const char *ns;
4948
4949/* supposed to be tested with szExampleXML */
4951 { &CLSID_DOMDocument, "CLSID_DOMDocument", "\txmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'", S_OK },
4952 { &CLSID_DOMDocument, "CLSID_DOMDocument", "\n\rxmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'", S_OK },
4953 { &CLSID_DOMDocument, "CLSID_DOMDocument", " xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'", S_OK },
4954 { &CLSID_DOMDocument, "CLSID_DOMDocument", "xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29' ", S_OK },
4955
4956 { &CLSID_DOMDocument2, "CLSID_DOMDocument2", "\txmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'", S_OK },
4957 { &CLSID_DOMDocument2, "CLSID_DOMDocument2", "\n\rxmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'", S_OK },
4958 { &CLSID_DOMDocument2, "CLSID_DOMDocument2", " xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'", S_OK },
4959 { &CLSID_DOMDocument2, "CLSID_DOMDocument2", "xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29' ", S_OK },
4960
4961 { &CLSID_DOMDocument30, "CLSID_DOMDocument30", "\txmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'", S_OK },
4962 { &CLSID_DOMDocument30, "CLSID_DOMDocument30", "\n\rxmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'", S_OK },
4963 { &CLSID_DOMDocument30, "CLSID_DOMDocument30", " xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'", S_OK },
4964 { &CLSID_DOMDocument30, "CLSID_DOMDocument30", "xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29' ", S_OK },
4965
4966 { &CLSID_DOMDocument40, "CLSID_DOMDocument40", "\txmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'", S_OK },
4967 { &CLSID_DOMDocument40, "CLSID_DOMDocument40", "\n\rxmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'", S_OK },
4968 { &CLSID_DOMDocument40, "CLSID_DOMDocument40", " xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'", S_OK },
4969 { &CLSID_DOMDocument40, "CLSID_DOMDocument40", "xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29' ", S_OK },
4970
4971 { &CLSID_DOMDocument60, "CLSID_DOMDocument60", "\txmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'", S_OK },
4972 { &CLSID_DOMDocument60, "CLSID_DOMDocument60", "\n\rxmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'", S_OK },
4973 { &CLSID_DOMDocument60, "CLSID_DOMDocument60", " xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'", S_OK },
4974 { &CLSID_DOMDocument60, "CLSID_DOMDocument60", "xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29' ", S_OK },
4975
4976 { NULL }
4977};
4978
4979typedef struct {
4980 const char *query;
4981 const char *list;
4982} xpath_test_t;
4983
4984static const xpath_test_t xpath_test[] = {
4985 { "*/a", "E1.E1.E2.D1 E1.E2.E2.D1 E1.E4.E2.D1" },
4986 { "*/b", "E2.E1.E2.D1 E2.E2.E2.D1 E2.E4.E2.D1" },
4987 { "*/c", "E3.E1.E2.D1 E3.E2.E2.D1" },
4988 { "*/d", "E4.E1.E2.D1 E4.E2.E2.D1 E4.E4.E2.D1" },
4989 { "//a", "E1.E1.E2.D1 E1.E2.E2.D1 E1.E4.E2.D1" },
4990 { "//b", "E2.E1.E2.D1 E2.E2.E2.D1 E2.E4.E2.D1" },
4991 { "//c", "E3.E1.E2.D1 E3.E2.E2.D1" },
4992 { "//d", "E4.E1.E2.D1 E4.E2.E2.D1 E4.E4.E2.D1" },
4993 { "//c[@type]", "E3.E2.E2.D1" },
4994 { "//c[@type]/ancestor::node()[1]", "E2.E2.D1" },
4995 { "//c[@type]/ancestor-or-self::node()[1]", "E3.E2.E2.D1" },
4996 { "//c[@type]/attribute::node()[1]", "A'type'.E3.E2.E2.D1" },
4997 { "//c[@type]/child::node()[1]", "T1.E3.E2.E2.D1" },
4998 { "//c[@type]/descendant::node()[1]", "T1.E3.E2.E2.D1" },
4999 { "//c[@type]/descendant-or-self::node()[1]", "E3.E2.E2.D1" },
5000 { "//c[@type]/following::node()[1]", "E4.E2.E2.D1" },
5001 { "//c[@type]/following-sibling::node()[1]", "E4.E2.E2.D1" },
5002 { "//c[@type]/parent::node()[1]", "E2.E2.D1" },
5003 { "//c[@type]/preceding::node()[1]", "T1.E2.E2.E2.D1" },
5004 { "//c[@type]/self::node()[1]", "E3.E2.E2.D1" },
5005 { "child::*", "E1.E2.D1 E2.E2.D1 E3.E2.D1 E4.E2.D1" },
5006 { "child::node()", "E1.E2.D1 E2.E2.D1 E3.E2.D1 E4.E2.D1" },
5007 { "child::text()", "" },
5008 { "child::*/..", "E2.D1" },
5009 { "child::*//@*/..", "E2.E5.E1.E2.D1 E2.E2.D1 E3.E2.E2.D1" },
5010 { "self::node()", "E2.D1" },
5011 { "ancestor::node()", "D1" },
5012 { "elem[c][last()]/a", "E1.E2.E2.D1"},
5013 { "ancestor-or-self::node()[1]", "E2.D1" },
5014 { "((//a)[1])[last()]", "E1.E1.E2.D1" },
5015 { "//elem[@*]", "E2.E2.D1" },
5016 { NULL }
5017};
5018
5019static void test_XPath(void)
5020{
5022 const xpath_test_t *xptest = xpath_test;
5023 VARIANT var;
5025 IXMLDOMDocument2 *doc;
5026 IXMLDOMDocument *doc2;
5027 IXMLDOMNode *rootNode;
5028 IXMLDOMNode *elem1Node;
5034 HRESULT hr;
5035 LONG len;
5036 BSTR str;
5037
5038 if (!is_clsid_supported(&CLSID_DOMDocument2, &IID_IXMLDOMDocument2)) return;
5039 doc = create_document(&IID_IXMLDOMDocument2);
5040
5041 hr = IXMLDOMDocument2_loadXML(doc, _bstr_(szExampleXML), &b);
5042 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5043 ok(b == VARIANT_TRUE, "failed to load XML string\n");
5044
5045 /* switch to XPath */
5046 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionLanguage"), _variantbstr_("XPath"));
5047 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5048
5049 /* some simple queries*/
5050 EXPECT_REF(doc, 1);
5051 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("root"), &list);
5052 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5053 EXPECT_REF(doc, 1);
5055
5056 EXPECT_REF(list, 1);
5057 hr = IXMLDOMNodeList_get_item(list, 0, &rootNode);
5058 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5059 EXPECT_REF(list, 1);
5060 EXPECT_REF(rootNode, 1);
5061
5062 hr = IXMLDOMNodeList_reset(list);
5063 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5064 expect_list_and_release(list, "E2.D1");
5065
5066 /* perform xpath tests */
5067 for ( ; xptest->query ; xptest++ )
5068 {
5069 char *str;
5070
5071 hr = IXMLDOMNode_selectNodes(rootNode, _bstr_(xptest->query), &list);
5072 ok(hr == S_OK, "query evaluation failed for query=%s\n", xptest->query);
5073
5074 if (hr != S_OK)
5075 continue;
5076
5078
5079 ok(!strcmp(str, xptest->list), "query=%s, invalid node list: \"%s\", expected \"%s\"\n",
5080 xptest->query, str, xptest->list);
5081
5082 if (list)
5083 IXMLDOMNodeList_Release(list);
5084 }
5085
5086if (0)
5087{
5088 /* namespace:: axis test is disabled until namespace definitions
5089 are supported as attribute nodes, currently it's another node type */
5090 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("/root/namespace::*"), &list);
5091 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5092 len = -1;
5093 hr = IXMLDOMNodeList_get_length(list, &len);
5094 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5095 ok(len == 2, "got %ld\n", len);
5096
5097 hr = IXMLDOMNodeList_nextNode(list, &node);
5098 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5100 hr = IXMLDOMNode_get_nodeType(node, &type);
5101 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5102 ok(type == NODE_ATTRIBUTE, "got %d\n", type);
5103 IXMLDOMNode_Release(node);
5104
5105 IXMLDOMNodeList_Release(list);
5106}
5107
5108 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("root//c"), &list);
5109 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5110 expect_list_and_release(list, "E3.E1.E2.D1 E3.E2.E2.D1");
5111
5112 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("//c[@type]"), &list);
5113 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5114 expect_list_and_release(list, "E3.E2.E2.D1");
5115
5116 hr = IXMLDOMNode_selectNodes(rootNode, _bstr_("elem"), &list);
5117 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5118 /* using get_item for query results advances the position */
5119 hr = IXMLDOMNodeList_get_item(list, 1, &node);
5120 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5121 expect_node(node, "E2.E2.D1");
5122 IXMLDOMNode_Release(node);
5123 hr = IXMLDOMNodeList_nextNode(list, &node);
5124 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5125 expect_node(node, "E4.E2.D1");
5126 IXMLDOMNode_Release(node);
5127 hr = IXMLDOMNodeList_reset(list);
5128 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5129 expect_list_and_release(list, "E1.E2.D1 E2.E2.D1 E4.E2.D1");
5130
5131 hr = IXMLDOMNode_selectNodes(rootNode, _bstr_("."), &list);
5132 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5133 expect_list_and_release(list, "E2.D1");
5134
5135 hr = IXMLDOMNode_selectNodes(rootNode, _bstr_("elem[3]/preceding-sibling::*"), &list);
5136 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5137 hr = IXMLDOMNodeList_get_item(list, 0, &elem1Node);
5138 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5139 hr = IXMLDOMNodeList_reset(list);
5140 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5141 expect_list_and_release(list, "E1.E2.D1 E2.E2.D1 E3.E2.D1");
5142
5143 /* select an attribute */
5144 hr = IXMLDOMNode_selectNodes(rootNode, _bstr_(".//@type"), &list);
5145 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5146 expect_list_and_release(list, "A'type'.E3.E2.E2.D1");
5147
5148 /* would evaluate to a number */
5149 hr = IXMLDOMNode_selectNodes(rootNode, _bstr_("count(*)"), &list);
5150 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
5151 /* would evaluate to a boolean */
5152 hr = IXMLDOMNode_selectNodes(rootNode, _bstr_("position()>0"), &list);
5153 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
5154 /* would evaluate to a string */
5155 hr = IXMLDOMNode_selectNodes(rootNode, _bstr_("name()"), &list);
5156 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
5157
5158 /* no results */
5159 hr = IXMLDOMNode_selectNodes(rootNode, _bstr_("c"), &list);
5160 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5162 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("elem//c"), &list);
5163 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5165 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("//elem[4]"), &list);
5166 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5168 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("root//elem[0]"), &list);
5169 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5171
5172 /* foo undeclared in document node */
5173 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("root//foo:c"), &list);
5174 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
5175 /* undeclared in <root> node */
5176 hr = IXMLDOMNode_selectNodes(rootNode, _bstr_(".//foo:c"), &list);
5177 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
5178 /* undeclared in <elem> node */
5179 hr = IXMLDOMNode_selectNodes(elem1Node, _bstr_("//foo:c"), &list);
5180 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
5181 /* but this trick can be used */
5182 hr = IXMLDOMNode_selectNodes(elem1Node, _bstr_("//*[name()='foo:c']"), &list);
5183 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5184 expect_list_and_release(list, "E3.E4.E2.D1");
5185
5186 /* it has to be declared in SelectionNamespaces */
5187 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionNamespaces"),
5188 _variantbstr_("xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'"));
5189 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5190
5191 /* now the namespace can be used */
5192 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("root//test:c"), &list);
5193 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5194 expect_list_and_release(list, "E3.E3.E2.D1 E3.E4.E2.D1");
5195 hr = IXMLDOMNode_selectNodes(rootNode, _bstr_(".//test:c"), &list);
5196 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5197 expect_list_and_release(list, "E3.E3.E2.D1 E3.E4.E2.D1");
5198 hr = IXMLDOMNode_selectNodes(elem1Node, _bstr_("//test:c"), &list);
5199 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5200 expect_list_and_release(list, "E3.E3.E2.D1 E3.E4.E2.D1");
5201 hr = IXMLDOMNode_selectNodes(elem1Node, _bstr_(".//test:x"), &list);
5202 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5203 expect_list_and_release(list, "E6.E1.E5.E1.E2.D1 E6.E2.E5.E1.E2.D1");
5204
5205 /* SelectionNamespaces syntax error - the namespaces doesn't work anymore but the value is stored */
5206 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionNamespaces"),
5207 _variantbstr_("xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29' xmlns:foo=###"));
5208 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
5209
5210 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("root//foo:c"), &list);
5211 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
5212
5213 VariantInit(&var);
5214 hr = IXMLDOMDocument2_getProperty(doc, _bstr_("SelectionNamespaces"), &var);
5215 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5216 expect_eq(V_VT(&var), VT_BSTR, int, "%x");
5217 if (V_VT(&var) == VT_BSTR)
5218 expect_bstr_eq_and_free(V_BSTR(&var), "xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29' xmlns:foo=###");
5219
5220 /* extra attributes - same thing*/
5221 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionNamespaces"),
5222 _variantbstr_("xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29' param='test'"));
5223 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
5224 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("root//foo:c"), &list);
5225 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
5226
5227 IXMLDOMNode_Release(rootNode);
5228 IXMLDOMNode_Release(elem1Node);
5229
5230 /* alter document with already built list */
5231 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("root"), &list);
5232 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5234
5235 hr = IXMLDOMDocument2_get_lastChild(doc, &rootNode);
5236 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5237 EXPECT_REF(rootNode, 1);
5238 EXPECT_REF(doc, 1);
5239
5240 hr = IXMLDOMDocument2_removeChild(doc, rootNode, NULL);
5241 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5242 IXMLDOMNode_Release(rootNode);
5243
5245
5246 hr = IXMLDOMNodeList_get_item(list, 0, &rootNode);
5247 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5248 EXPECT_REF(rootNode, 1);
5249
5250 IXMLDOMNodeList_Release(list);
5251
5252 hr = IXMLDOMNode_get_nodeName(rootNode, &str);
5253 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5254 ok(!lstrcmpW(str, L"root"), "got %s\n", wine_dbgstr_w(str));
5256 IXMLDOMNode_Release(rootNode);
5257
5258 /* alter node from list and get it another time */
5259 hr = IXMLDOMDocument2_loadXML(doc, _bstr_(szExampleXML), &b);
5260 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5261 ok(b == VARIANT_TRUE, "failed to load XML string\n");
5262
5263 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("root"), &list);
5264 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5266
5267 hr = IXMLDOMNodeList_get_item(list, 0, &rootNode);
5268 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5269
5270 hr = IXMLDOMNode_QueryInterface(rootNode, &IID_IXMLDOMElement, (void**)&elem);
5271 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5272
5273 V_VT(&var) = VT_I2;
5274 V_I2(&var) = 1;
5275 hr = IXMLDOMElement_setAttribute(elem, _bstr_("attrtest"), var);
5276 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5277 IXMLDOMElement_Release(elem);
5278 IXMLDOMNode_Release(rootNode);
5279
5280 /* now check attribute to be present */
5281 hr = IXMLDOMNodeList_get_item(list, 0, &rootNode);
5282 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5283
5284 hr = IXMLDOMNode_QueryInterface(rootNode, &IID_IXMLDOMElement, (void**)&elem);
5285 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5286
5287 hr = IXMLDOMElement_getAttributeNode(elem, _bstr_("attrtest"), &attr);
5288 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5289 IXMLDOMAttribute_Release(attr);
5290
5291 IXMLDOMElement_Release(elem);
5292 IXMLDOMNode_Release(rootNode);
5293
5294 /* and now check for attribute in original document */
5295 hr = IXMLDOMDocument2_get_documentElement(doc, &elem);
5296 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5297
5298 hr = IXMLDOMElement_getAttributeNode(elem, _bstr_("attrtest"), &attr);
5299 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5300 IXMLDOMAttribute_Release(attr);
5301
5302 IXMLDOMElement_Release(elem);
5303
5304 /* attach node from list to another document */
5305 doc2 = create_document(&IID_IXMLDOMDocument);
5306
5307 hr = IXMLDOMDocument2_loadXML(doc, _bstr_(szExampleXML), &b);
5308 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5309 ok(b == VARIANT_TRUE, "failed to load XML string\n");
5310
5311 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("root"), &list);
5312 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5314
5315 hr = IXMLDOMNodeList_get_item(list, 0, &rootNode);
5316 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5317 EXPECT_REF(rootNode, 1);
5318
5319 hr = IXMLDOMDocument_appendChild(doc2, rootNode, NULL);
5320 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5321 EXPECT_REF(rootNode, 1);
5322 EXPECT_REF(doc2, 1);
5323 EXPECT_REF(list, 1);
5324
5326
5327 IXMLDOMNode_Release(rootNode);
5328 IXMLDOMNodeList_Release(list);
5329 IXMLDOMDocument_Release(doc2);
5330 IXMLDOMDocument2_Release(doc);
5331
5332 while (ptr->clsid)
5333 {
5334 if (is_clsid_supported(ptr->clsid, &IID_IXMLDOMDocument2))
5335 {
5336 hr = CoCreateInstance(ptr->clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (void**)&doc);
5337 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5338 }
5339 else
5340 {
5341 ptr++;
5342 continue;
5343 }
5344
5345 hr = IXMLDOMDocument2_loadXML(doc, _bstr_(szExampleXML), &b);
5346 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5347 ok(b == VARIANT_TRUE, "failed to load, %s\n", ptr->name);
5348
5349 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionLanguage"), _variantbstr_("XPath"));
5350 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5351
5352 V_VT(&var) = VT_BSTR;
5353 V_BSTR(&var) = _bstr_(ptr->ns);
5354
5355 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionNamespaces"), var);
5356 ok(hr == ptr->hr, "Unexpected hr %#lx., for %s, %s\n", hr, ptr->name, ptr->ns);
5357
5358 V_VT(&var) = VT_EMPTY;
5359 hr = IXMLDOMDocument2_getProperty(doc, _bstr_("SelectionNamespaces"), &var);
5360 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5361 ok(V_VT(&var) == VT_BSTR, "got wrong property type %d\n", V_VT(&var));
5362 ok(!lstrcmpW(V_BSTR(&var), _bstr_(ptr->ns)), "got wrong value %s\n", wine_dbgstr_w(V_BSTR(&var)));
5363 VariantClear(&var);
5364
5365 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("root//test:c"), &list);
5366 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5367 if (hr == S_OK)
5368 expect_list_and_release(list, "E3.E3.E2.D1 E3.E4.E2.D1");
5369
5370 IXMLDOMDocument2_Release(doc);
5371 ptr++;
5372 free_bstrs();
5373 }
5374
5375 free_bstrs();
5376}
5377
5378static void test_cloneNode(void )
5379{
5380 IXMLDOMDocument2 *doc, *doc_clone;
5381 IXMLDOMDocument *doc2;
5384 IXMLDOMNamedNodeMap *mapAttr;
5385 LONG length, length1;
5386 LONG attr_cnt, attr_cnt1;
5388 IXMLDOMNode *node_clone;
5389 IXMLDOMNode *node_first;
5390 VARIANT v;
5391 HRESULT hr;
5392
5393 doc = create_document(&IID_IXMLDOMDocument2);
5394
5395 hr = IXMLDOMDocument2_loadXML(doc, _bstr_(complete4A), &b);
5396 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5397 ok(b == VARIANT_TRUE, "failed to load XML string\n");
5398
5399 hr = IXMLDOMDocument2_getProperty(doc, _bstr_("SelectionLanguage"), &v);
5400 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5401 ok(!lstrcmpW(V_BSTR(&v), L"XSLPattern"), "got prop value %s\n", wine_dbgstr_w(V_BSTR(&v)));
5402 VariantClear(&v);
5403
5404 V_BSTR(&v) = _bstr_("XPath");
5405 V_VT(&v) = VT_BSTR;
5406 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionLanguage"), v);
5407 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5408
5409 /* clone document node */
5410 hr = IXMLDOMDocument2_cloneNode(doc, VARIANT_TRUE, &node);
5411 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr );
5412 ok( node != NULL, "node %p\n", node );
5413
5414 hr = IXMLDOMNode_get_childNodes(node, &pList);
5415 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr );
5416 length = 0;
5417 hr = IXMLDOMNodeList_get_length(pList, &length);
5418 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr );
5419 ok(length == 2, "got %ld\n", length);
5420 IXMLDOMNodeList_Release(pList);
5421
5422 hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMDocument2, (void**)&doc_clone);
5423 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5424
5425 /* cloned document inherits properties */
5426 hr = IXMLDOMDocument2_getProperty(doc_clone, _bstr_("SelectionLanguage"), &v);
5427 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5428 ok(!lstrcmpW(V_BSTR(&v), L"XPath"), "got prop value %s\n", wine_dbgstr_w(V_BSTR(&v)));
5429 VariantClear(&v);
5430
5431 IXMLDOMDocument2_Release(doc_clone);
5432 IXMLDOMNode_Release(node);
5433
5434 hr = IXMLDOMDocument2_selectSingleNode(doc, _bstr_("lc/pr"), &node);
5435 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr );
5436 ok( node != NULL, "node %p\n", node );
5437
5438 /* Check invalid parameter */
5439 hr = IXMLDOMNode_cloneNode(node, VARIANT_TRUE, NULL);
5440 ok( hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5441
5442 /* All Children */
5443 hr = IXMLDOMNode_cloneNode(node, VARIANT_TRUE, &node_clone);
5444 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr );
5445 ok( node_clone != NULL, "node %p\n", node );
5446
5447 hr = IXMLDOMNode_get_firstChild(node_clone, &node_first);
5448 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr );
5449 hr = IXMLDOMNode_get_ownerDocument(node_clone, &doc2);
5450 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr );
5451 IXMLDOMDocument_Release(doc2);
5452 IXMLDOMNode_Release(node_first);
5453
5454 hr = IXMLDOMNode_get_childNodes(node, &pList);
5455 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr );
5456 length = 0;
5457 hr = IXMLDOMNodeList_get_length(pList, &length);
5458 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr );
5459 ok(length == 1, "got %ld\n", length);
5460 IXMLDOMNodeList_Release(pList);
5461
5462 hr = IXMLDOMNode_get_attributes(node, &mapAttr);
5463 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr );
5464 attr_cnt = 0;
5465 hr = IXMLDOMNamedNodeMap_get_length(mapAttr, &attr_cnt);
5466 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr );
5467 ok(attr_cnt == 3, "got %ld\n", attr_cnt);
5468 IXMLDOMNamedNodeMap_Release(mapAttr);
5469
5470 hr = IXMLDOMNode_get_childNodes(node_clone, &pList);
5471 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr );
5472 length1 = 0;
5473 hr = IXMLDOMNodeList_get_length(pList, &length1);
5474 ok(length1 == 1, "got %ld\n", length1);
5475 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr );
5476 IXMLDOMNodeList_Release(pList);
5477
5478 hr = IXMLDOMNode_get_attributes(node_clone, &mapAttr);
5479 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr );
5480 attr_cnt1 = 0;
5481 hr = IXMLDOMNamedNodeMap_get_length(mapAttr, &attr_cnt1);
5482 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr );
5483 ok(attr_cnt1 == 3, "got %ld\n", attr_cnt1);
5484 /* now really get some attributes from cloned element */
5485 attr = NULL;
5486 hr = IXMLDOMNamedNodeMap_getNamedItem(mapAttr, _bstr_("id"), &attr);
5487 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5488 IXMLDOMNode_Release(attr);
5489 IXMLDOMNamedNodeMap_Release(mapAttr);
5490
5491 ok(length == length1, "wrong Child count (%ld, %ld)\n", length, length1);
5492 ok(attr_cnt == attr_cnt1, "wrong Attribute count (%ld, %ld)\n", attr_cnt, attr_cnt1);
5493 IXMLDOMNode_Release(node_clone);
5494
5495 /* No Children */
5496 hr = IXMLDOMNode_cloneNode(node, VARIANT_FALSE, &node_clone);
5497 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr );
5498 ok( node_clone != NULL, "node %p\n", node );
5499
5500 hr = IXMLDOMNode_get_firstChild(node_clone, &node_first);
5501 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
5502
5503 hr = IXMLDOMNode_get_childNodes(node_clone, &pList);
5504 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5505 hr = IXMLDOMNodeList_get_length(pList, &length1);
5506 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5507 ok( length1 == 0, "Length should be 0 (%ld)\n", length1);
5508 IXMLDOMNodeList_Release(pList);
5509
5510 hr = IXMLDOMNode_get_attributes(node_clone, &mapAttr);
5511 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5512 hr = IXMLDOMNamedNodeMap_get_length(mapAttr, &attr_cnt1);
5513 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5514 ok(attr_cnt1 == 3, "Attribute count should be 3 (%ld)\n", attr_cnt1);
5515 IXMLDOMNamedNodeMap_Release(mapAttr);
5516
5517 ok(length != length1, "wrong Child count (%ld, %ld)\n", length, length1);
5518 ok(attr_cnt == attr_cnt1, "wrong Attribute count (%ld, %ld)\n", attr_cnt, attr_cnt1);
5519 IXMLDOMNode_Release(node_clone);
5520
5521 IXMLDOMNode_Release(node);
5522 IXMLDOMDocument2_Release(doc);
5523 free_bstrs();
5524}
5525
5526static void test_xmlTypes(void)
5527{
5528 IXMLDOMDocument *doc;
5529 IXMLDOMElement *pRoot;
5530 HRESULT hr;
5531 IXMLDOMComment *pComment;
5532 IXMLDOMElement *pElement;
5533 IXMLDOMAttribute *pAttribute;
5534 IXMLDOMNamedNodeMap *pAttribs;
5535 IXMLDOMCDATASection *pCDataSec;
5536 IXMLDOMImplementation *pIXMLDOMImplementation = NULL;
5537 IXMLDOMDocumentFragment *pDocFrag = NULL;
5538 IXMLDOMEntityReference *pEntityRef = NULL;
5539 BSTR str;
5540 IXMLDOMNode *pNextChild;
5541 VARIANT v;
5542 LONG len = 0;
5543
5544 doc = create_document(&IID_IXMLDOMDocument);
5545
5546 hr = IXMLDOMDocument_get_nextSibling(doc, NULL);
5547 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5548
5549 pNextChild = (void*)0xdeadbeef;
5550 hr = IXMLDOMDocument_get_nextSibling(doc, &pNextChild);
5551 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
5552 ok(pNextChild == NULL, "pDocChild not NULL\n");
5553
5554 /* test previous Sibling */
5555 hr = IXMLDOMDocument_get_previousSibling(doc, NULL);
5556 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5557
5558 pNextChild = (void*)0xdeadbeef;
5559 hr = IXMLDOMDocument_get_previousSibling(doc, &pNextChild);
5560 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
5561 ok(pNextChild == NULL, "pNextChild not NULL\n");
5562
5563 /* test get_dataType */
5564 V_VT(&v) = VT_EMPTY;
5565 hr = IXMLDOMDocument_get_dataType(doc, &v);
5566 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
5567 ok( V_VT(&v) == VT_NULL, "incorrect dataType type\n");
5568 VariantClear(&v);
5569
5570 /* test implementation */
5571 hr = IXMLDOMDocument_get_implementation(doc, NULL);
5572 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5573
5574 hr = IXMLDOMDocument_get_implementation(doc, &pIXMLDOMImplementation);
5575 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5576 if(hr == S_OK)
5577 {
5578 VARIANT_BOOL hasFeature = VARIANT_TRUE;
5579 BSTR sEmpty = SysAllocStringLen(NULL, 0);
5580
5581 hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, NULL, sEmpty, &hasFeature);
5582 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5583
5584 hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, sEmpty, sEmpty, NULL);
5585 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5586
5587 hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, _bstr_("DOM"), sEmpty, &hasFeature);
5588 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5589 ok(hasFeature == VARIANT_FALSE, "hasFeature returned false\n");
5590
5591 hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, sEmpty, sEmpty, &hasFeature);
5592 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5593 ok(hasFeature == VARIANT_FALSE, "hasFeature returned true\n");
5594
5595 hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, _bstr_("DOM"), NULL, &hasFeature);
5596 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5597 ok(hasFeature == VARIANT_TRUE, "hasFeature returned false\n");
5598
5599 hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, _bstr_("DOM"), sEmpty, &hasFeature);
5600 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5601 ok(hasFeature == VARIANT_FALSE, "hasFeature returned false\n");
5602
5603 hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, _bstr_("DOM"), _bstr_("1.0"), &hasFeature);
5604 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5605 ok(hasFeature == VARIANT_TRUE, "hasFeature returned true\n");
5606
5607 hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, _bstr_("XML"), _bstr_("1.0"), &hasFeature);
5608 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5609 ok(hasFeature == VARIANT_TRUE, "hasFeature returned true\n");
5610
5611 hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, _bstr_("MS-DOM"), _bstr_("1.0"), &hasFeature);
5612 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5613 ok(hasFeature == VARIANT_TRUE, "hasFeature returned true\n");
5614
5615 hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, _bstr_("SSS"), NULL, &hasFeature);
5616 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5617 ok(hasFeature == VARIANT_FALSE, "hasFeature returned false\n");
5618
5619 SysFreeString(sEmpty);
5620 IXMLDOMImplementation_Release(pIXMLDOMImplementation);
5621 }
5622
5623 pRoot = (IXMLDOMElement*)0x1;
5624 hr = IXMLDOMDocument_createElement(doc, NULL, &pRoot);
5625 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5626 ok(pRoot == (void*)0x1, "Expect same ptr, got %p\n", pRoot);
5627
5628 pRoot = (IXMLDOMElement*)0x1;
5629 hr = IXMLDOMDocument_createElement(doc, _bstr_(""), &pRoot);
5630 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr );
5631 ok(pRoot == (void*)0x1, "Expect same ptr, got %p\n", pRoot);
5632
5633 hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing"), &pRoot);
5634 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5635 if(hr == S_OK)
5636 {
5637 hr = IXMLDOMDocument_appendChild(doc, (IXMLDOMNode*)pRoot, NULL);
5638 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5639 if(hr == S_OK)
5640 {
5641 /* Comment */
5642 str = SysAllocString(L"A Comment");
5643 hr = IXMLDOMDocument_createComment(doc, str, &pComment);
5645 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5646 if(hr == S_OK)
5647 {
5648 hr = IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pComment, NULL);
5649 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5650
5651 hr = IXMLDOMComment_get_nodeName(pComment, &str);
5652 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5653 ok( !lstrcmpW( str, L"#comment" ), "incorrect comment node Name\n");
5655
5656 hr = IXMLDOMComment_get_xml(pComment, &str);
5657 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5658 ok( !lstrcmpW( str, L"<!--A Comment-->" ), "incorrect comment xml\n");
5660
5661 /* put data Tests */
5662 hr = IXMLDOMComment_put_data(pComment, _bstr_("This &is a ; test <>\\"));
5663 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5664
5665 /* get data Tests */
5666 hr = IXMLDOMComment_get_data(pComment, &str);
5667 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5668 ok(!lstrcmpW(str, L"This &is a ; test <>\\"), "incorrect get_data string\n");
5670
5671 /* Confirm XML text is good */
5672 hr = IXMLDOMComment_get_xml(pComment, &str);
5673 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5674 ok(!lstrcmpW(str, L"<!--This &is a ; test <>\\-->"), "incorrect xml string\n");
5676
5677 /* Confirm we get the put_data Text back */
5678 hr = IXMLDOMComment_get_text(pComment, &str);
5679 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5680 ok(!lstrcmpW(str, L"This &is a ; test <>\\"), "incorrect xml string\n");
5682
5683 /* test length property */
5684 hr = IXMLDOMComment_get_length(pComment, &len);
5685 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5686 ok(len == 21, "expected 21 got %ld\n", len);
5687
5688 /* test substringData */
5689 hr = IXMLDOMComment_substringData(pComment, 0, 4, NULL);
5690 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5691
5692 /* test substringData - Invalid offset */
5693 str = (void *)0xdeadbeef;
5694 hr = IXMLDOMComment_substringData(pComment, -1, 4, &str);
5695 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5696 ok( str == NULL, "incorrect string\n");
5697
5698 /* test substringData - Invalid offset */
5699 str = (void *)0xdeadbeef;
5700 hr = IXMLDOMComment_substringData(pComment, 30, 0, &str);
5701 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
5702 ok( str == NULL, "incorrect string\n");
5703
5704 /* test substringData - Invalid size */
5705 str = (void *)0xdeadbeef;
5706 hr = IXMLDOMComment_substringData(pComment, 0, -1, &str);
5707 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5708 ok( str == NULL, "incorrect string\n");
5709
5710 /* test substringData - Invalid size */
5711 str = (void *)0xdeadbeef;
5712 hr = IXMLDOMComment_substringData(pComment, 2, 0, &str);
5713 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
5714 ok( str == NULL, "incorrect string\n");
5715
5716 /* test substringData - Start of string */
5717 hr = IXMLDOMComment_substringData(pComment, 0, 4, &str);
5718 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5719 ok(!lstrcmpW(str, L"This"), "incorrect substringData string\n");
5721
5722 /* test substringData - Middle of string */
5723 hr = IXMLDOMComment_substringData(pComment, 13, 4, &str);
5724 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5725 ok(!lstrcmpW(str, L"test"), "incorrect substringData string\n");
5727
5728 /* test substringData - End of string */
5729 hr = IXMLDOMComment_substringData(pComment, 20, 4, &str);
5730 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5731 ok(!lstrcmpW(str, L"\\"), "incorrect substringData string\n");
5733
5734 /* test appendData */
5735 hr = IXMLDOMComment_appendData(pComment, NULL);
5736 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5737
5738 hr = IXMLDOMComment_appendData(pComment, _bstr_(""));
5739 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5740
5741 hr = IXMLDOMComment_appendData(pComment, _bstr_("Append"));
5742 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5743
5744 hr = IXMLDOMComment_get_text(pComment, &str);
5745 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5746 ok(!lstrcmpW(str, L"This &is a ; test <>\\Append"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
5748
5749 /* test insertData */
5751 hr = IXMLDOMComment_insertData(pComment, -1, str);
5752 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5753
5754 hr = IXMLDOMComment_insertData(pComment, -1, NULL);
5755 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5756
5757 hr = IXMLDOMComment_insertData(pComment, 1000, str);
5758 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5759
5760 hr = IXMLDOMComment_insertData(pComment, 1000, NULL);
5761 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5762
5763 hr = IXMLDOMComment_insertData(pComment, 0, NULL);
5764 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5765
5766 hr = IXMLDOMComment_insertData(pComment, 0, str);
5767 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5769
5770 hr = IXMLDOMComment_insertData(pComment, -1, _bstr_("Inserting"));
5771 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5772
5773 hr = IXMLDOMComment_insertData(pComment, 1000, _bstr_("Inserting"));
5774 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5775
5776 hr = IXMLDOMComment_insertData(pComment, 0, _bstr_("Begin "));
5777 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5778
5779 hr = IXMLDOMComment_insertData(pComment, 17, _bstr_("Middle"));
5780 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5781
5782 hr = IXMLDOMComment_insertData(pComment, 39, _bstr_(" End"));
5783 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5784
5785 hr = IXMLDOMComment_get_text(pComment, &str);
5786 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5787 ok(!lstrcmpW(str, L"Begin This &is a Middle; test <>\\Append End"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
5789
5790 /* delete data */
5791 /* invalid arguments */
5792 hr = IXMLDOMComment_deleteData(pComment, -1, 1);
5793 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5794
5795 hr = IXMLDOMComment_deleteData(pComment, 0, 0);
5796 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5797
5798 hr = IXMLDOMComment_deleteData(pComment, 0, -1);
5799 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5800
5801 hr = IXMLDOMComment_get_length(pComment, &len);
5802 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5803 ok(len == 43, "expected 43 got %ld\n", len);
5804
5805 hr = IXMLDOMComment_deleteData(pComment, len, 1);
5806 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5807
5808 hr = IXMLDOMComment_deleteData(pComment, len+1, 1);
5809 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5810
5811 /* delete from start */
5812 hr = IXMLDOMComment_deleteData(pComment, 0, 5);
5813 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5814
5815 hr = IXMLDOMComment_get_length(pComment, &len);
5816 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5817 ok(len == 38, "expected 38 got %ld\n", len);
5818
5819 hr = IXMLDOMComment_get_text(pComment, &str);
5820 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5821 ok(!lstrcmpW(str, L" This &is a Middle; test <>\\Append End"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
5823
5824 /* delete from end */
5825 hr = IXMLDOMComment_deleteData(pComment, 35, 3);
5826 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5827
5828 hr = IXMLDOMComment_get_length(pComment, &len);
5829 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5830 ok(len == 35, "expected 35 got %ld\n", len);
5831
5832 hr = IXMLDOMComment_get_text(pComment, &str);
5833 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5834 ok(!lstrcmpW(str, L" This &is a Middle; test <>\\Append "), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
5836
5837 /* delete from inside */
5838 hr = IXMLDOMComment_deleteData(pComment, 1, 33);
5839 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5840
5841 hr = IXMLDOMComment_get_length(pComment, &len);
5842 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5843 ok(len == 2, "expected 2 got %ld\n", len);
5844
5845 hr = IXMLDOMComment_get_text(pComment, &str);
5846 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5847 ok(!lstrcmpW(str, L" "), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
5849
5850 /* delete whole data ... */
5851 hr = IXMLDOMComment_get_length(pComment, &len);
5852 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5853
5854 hr = IXMLDOMComment_deleteData(pComment, 0, len);
5855 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5856 /* ... and try again with empty string */
5857 hr = IXMLDOMComment_deleteData(pComment, 0, len);
5858 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5859
5860 /* ::replaceData() */
5861 V_VT(&v) = VT_BSTR;
5862 V_BSTR(&v) = SysAllocString(L"str1");
5863 hr = IXMLDOMComment_put_nodeValue(pComment, v);
5864 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5865 VariantClear(&v);
5866
5867 hr = IXMLDOMComment_replaceData(pComment, 6, 0, NULL);
5868 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5869 hr = IXMLDOMComment_get_text(pComment, &str);
5870 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5871 ok(!lstrcmpW(str, L"str1"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
5873
5874 hr = IXMLDOMComment_replaceData(pComment, 0, 0, NULL);
5875 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5876 hr = IXMLDOMComment_get_text(pComment, &str);
5877 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5878 ok(!lstrcmpW(str, L"str1"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
5880
5881 /* NULL pointer means delete */
5882 hr = IXMLDOMComment_replaceData(pComment, 0, 1, NULL);
5883 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5884 hr = IXMLDOMComment_get_text(pComment, &str);
5885 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5886 ok(!lstrcmpW(str, L"tr1"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
5888
5889 /* empty string means delete */
5890 hr = IXMLDOMComment_replaceData(pComment, 0, 1, _bstr_(""));
5891 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5892 hr = IXMLDOMComment_get_text(pComment, &str);
5893 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5894 ok(!lstrcmpW(str, L"r1"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
5896
5897 /* zero count means insert */
5898 hr = IXMLDOMComment_replaceData(pComment, 0, 0, _bstr_("a"));
5899 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5900 hr = IXMLDOMComment_get_text(pComment, &str);
5901 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5902 ok(!lstrcmpW(str, L"ar1"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
5904
5905 hr = IXMLDOMComment_replaceData(pComment, 0, 2, NULL);
5906 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5907
5908 hr = IXMLDOMComment_insertData(pComment, 0, _bstr_("m"));
5909 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5910 hr = IXMLDOMComment_get_text(pComment, &str);
5911 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5912 ok(!lstrcmpW(str, L"m1"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
5914
5915 /* nonempty string, count greater than its length */
5916 hr = IXMLDOMComment_replaceData(pComment, 0, 2, _bstr_("a1.2"));
5917 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5918 hr = IXMLDOMComment_get_text(pComment, &str);
5919 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5920 ok(!lstrcmpW(str, L"a1.2"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
5922
5923 /* nonempty string, count less than its length */
5924 hr = IXMLDOMComment_replaceData(pComment, 0, 1, _bstr_("wine"));
5925 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5926 hr = IXMLDOMComment_get_text(pComment, &str);
5927 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5928 ok(!lstrcmpW(str, L"wine1.2"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
5930
5931 IXMLDOMComment_Release(pComment);
5932 }
5933
5934 /* Element */
5935 str = SysAllocString(L"EleTest");
5936 hr = IXMLDOMDocument_createElement(doc, str, &pElement);
5938 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5939 if(hr == S_OK)
5940 {
5941 hr = IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pElement, NULL);
5942 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5943
5944 hr = IXMLDOMElement_get_nodeName(pElement, &str);
5945 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5946 ok( !lstrcmpW( str, L"EleTest" ), "incorrect element node Name\n");
5948
5949 hr = IXMLDOMElement_get_xml(pElement, &str);
5950 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5951 ok( !lstrcmpW( str, L"<EleTest/>" ), "incorrect element xml\n");
5953
5954 /* Attribute */
5955 pAttribute = (IXMLDOMAttribute*)0x1;
5956 hr = IXMLDOMDocument_createAttribute(doc, NULL, &pAttribute);
5957 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5958 ok(pAttribute == (void*)0x1, "Expect same ptr, got %p\n", pAttribute);
5959
5960 pAttribute = (IXMLDOMAttribute*)0x1;
5961 hr = IXMLDOMDocument_createAttribute(doc, _bstr_(""), &pAttribute);
5962 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr );
5963 ok(pAttribute == (void*)0x1, "Expect same ptr, got %p\n", pAttribute);
5964
5965 str = SysAllocString(L"Attr");
5966 hr = IXMLDOMDocument_createAttribute(doc, str, &pAttribute);
5968 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5969 if(hr == S_OK)
5970 {
5971 IXMLDOMNode *pNewChild = (IXMLDOMNode *)0x1;
5972
5973 hr = IXMLDOMAttribute_get_nextSibling(pAttribute, NULL);
5974 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5975
5976 pNextChild = (IXMLDOMNode *)0x1;
5977 hr = IXMLDOMAttribute_get_nextSibling(pAttribute, &pNextChild);
5978 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
5979 ok(pNextChild == NULL, "pNextChild not NULL\n");
5980
5981 /* test Previous Sibling*/
5982 hr = IXMLDOMAttribute_get_previousSibling(pAttribute, NULL);
5983 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5984
5985 pNextChild = (IXMLDOMNode *)0x1;
5986 hr = IXMLDOMAttribute_get_previousSibling(pAttribute, &pNextChild);
5987 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
5988 ok(pNextChild == NULL, "pNextChild not NULL\n");
5989
5990 hr = IXMLDOMElement_appendChild(pElement, (IXMLDOMNode*)pAttribute, &pNewChild);
5991 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr );
5992 ok(pNewChild == NULL, "pNewChild not NULL\n");
5993
5994 hr = IXMLDOMElement_get_attributes(pElement, &pAttribs);
5995 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5996 if ( hr == S_OK )
5997 {
5998 hr = IXMLDOMNamedNodeMap_setNamedItem(pAttribs, (IXMLDOMNode*)pAttribute, NULL );
5999 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6000
6001 IXMLDOMNamedNodeMap_Release(pAttribs);
6002 }
6003
6004 hr = IXMLDOMAttribute_get_nodeName(pAttribute, &str);
6005 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6006 ok( !lstrcmpW( str, L"Attr" ), "incorrect attribute node Name\n");
6008
6009 /* test nodeName */
6010 hr = IXMLDOMAttribute_get_nodeName(pAttribute, &str);
6011 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6012 ok( !lstrcmpW( str, L"Attr" ), "incorrect nodeName string\n");
6014
6015 /* test name property */
6016 hr = IXMLDOMAttribute_get_name(pAttribute, &str);
6017 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6018 ok( !lstrcmpW( str, L"Attr" ), "incorrect name string\n");
6020
6021 hr = IXMLDOMAttribute_get_xml(pAttribute, &str);
6022 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6023 ok( !lstrcmpW( str, L"Attr=\"\"" ), "incorrect attribute xml\n");
6025
6026 IXMLDOMAttribute_Release(pAttribute);
6027
6028 /* Check Element again with the Add Attribute*/
6029 hr = IXMLDOMElement_get_xml(pElement, &str);
6030 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6031 ok( !lstrcmpW( str, L"<EleTest Attr=\"\"/>" ), "incorrect element xml\n");
6033 }
6034
6035 hr = IXMLDOMElement_put_text(pElement, _bstr_("TestingNode"));
6036 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6037
6038 hr = IXMLDOMElement_get_xml(pElement, &str);
6039 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6040 ok( !lstrcmpW( str, L"<EleTest Attr=\"\">TestingNode</EleTest>" ), "incorrect element xml\n");
6042
6043 /* Test for reversible escaping */
6045 hr = IXMLDOMElement_put_text(pElement, str);
6046 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6047 SysFreeString( str );
6048
6049 hr = IXMLDOMElement_get_xml(pElement, &str);
6050 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6051 ok( !lstrcmpW( str, L"<EleTest Attr=\"\">&amp;x \x2103</EleTest>" ), "incorrect element xml\n");
6053
6054 hr = IXMLDOMElement_get_text(pElement, &str);
6055 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6056 ok( !lstrcmpW( str, szStrangeChars ), "incorrect element text\n");
6058
6059 IXMLDOMElement_Release(pElement);
6060 }
6061
6062 /* CData Section */
6063 str = SysAllocString(L"[1]*2=3; &gee that is not right!");
6064 hr = IXMLDOMDocument_createCDATASection(doc, str, NULL);
6065 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
6066
6067 hr = IXMLDOMDocument_createCDATASection(doc, str, &pCDataSec);
6069 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6070 if(hr == S_OK)
6071 {
6072 IXMLDOMNode *pNextChild = (IXMLDOMNode *)0x1;
6073 VARIANT var;
6074
6075 VariantInit(&var);
6076
6077 hr = IXMLDOMCDATASection_QueryInterface(pCDataSec, &IID_IXMLDOMElement, (void**)&pElement);
6078 ok(hr == E_NOINTERFACE, "Unexpected hr %#lx.\n", hr);
6079
6080 hr = IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pCDataSec, NULL);
6081 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6082
6083 hr = IXMLDOMCDATASection_get_nodeName(pCDataSec, &str);
6084 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6085 ok( !lstrcmpW( str, L"#cdata-section" ), "incorrect cdata node Name\n");
6087
6088 hr = IXMLDOMCDATASection_get_xml(pCDataSec, &str);
6089 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6090 ok( !lstrcmpW( str, L"<![CDATA[[1]*2=3; &gee that is not right!]]>" ), "incorrect cdata xml\n");
6092
6093 /* test lastChild */
6094 pNextChild = (IXMLDOMNode*)0x1;
6095 hr = IXMLDOMCDATASection_get_lastChild(pCDataSec, &pNextChild);
6096 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
6097 ok(pNextChild == NULL, "pNextChild not NULL\n");
6098
6099 /* put data Tests */
6100 hr = IXMLDOMCDATASection_put_data(pCDataSec, _bstr_("This &is a ; test <>\\"));
6101 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6102
6103 /* Confirm XML text is good */
6104 hr = IXMLDOMCDATASection_get_xml(pCDataSec, &str);
6105 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6106 ok(!lstrcmpW(str, L"<![CDATA[This &is a ; test <>\\]]>"), "incorrect xml string\n");
6108
6109 /* Confirm we get the put_data Text back */
6110 hr = IXMLDOMCDATASection_get_text(pCDataSec, &str);
6111 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6112 ok(!lstrcmpW(str, L"This &is a ; test <>\\"), "incorrect text string\n");
6114
6115 /* test length property */
6116 hr = IXMLDOMCDATASection_get_length(pCDataSec, &len);
6117 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6118 ok(len == 21, "expected 21 got %ld\n", len);
6119
6120 /* test get data */
6121 hr = IXMLDOMCDATASection_get_data(pCDataSec, &str);
6122 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6123 ok(!lstrcmpW(str, L"This &is a ; test <>\\"), "incorrect text string\n");
6125
6126 /* test substringData */
6127 hr = IXMLDOMCDATASection_substringData(pCDataSec, 0, 4, NULL);
6128 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
6129
6130 /* test substringData - Invalid offset */
6131 str = (void *)0xdeadbeef;
6132 hr = IXMLDOMCDATASection_substringData(pCDataSec, -1, 4, &str);
6133 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
6134 ok( str == NULL, "incorrect string\n");
6135
6136 /* test substringData - Invalid offset */
6137 str = (void *)0xdeadbeef;
6138 hr = IXMLDOMCDATASection_substringData(pCDataSec, 30, 0, &str);
6139 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
6140 ok( str == NULL, "incorrect string\n");
6141
6142 /* test substringData - Invalid size */
6143 str = (void *)0xdeadbeef;
6144 hr = IXMLDOMCDATASection_substringData(pCDataSec, 0, -1, &str);
6145 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
6146 ok( str == NULL, "incorrect string\n");
6147
6148 /* test substringData - Invalid size */
6149 str = (void *)0xdeadbeef;
6150 hr = IXMLDOMCDATASection_substringData(pCDataSec, 2, 0, &str);
6151 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
6152 ok( str == NULL, "incorrect string\n");
6153
6154 /* test substringData - Start of string */
6155 hr = IXMLDOMCDATASection_substringData(pCDataSec, 0, 4, &str);
6156 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6157 ok(!lstrcmpW(str, L"This"), "incorrect substringData string\n");
6159
6160 /* test substringData - Middle of string */
6161 hr = IXMLDOMCDATASection_substringData(pCDataSec, 13, 4, &str);
6162 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6163 ok(!lstrcmpW(str, L"test"), "incorrect substringData string\n");
6165
6166 /* test substringData - End of string */
6167 hr = IXMLDOMCDATASection_substringData(pCDataSec, 20, 4, &str);
6168 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6169 ok(!lstrcmpW(str, L"\\"), "incorrect substringData string\n");
6171
6172 /* test appendData */
6173 hr = IXMLDOMCDATASection_appendData(pCDataSec, NULL);
6174 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6175
6176 hr = IXMLDOMCDATASection_appendData(pCDataSec, _bstr_(""));
6177 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6178
6179 hr = IXMLDOMCDATASection_appendData(pCDataSec, _bstr_("Append"));
6180 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6181
6182 hr = IXMLDOMCDATASection_get_text(pCDataSec, &str);
6183 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6184 ok(!lstrcmpW(str, L"This &is a ; test <>\\Append"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
6186
6187 /* test insertData */
6189 hr = IXMLDOMCDATASection_insertData(pCDataSec, -1, str);
6190 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6191
6192 hr = IXMLDOMCDATASection_insertData(pCDataSec, -1, NULL);
6193 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6194
6195 hr = IXMLDOMCDATASection_insertData(pCDataSec, 1000, str);
6196 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6197
6198 hr = IXMLDOMCDATASection_insertData(pCDataSec, 1000, NULL);
6199 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6200
6201 hr = IXMLDOMCDATASection_insertData(pCDataSec, 0, NULL);
6202 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6203
6204 hr = IXMLDOMCDATASection_insertData(pCDataSec, 0, str);
6205 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6207
6208 hr = IXMLDOMCDATASection_insertData(pCDataSec, -1, _bstr_("Inserting"));
6209 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
6210
6211 hr = IXMLDOMCDATASection_insertData(pCDataSec, 1000, _bstr_("Inserting"));
6212 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
6213
6214 hr = IXMLDOMCDATASection_insertData(pCDataSec, 0, _bstr_("Begin "));
6215 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6216
6217 hr = IXMLDOMCDATASection_insertData(pCDataSec, 17, _bstr_("Middle"));
6218 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6219
6220 hr = IXMLDOMCDATASection_insertData(pCDataSec, 39, _bstr_(" End"));
6221 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6222
6223 hr = IXMLDOMCDATASection_get_text(pCDataSec, &str);
6224 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6225 ok(!lstrcmpW(str, L"Begin This &is a Middle; test <>\\Append End"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
6227
6228 /* delete data */
6229 /* invalid arguments */
6230 hr = IXMLDOMCDATASection_deleteData(pCDataSec, -1, 1);
6231 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
6232
6233 hr = IXMLDOMCDATASection_deleteData(pCDataSec, 0, 0);
6234 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6235
6236 hr = IXMLDOMCDATASection_deleteData(pCDataSec, 0, -1);
6237 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
6238
6239 hr = IXMLDOMCDATASection_get_length(pCDataSec, &len);
6240 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6241 ok(len == 43, "expected 43 got %ld\n", len);
6242
6243 hr = IXMLDOMCDATASection_deleteData(pCDataSec, len, 1);
6244 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6245
6246 hr = IXMLDOMCDATASection_deleteData(pCDataSec, len+1, 1);
6247 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
6248
6249 /* delete from start */
6250 hr = IXMLDOMCDATASection_deleteData(pCDataSec, 0, 5);
6251 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6252
6253 hr = IXMLDOMCDATASection_get_length(pCDataSec, &len);
6254 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6255 ok(len == 38, "expected 38 got %ld\n", len);
6256
6257 hr = IXMLDOMCDATASection_get_text(pCDataSec, &str);
6258 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6259 ok(!lstrcmpW(str, L" This &is a Middle; test <>\\Append End"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
6261
6262 /* delete from end */
6263 hr = IXMLDOMCDATASection_deleteData(pCDataSec, 35, 3);
6264 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6265
6266 hr = IXMLDOMCDATASection_get_length(pCDataSec, &len);
6267 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6268 ok(len == 35, "expected 35 got %ld\n", len);
6269
6270 hr = IXMLDOMCDATASection_get_text(pCDataSec, &str);
6271 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6272 ok(!lstrcmpW(str, L" This &is a Middle; test <>\\Append "), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
6274
6275 /* delete from inside */
6276 hr = IXMLDOMCDATASection_deleteData(pCDataSec, 1, 33);
6277 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6278
6279 hr = IXMLDOMCDATASection_get_length(pCDataSec, &len);
6280 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6281 ok(len == 2, "expected 2 got %ld\n", len);
6282
6283 hr = IXMLDOMCDATASection_get_text(pCDataSec, &str);
6284 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6285 ok(!lstrcmpW(str, L" "), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
6287
6288 /* delete whole data ... */
6289 hr = IXMLDOMCDATASection_get_length(pCDataSec, &len);
6290 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6291
6292 hr = IXMLDOMCDATASection_deleteData(pCDataSec, 0, len);
6293 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6294
6295 /* ... and try again with empty string */
6296 hr = IXMLDOMCDATASection_deleteData(pCDataSec, 0, len);
6297 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6298
6299 /* ::replaceData() */
6300 V_VT(&v) = VT_BSTR;
6301 V_BSTR(&v) = SysAllocString(L"str1");
6302 hr = IXMLDOMCDATASection_put_nodeValue(pCDataSec, v);
6303 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6304 VariantClear(&v);
6305
6306 hr = IXMLDOMCDATASection_replaceData(pCDataSec, 6, 0, NULL);
6307 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
6308 hr = IXMLDOMCDATASection_get_text(pCDataSec, &str);
6309 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6310 ok(!lstrcmpW(str, L"str1"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
6312
6313 hr = IXMLDOMCDATASection_replaceData(pCDataSec, 0, 0, NULL);
6314 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6315 hr = IXMLDOMCDATASection_get_text(pCDataSec, &str);
6316 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6317 ok(!lstrcmpW(str, L"str1"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
6319
6320 /* NULL pointer means delete */
6321 hr = IXMLDOMCDATASection_replaceData(pCDataSec, 0, 1, NULL);
6322 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6323 hr = IXMLDOMCDATASection_get_text(pCDataSec, &str);
6324 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6325 ok(!lstrcmpW(str, L"tr1"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
6327
6328 /* empty string means delete */
6329 hr = IXMLDOMCDATASection_replaceData(pCDataSec, 0, 1, _bstr_(""));
6330 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6331 hr = IXMLDOMCDATASection_get_text(pCDataSec, &str);
6332 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6333 ok(!lstrcmpW(str, L"r1"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
6335
6336 /* zero count means insert */
6337 hr = IXMLDOMCDATASection_replaceData(pCDataSec, 0, 0, _bstr_("a"));
6338 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6339 hr = IXMLDOMCDATASection_get_text(pCDataSec, &str);
6340 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6341 ok(!lstrcmpW(str, L"ar1"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
6343
6344 hr = IXMLDOMCDATASection_replaceData(pCDataSec, 0, 2, NULL);
6345 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6346
6347 hr = IXMLDOMCDATASection_insertData(pCDataSec, 0, _bstr_("m"));
6348 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6349 hr = IXMLDOMCDATASection_get_text(pCDataSec, &str);
6350 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6351 ok(!lstrcmpW(str, L"m1"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
6353
6354 /* nonempty string, count greater than its length */
6355 hr = IXMLDOMCDATASection_replaceData(pCDataSec, 0, 2, _bstr_("a1.2"));
6356 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6357 hr = IXMLDOMCDATASection_get_text(pCDataSec, &str);
6358 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6359 ok(!lstrcmpW(str, L"a1.2"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
6361
6362 /* nonempty string, count less than its length */
6363 hr = IXMLDOMCDATASection_replaceData(pCDataSec, 0, 1, _bstr_("wine"));
6364 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6365 hr = IXMLDOMCDATASection_get_text(pCDataSec, &str);
6366 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6367 ok(!lstrcmpW(str, L"wine1.2"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
6369
6370 IXMLDOMCDATASection_Release(pCDataSec);
6371 }
6372
6373 /* Document Fragments */
6374 hr = IXMLDOMDocument_createDocumentFragment(doc, NULL);
6375 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
6376
6377 hr = IXMLDOMDocument_createDocumentFragment(doc, &pDocFrag);
6378 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6379 if(hr == S_OK)
6380 {
6382
6383 hr = IXMLDOMDocumentFragment_get_parentNode(pDocFrag, NULL);
6384 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
6385
6386 node = (IXMLDOMNode *)0x1;
6387 hr = IXMLDOMDocumentFragment_get_parentNode(pDocFrag, &node);
6388 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
6389 ok(node == NULL, "expected NULL, got %p\n", node);
6390
6391 hr = IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pDocFrag, NULL);
6392 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6393
6394 hr = IXMLDOMDocumentFragment_get_nodeName(pDocFrag, &str);
6395 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6396 ok( !lstrcmpW( str, L"#document-fragment" ), "incorrect docfragment node Name\n");
6398
6399 /* test next Sibling*/
6400 hr = IXMLDOMDocumentFragment_get_nextSibling(pDocFrag, NULL);
6401 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
6402
6403 node = (IXMLDOMNode *)0x1;
6404 hr = IXMLDOMDocumentFragment_get_nextSibling(pDocFrag, &node);
6405 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
6406 ok(node == NULL, "next sibling not NULL\n");
6407
6408 /* test Previous Sibling*/
6409 hr = IXMLDOMDocumentFragment_get_previousSibling(pDocFrag, NULL);
6410 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
6411
6412 node = (IXMLDOMNode *)0x1;
6413 hr = IXMLDOMDocumentFragment_get_previousSibling(pDocFrag, &node);
6414 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
6415 ok(node == NULL, "previous sibling not NULL\n");
6416
6417 IXMLDOMDocumentFragment_Release(pDocFrag);
6418 }
6419
6420 /* Entity References */
6421 hr = IXMLDOMDocument_createEntityReference(doc, NULL, &pEntityRef);
6422 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr );
6423 hr = IXMLDOMDocument_createEntityReference(doc, _bstr_(""), &pEntityRef);
6424 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr );
6425
6426 str = SysAllocString(L"entityref");
6427 hr = IXMLDOMDocument_createEntityReference(doc, str, NULL);
6428 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
6429
6430 hr = IXMLDOMDocument_createEntityReference(doc, str, &pEntityRef);
6432 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6433 if(hr == S_OK)
6434 {
6435 hr = IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pEntityRef, NULL);
6436 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6437
6438 /* test get_xml*/
6439 hr = IXMLDOMEntityReference_get_xml(pEntityRef, &str);
6440 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6441 ok( !lstrcmpW( str, L"&entityref;" ), "incorrect xml string\n");
6443
6444 IXMLDOMEntityReference_Release(pEntityRef);
6445 }
6446
6447 IXMLDOMElement_Release( pRoot );
6448 }
6449 }
6450
6451 IXMLDOMDocument_Release(doc);
6452
6453 free_bstrs();
6454}
6455
6456typedef struct {
6457 const char *name;
6458 const char *type;
6461
6462/* Type test for elements only. Name passed into put_dataType is case-insensitive.
6463 So many of the names have been changed to reflect this. */
6465 { "test_inval", "abcdefg", E_FAIL },
6466 { "test_bool", "Boolean", S_OK },
6467 { "test_string", "String", S_OK },
6468 { "test_number", "number", S_OK },
6469 { "test_int", "InT", S_OK },
6470 { "test_fixed", "fixed.14.4", S_OK },
6471 { "test_datetime", "DateTime", S_OK },
6472 { "test_datetimetz", "DateTime.tz", S_OK },
6473 { "test_date", "Date", S_OK },
6474 { "test_time", "Time", S_OK },
6475 { "test_timetz", "Time.tz", S_OK },
6476 { "test_I1", "I1", S_OK },
6477 { "test_I2", "I2", S_OK },
6478 { "test_I4", "I4", S_OK },
6479 { "test_UI1", "UI1", S_OK },
6480 { "test_UI2", "UI2", S_OK },
6481 { "test_UI4", "UI4", S_OK },
6482 { "test_r4", "r4", S_OK },
6483 { "test_r8", "r8", S_OK },
6484 { "test_float", "float", S_OK },
6485 { "test_uuid", "UuId", S_OK },
6486 { "test_binhex", "bin.hex", S_OK },
6487 { "test_binbase64", "bin.base64", S_OK },
6488 { NULL }
6489};
6490
6491typedef struct {
6495
6501 { NODE_COMMENT, E_FAIL },
6502 { NODE_INVALID }
6503};
6504
6505static void test_put_dataType( void )
6506{
6510 BSTR nameW, type1W, type2W;
6511 IXMLDOMDocument *doc;
6512 HRESULT hr;
6513
6514 doc = create_document(&IID_IXMLDOMDocument);
6515
6516 hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing"), NULL);
6517 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
6518
6519 hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing"), &root);
6520 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6521
6522 hr = IXMLDOMDocument_appendChild(doc, (IXMLDOMNode*)root, NULL);
6523 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6524
6525 hr = IXMLDOMElement_put_dataType(root, NULL);
6526 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
6527
6528 while (ptr->name)
6529 {
6530 hr = IXMLDOMDocument_createElement(doc, _bstr_(ptr->name), &element);
6531 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6532 if(hr == S_OK)
6533 {
6534 hr = IXMLDOMElement_appendChild(root, (IXMLDOMNode*)element, NULL);
6535 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6536
6537 hr = IXMLDOMElement_put_dataType(element, _bstr_(ptr->type));
6538 ok(hr == ptr->hr, "failed for %s:%s, %#lx.\n", ptr->name, ptr->type, ptr->hr);
6539
6540 IXMLDOMElement_Release(element);
6541 }
6542 ptr++;
6543 }
6544
6545 /* check changing types */
6546 hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing_Change"), &element);
6547 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6548
6549 hr = IXMLDOMElement_appendChild(root, (IXMLDOMNode*)element, NULL);
6550 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6551
6552 hr = IXMLDOMElement_put_dataType(element, _bstr_("DateTime.tz"));
6553 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6554
6555 hr = IXMLDOMElement_put_dataType(element, _bstr_("string"));
6556 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6557
6558 IXMLDOMElement_Release(element);
6559
6560 /* try to set type for node without a type */
6561 nameW = _bstr_("testname");
6562 type1W = _bstr_("string");
6563 type2W = _bstr_("number");
6564 while (ptr2->type != NODE_INVALID)
6565 {
6567 VARIANT type;
6568
6569 V_VT(&type) = VT_I2;
6570 V_I2(&type) = ptr2->type;
6571
6572 hr = IXMLDOMDocument_createNode(doc, type, nameW, NULL, &node);
6573 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6574 if(hr == S_OK)
6575 {
6576 hr = IXMLDOMElement_appendChild(root, node, NULL);
6577 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6578
6579 hr = IXMLDOMNode_put_dataType(node, NULL);
6580 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
6581
6582 hr = IXMLDOMNode_put_dataType(node, type1W);
6583 ok(hr == ptr2->hr, "failed for type %d, %#lx\n", ptr2->type, ptr->hr);
6584 hr = IXMLDOMNode_put_dataType(node, type2W);
6585 ok(hr == ptr2->hr, "failed for type %d, %#lx\n", ptr2->type, ptr->hr);
6586
6587 IXMLDOMNode_Release(node);
6588 }
6589 ptr2++;
6590 }
6591
6592 IXMLDOMElement_Release(root);
6593 IXMLDOMDocument_Release(doc);
6594 free_bstrs();
6595}
6596
6597static void test_save(void)
6598{
6599 static const char cheA[] = "<Testing che=\"\xd0\xa7\"/>";
6600 IXMLDOMDocument *doc, *doc2;
6603 BSTR sOrig, sNew, filename;
6604 char buffer[100];
6605 IStream *stream;
6608 DWORD read = 0;
6609 VARIANT v, dest;
6610 HANDLE hfile;
6611 HRESULT hr;
6612 char *ptr;
6613
6614 doc = create_document(&IID_IXMLDOMDocument);
6615 doc2 = create_document(&IID_IXMLDOMDocument);
6616
6617 /* save to IXMLDOMDocument */
6618 hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing"), &root);
6619 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6620
6621 hr = IXMLDOMDocument_appendChild(doc, (IXMLDOMNode*)root, NULL);
6622 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6623
6624 V_VT(&dest) = VT_UNKNOWN;
6625 V_UNKNOWN(&dest) = (IUnknown*)doc2;
6626
6627 hr = IXMLDOMDocument_save(doc, dest);
6628 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6629
6630 hr = IXMLDOMDocument_get_xml(doc, &sOrig);
6631 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6632
6633 hr = IXMLDOMDocument_get_xml(doc2, &sNew);
6634 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6635
6636 ok( !lstrcmpW( sOrig, sNew ), "New document is not the same as original\n");
6637
6638 SysFreeString(sOrig);
6639 SysFreeString(sNew);
6640
6641 IXMLDOMElement_Release(root);
6642 IXMLDOMDocument_Release(doc2);
6643
6644 /* save to path */
6645 V_VT(&dest) = VT_BSTR;
6646 V_BSTR(&dest) = _bstr_("test.xml");
6647
6648 hr = IXMLDOMDocument_save(doc, dest);
6649 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6650
6652 ok(hfile != INVALID_HANDLE_VALUE, "Could not open file: %lu\n", GetLastError());
6653 if(hfile == INVALID_HANDLE_VALUE) return;
6654
6655 ReadFile(hfile, buffer, sizeof(buffer), &read, NULL);
6656 ok(read != 0, "could not read file\n");
6657 ok(buffer[0] != '<' || buffer[1] != '?', "File contains processing instruction\n");
6658
6659 CloseHandle(hfile);
6660 DeleteFileA("test.xml");
6661
6662 /* save to path VT_BSTR | VT_BYREF */
6663 filename = _bstr_("test.xml");
6664 V_VT(&dest) = VT_BSTR | VT_BYREF;
6665 V_BSTRREF(&dest) = &filename;
6666
6667 hr = IXMLDOMDocument_save(doc, dest);
6668 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6669
6671 ok(hfile != INVALID_HANDLE_VALUE, "Could not open file: %lu\n", GetLastError());
6672 if(hfile == INVALID_HANDLE_VALUE) return;
6673
6674 if (hfile != INVALID_HANDLE_VALUE)
6675 {
6676 ReadFile(hfile, buffer, sizeof(buffer), &read, NULL);
6677 ok(read != 0, "could not read file\n");
6678 ok(buffer[0] != '<' || buffer[1] != '?', "File contains processing instruction\n");
6679
6680 CloseHandle(hfile);
6681 DeleteFileA("test.xml");
6682 }
6683
6684 /* save to stream */
6685 V_VT(&dest) = VT_UNKNOWN;
6687
6688 hr = IXMLDOMDocument_save(doc, dest);
6689 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6690
6691 /* loaded data contains xml declaration */
6692 hr = IXMLDOMDocument_loadXML(doc, _bstr_(win1252xml), &b);
6693 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6694
6696 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6697 V_VT(&dest) = VT_UNKNOWN;
6699 hr = IXMLDOMDocument_save(doc, dest);
6700 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6701
6703 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6705 ok(!memcmp(ptr, win1252decl, strlen(win1252decl)), "got wrong xml declaration\n");
6707 IStream_Release(stream);
6708
6709 /* loaded data without xml declaration */
6710 hr = IXMLDOMDocument_loadXML(doc, _bstr_("<a/>"), &b);
6711 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6712
6714 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6715 V_VT(&dest) = VT_UNKNOWN;
6717 hr = IXMLDOMDocument_save(doc, dest);
6718 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6719
6721 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6723 ok(ptr[0] == '<' && ptr[1] != '?', "got wrong start tag %c%c\n", ptr[0], ptr[1]);
6725 IStream_Release(stream);
6726
6727 IXMLDOMDocument_Release(doc);
6728
6729 /* test default encoding with non-english characters */
6730 doc = create_document(&IID_IXMLDOMDocument);
6731
6732 hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing"), &root);
6733 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6734
6735 hr = IXMLDOMDocument_appendChild(doc, (IXMLDOMNode*)root, NULL);
6736 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6737
6738 hr = IXMLDOMDocument_createAttribute(doc, _bstr_("che"), &attr);
6739 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6740
6741 V_VT(&v) = VT_BSTR;
6742 V_BSTR(&v) = SysAllocString(L"\x0427");
6743 hr = IXMLDOMAttribute_put_value(attr, v);
6744 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6745 VariantClear(&v);
6746
6747 hr = IXMLDOMElement_setAttributeNode(root, attr, NULL);
6748 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6749
6750 V_VT(&dest) = VT_BSTR;
6751 V_BSTR(&dest) = _bstr_("test.xml");
6752
6753 hr = IXMLDOMDocument_save(doc, dest);
6754 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6755
6757 ok(hfile != INVALID_HANDLE_VALUE, "Could not open file: %lu\n", GetLastError());
6758 if (hfile != INVALID_HANDLE_VALUE)
6759 {
6760 ReadFile(hfile, buffer, sizeof(buffer), &read, NULL);
6761 ok(read != 0, "could not read file\n");
6762 ok(!memcmp(buffer, cheA, sizeof(cheA)-1), "got: %s\n", buffer);
6763
6764 CloseHandle(hfile);
6765 DeleteFileA("test.xml");
6766 }
6767
6768 IXMLDOMAttribute_Release(attr);
6769 IXMLDOMElement_Release(root);
6770 IXMLDOMDocument_Release(doc);
6771
6772 free_bstrs();
6773}
6774
6775static void test_testTransforms(void)
6776{
6777 IXMLDOMDocument *doc, *docSS;
6778 IXMLDOMNode *pNode;
6779 VARIANT_BOOL bSucc;
6780 HRESULT hr;
6781
6782 doc = create_document(&IID_IXMLDOMDocument);
6783 docSS = create_document(&IID_IXMLDOMDocument);
6784
6785 hr = IXMLDOMDocument_loadXML(doc, _bstr_(szTransformXML), &bSucc);
6786 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6787
6788 hr = IXMLDOMDocument_loadXML(docSS, _bstr_(szTransformSSXML), &bSucc);
6789 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6790
6791 hr = IXMLDOMDocument_QueryInterface(docSS, &IID_IXMLDOMNode, (void**)&pNode );
6792 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6793 if(hr == S_OK)
6794 {
6795 BSTR bOut;
6796
6797 hr = IXMLDOMDocument_transformNode(doc, pNode, &bOut);
6798 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6799 if(hr == S_OK)
6800 {
6801 ok( compareIgnoreReturns( bOut, _bstr_(szTransformOutput)), "got output %s\n", wine_dbgstr_w(bOut));
6802 SysFreeString(bOut);
6803 }
6804
6805 IXMLDOMNode_Release(pNode);
6806 }
6807
6808 IXMLDOMDocument_Release(docSS);
6809 IXMLDOMDocument_Release(doc);
6810
6811 free_bstrs();
6812}
6813
6815 const CLSID *clsid;
6816 const char *name;
6817};
6818
6820 { &CLSID_DOMDocument, "CLSID_DOMDocument" },
6821 { &CLSID_DOMDocument2, "CLSID_DOMDocument2" },
6822 { &CLSID_DOMDocument26, "CLSID_DOMDocument26" },
6823 { &CLSID_DOMDocument30, "CLSID_DOMDocument30" },
6824 { &CLSID_DOMDocument40, "CLSID_DOMDocument40" },
6825 { &CLSID_DOMDocument60, "CLSID_DOMDocument60" },
6826 { 0 }
6827};
6828
6829static void test_namespaces_change(void)
6830{
6831 const struct namespaces_change_t *class_ptr = namespaces_change_test_data;
6832
6833 while (class_ptr->clsid)
6834 {
6835 IXMLDOMDocument *doc = NULL;
6838
6839 VARIANT var;
6840 HRESULT hr;
6841 BSTR str;
6842
6843 if (!is_clsid_supported(class_ptr->clsid, &IID_IXMLDOMDocument))
6844 {
6845 class_ptr++;
6846 continue;
6847 }
6848
6849 hr = CoCreateInstance(class_ptr->clsid, NULL, CLSCTX_INPROC_SERVER,
6850 &IID_IXMLDOMDocument, (void**)&doc);
6851 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6852
6853 V_VT(&var) = VT_I2;
6854 V_I2(&var) = NODE_ELEMENT;
6855
6856 hr = IXMLDOMDocument_createNode(doc, var, _bstr_("ns:elem"), _bstr_("ns/uri"), &node);
6857 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6858
6859 hr = IXMLDOMDocument_appendChild(doc, node, NULL);
6860 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6861
6862 hr = IXMLDOMDocument_get_documentElement(doc, &elem);
6863 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6864
6865 /* try same prefix, different uri */
6866 V_VT(&var) = VT_BSTR;
6867 V_BSTR(&var) = _bstr_("ns/uri2");
6868
6869 hr = IXMLDOMElement_setAttribute(elem, _bstr_("xmlns:ns"), var);
6870 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
6871
6872 /* try same prefix and uri */
6873 V_VT(&var) = VT_BSTR;
6874 V_BSTR(&var) = _bstr_("ns/uri");
6875
6876 hr = IXMLDOMElement_setAttribute(elem, _bstr_("xmlns:ns"), var);
6877 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6878
6879 hr = IXMLDOMElement_get_xml(elem, &str);
6880 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6881 ok(!lstrcmpW(str, L"<ns:elem xmlns:ns=\"ns/uri\"/>"), "got element %s for %s\n",
6882 wine_dbgstr_w(str), class_ptr->name);
6884
6885 IXMLDOMElement_Release(elem);
6886 IXMLDOMDocument_Release(doc);
6887
6888 free_bstrs();
6889
6890 class_ptr++;
6891 }
6892}
6893
6894static void test_namespaces_basic(void)
6895{
6896 static const CHAR namespaces_xmlA[] =
6897 "<?xml version=\"1.0\"?>\n"
6898 "<XMI xmi.version=\"1.1\" xmlns:Model=\"http://omg.org/mof.Model/1.3\">"
6899 " <XMI.content>"
6900 " <Model:Package name=\"WinePackage\" Model:name2=\"name2 attr\" />"
6901 " </XMI.content>"
6902 "</XMI>";
6903
6904 IXMLDOMDocument *doc;
6907
6909 HRESULT hr;
6910 BSTR str;
6911
6912 doc = create_document(&IID_IXMLDOMDocument);
6913
6914 hr = IXMLDOMDocument_loadXML(doc, _bstr_(namespaces_xmlA), &b);
6915 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6916 ok(b == VARIANT_TRUE, "got %d\n", b);
6917
6918 str = (void *)0xdeadbeef;
6919 hr = IXMLDOMDocument_get_namespaceURI(doc, &str);
6920 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
6921 ok(str == NULL, "got %p\n", str);
6922
6923 hr = IXMLDOMDocument_selectSingleNode(doc, _bstr_("//XMI.content"), &node );
6924 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6925 if(hr == S_OK)
6926 {
6928 IXMLDOMNode *node2;
6929
6930 hr = IXMLDOMNode_get_firstChild(node, &node2);
6931 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6932 ok(node2 != NULL, "got %p\n", node2);
6933
6934 /* Test get_prefix */
6935 hr = IXMLDOMNode_get_prefix(node2, NULL);
6936 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
6937 /* NOTE: Need to test that arg2 gets cleared on Error. */
6938
6939 hr = IXMLDOMNode_get_prefix(node2, &str);
6940 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6941 ok(!lstrcmpW(str, L"Model"), "got %s\n", wine_dbgstr_w(str));
6943
6944 hr = IXMLDOMNode_get_nodeName(node2, &str);
6945 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6946 ok(!lstrcmpW(str, L"Model:Package"), "got %s\n", wine_dbgstr_w(str));
6948
6949 /* Test get_namespaceURI */
6950 hr = IXMLDOMNode_get_namespaceURI(node2, NULL);
6951 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
6952 /* NOTE: Need to test that arg2 gets cleared on Error. */
6953
6954 hr = IXMLDOMNode_get_namespaceURI(node2, &str);
6955 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6956 ok(!lstrcmpW(str, L"http://omg.org/mof.Model/1.3"), "got %s\n", wine_dbgstr_w(str));
6958
6959 hr = IXMLDOMNode_QueryInterface(node2, &IID_IXMLDOMElement, (void**)&elem);
6960 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6961
6962 hr = IXMLDOMElement_getAttributeNode(elem, _bstr_("Model:name2"), &attr);
6963 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6964
6965 hr = IXMLDOMAttribute_get_nodeName(attr, &str);
6966 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6967 ok(!lstrcmpW(str, L"Model:name2"), "got %s\n", wine_dbgstr_w(str));
6969
6970 hr = IXMLDOMAttribute_get_prefix(attr, &str);
6971 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6972 ok(!lstrcmpW(str, L"Model"), "got %s\n", wine_dbgstr_w(str));
6974
6975 IXMLDOMAttribute_Release(attr);
6976 IXMLDOMElement_Release(elem);
6977
6978 IXMLDOMNode_Release(node2);
6979 IXMLDOMNode_Release(node);
6980 }
6981
6982 IXMLDOMDocument_Release(doc);
6983
6984 free_bstrs();
6985}
6986
6987static void test_FormattingXML(void)
6988{
6989 IXMLDOMDocument *doc;
6990 IXMLDOMElement *pElement;
6991 VARIANT_BOOL bSucc;
6992 HRESULT hr;
6993 BSTR str;
6994 static const CHAR szLinefeedXML[] = "<?xml version=\"1.0\"?>\n<Root>\n\t<Sub val=\"A\" />\n</Root>";
6995 static const CHAR szLinefeedRootXML[] = "<Root>\r\n\t<Sub val=\"A\"/>\r\n</Root>";
6996
6997 doc = create_document(&IID_IXMLDOMDocument);
6998
6999 hr = IXMLDOMDocument_loadXML(doc, _bstr_(szLinefeedXML), &bSucc);
7000 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7001 ok(bSucc == VARIANT_TRUE, "Expected VARIANT_TRUE got VARIANT_FALSE\n");
7002
7003 if(bSucc == VARIANT_TRUE)
7004 {
7005 hr = IXMLDOMDocument_get_documentElement(doc, &pElement);
7006 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7007 if(hr == S_OK)
7008 {
7009 hr = IXMLDOMElement_get_xml(pElement, &str);
7010 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7011 ok( !lstrcmpW( str, _bstr_(szLinefeedRootXML) ), "incorrect element xml\n");
7013
7014 IXMLDOMElement_Release(pElement);
7015 }
7016 }
7017
7018 IXMLDOMDocument_Release(doc);
7019
7020 free_bstrs();
7021}
7022
7023typedef struct _nodetypedvalue_t {
7024 const char *name;
7026 const char *value; /* value in string format */
7029
7031 { "root/string", VT_BSTR, "Wine", TRUE },
7032 { "root/string2", VT_BSTR, "String " },
7033 { "root/string3", VT_BSTR, " Wine Wine ", TRUE },
7034 { "root/string4", VT_BSTR, "\nWine Wine\t", TRUE },
7035 { "root/string5", VT_BSTR, "", TRUE },
7036 { "root/nested", VT_BSTR, " s1 \ns2 s2\t", TRUE },
7037 { "root/number", VT_BSTR, "12.44" },
7038 { "root/number2", VT_BSTR, "-3.71e3" },
7039 { "root/int", VT_I4, "-13" },
7040 { "root/fixed", VT_CY, "7322.9371" },
7041 { "root/bool", VT_BOOL, "-1" },
7042 { "root/datetime", VT_DATE, "40135.14" },
7043 { "root/datetimetz",VT_DATE, "37813.59" },
7044 { "root/date", VT_DATE, "665413" },
7045 { "root/time", VT_DATE, "0.5813889" },
7046 { "root/timetz", VT_DATE, "1.112512" },
7047 { "root/i1", VT_I1, "-13" },
7048 { "root/i2", VT_I2, "31915" },
7049 { "root/i4", VT_I4, "-312232" },
7050 { "root/ui1", VT_UI1, "123" },
7051 { "root/ui2", VT_UI2, "48282" },
7052 { "root/ui4", VT_UI4, "949281" },
7053 { "root/r4", VT_R4, "213124" },
7054 { "root/r8", VT_R8, "0.412" },
7055 { "root/float", VT_R8, "41221.421" },
7056 { "root/uuid", VT_BSTR, "333C7BC4-460F-11D0-BC04-0080C7055a83" },
7057 { "root/binbase64", VT_ARRAY|VT_UI1, "base64 test" },
7058 { "root/binbase64_1", VT_ARRAY|VT_UI1, "base64 test" },
7059 { "root/binbase64_2", VT_ARRAY|VT_UI1, "base64 test" },
7060 { 0 }
7061};
7062
7063static const char *strip_spaces(const char *str)
7064{
7065 static char buf[256];
7066 const char *p;
7067
7068 while (isspace(*str))
7069 ++str;
7070
7071 p = str + strlen(str);
7072 while (p != str && isspace(p[-1]))
7073 --p;
7074
7075 memcpy(buf, str, p - str);
7076 buf[p - str] = 0;
7077
7078 return buf;
7079}
7080
7081static void test_nodeTypedValue(void)
7082{
7084 IXMLDOMDocumentType *doctype, *doctype2;
7087 IXMLDOMDocument *doc, *doc2;
7088 IXMLDOMCDATASection *cdata;
7092 VARIANT value;
7093 HRESULT hr;
7094
7095 doc = create_document(&IID_IXMLDOMDocument);
7096
7097 b = VARIANT_FALSE;
7098 hr = IXMLDOMDocument_loadXML(doc, _bstr_(szTypeValueXML), &b);
7099 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7100 ok(b == VARIANT_TRUE, "got %d\n", b);
7101
7102 hr = IXMLDOMDocument_get_nodeValue(doc, NULL);
7103 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
7104
7105 V_VT(&value) = VT_BSTR;
7106 V_BSTR(&value) = NULL;
7107 hr = IXMLDOMDocument_get_nodeValue(doc, &value);
7108 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
7109 ok(V_VT(&value) == VT_NULL, "expect VT_NULL got %d\n", V_VT(&value));
7110
7111 hr = IXMLDOMDocument_get_nodeTypedValue(doc, NULL);
7112 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
7113
7114 V_VT(&value) = VT_EMPTY;
7115 hr = IXMLDOMDocument_get_nodeTypedValue(doc, &value);
7116 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
7117 ok(V_VT(&value) == VT_NULL, "got %d\n", V_VT(&value));
7118
7119 hr = IXMLDOMDocument_selectSingleNode(doc, _bstr_("root/string"), &node);
7120 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7121
7122 V_VT(&value) = VT_BSTR;
7123 V_BSTR(&value) = NULL;
7124 hr = IXMLDOMNode_get_nodeValue(node, &value);
7125 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
7126 ok(V_VT(&value) == VT_NULL, "expect VT_NULL got %d\n", V_VT(&value));
7127
7128 hr = IXMLDOMNode_get_nodeTypedValue(node, NULL);
7129 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
7130
7131 IXMLDOMNode_Release(node);
7132
7133 hr = IXMLDOMDocument_selectSingleNode(doc, _bstr_("root/binhex"), &node);
7134 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7135 {
7136 BYTE bytes[] = {0xff,0xfc,0xa0,0x12,0x00,0x3c};
7137
7138 hr = IXMLDOMNode_get_nodeTypedValue(node, &value);
7139 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7140 ok(V_VT(&value) == (VT_ARRAY|VT_UI1), "incorrect type\n");
7141 ok(V_ARRAY(&value)->rgsabound[0].cElements == 6, "incorrect array size\n");
7142 if(V_ARRAY(&value)->rgsabound[0].cElements == 6)
7143 ok(!memcmp(bytes, V_ARRAY(&value)->pvData, sizeof(bytes)), "incorrect value\n");
7145 IXMLDOMNode_Release(node);
7146 }
7147
7148 hr = IXMLDOMDocument_createProcessingInstruction(doc, _bstr_("foo"), _bstr_("value"), &pi);
7149 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7150 {
7151 V_VT(&value) = VT_NULL;
7152 V_BSTR(&value) = (void*)0xdeadbeef;
7153 hr = IXMLDOMProcessingInstruction_get_nodeTypedValue(pi, &value);
7154 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7155 ok(V_VT(&value) == VT_BSTR, "got %d\n", V_VT(&value));
7156 ok(!lstrcmpW(V_BSTR(&value), L"value"), "got wrong value\n");
7157 IXMLDOMProcessingInstruction_Release(pi);
7159 }
7160
7161 hr = IXMLDOMDocument_createCDATASection(doc, _bstr_("[1]*2=3; &gee that's not right!"), &cdata);
7162 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7163 {
7164 V_VT(&value) = VT_NULL;
7165 V_BSTR(&value) = (void*)0xdeadbeef;
7166 hr = IXMLDOMCDATASection_get_nodeTypedValue(cdata, &value);
7167 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7168 ok(V_VT(&value) == VT_BSTR, "got %d\n", V_VT(&value));
7169 ok(!lstrcmpW(V_BSTR(&value), L"[1]*2=3; &gee that's not right!"), "got wrong value\n");
7170 IXMLDOMCDATASection_Release(cdata);
7172 }
7173
7174 hr = IXMLDOMDocument_createComment(doc, _bstr_("comment"), &comment);
7175 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7176 {
7177 V_VT(&value) = VT_NULL;
7178 V_BSTR(&value) = (void*)0xdeadbeef;
7179 hr = IXMLDOMComment_get_nodeTypedValue(comment, &value);
7180 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7181 ok(V_VT(&value) == VT_BSTR, "got %d\n", V_VT(&value));
7182 ok(!lstrcmpW(V_BSTR(&value), L"comment"), "got wrong value\n");
7183 IXMLDOMComment_Release(comment);
7185 }
7186
7187 hr = IXMLDOMDocument_createDocumentFragment(doc, &frag);
7188 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7189 {
7190 V_VT(&value) = VT_EMPTY;
7191 hr = IXMLDOMDocumentFragment_get_nodeTypedValue(frag, &value);
7192 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
7193 ok(V_VT(&value) == VT_NULL, "got %d\n", V_VT(&value));
7194 IXMLDOMDocumentFragment_Release(frag);
7195 }
7196
7197 doc2 = create_document(&IID_IXMLDOMDocument);
7198
7199 b = VARIANT_FALSE;
7200 hr = IXMLDOMDocument_loadXML(doc2, _bstr_(szEmailXML), &b);
7201 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7202 ok(b == VARIANT_TRUE, "got %d\n", b);
7203
7204 EXPECT_REF(doc2, 1);
7205
7206 hr = IXMLDOMDocument_get_doctype(doc2, &doctype);
7207 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7208
7209 EXPECT_REF(doc2, 1);
7210 todo_wine EXPECT_REF(doctype, 2);
7211
7212 {
7213 V_VT(&value) = VT_EMPTY;
7214 hr = IXMLDOMDocumentType_get_nodeTypedValue(doctype, &value);
7215 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
7216 ok(V_VT(&value) == VT_NULL, "got %d\n", V_VT(&value));
7217 }
7218
7219 hr = IXMLDOMDocument_get_doctype(doc2, &doctype2);
7220 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7221 ok(doctype != doctype2, "got %p, was %p\n", doctype2, doctype);
7222
7223 IXMLDOMDocumentType_Release(doctype2);
7224 IXMLDOMDocumentType_Release(doctype);
7225
7226 IXMLDOMDocument_Release(doc2);
7227
7228 while (entry->name)
7229 {
7230 hr = IXMLDOMDocument_selectSingleNode(doc, _bstr_(entry->name), &node);
7231 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7232
7233 hr = IXMLDOMNode_get_nodeTypedValue(node, &value);
7234 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7235 ok(V_VT(&value) == entry->type, "incorrect type, expected %d, got %d\n", entry->type, V_VT(&value));
7236
7237 if (entry->type == (VT_ARRAY|VT_UI1))
7238 {
7239 ok(V_ARRAY(&value)->rgsabound[0].cElements == strlen(entry->value),
7240 "incorrect array size %ld\n", V_ARRAY(&value)->rgsabound[0].cElements);
7241 }
7242
7243 if (entry->type != VT_BSTR)
7244 {
7245 if (entry->type == VT_DATE ||
7246 entry->type == VT_R8 ||
7247 entry->type == VT_CY)
7248 {
7249 if (entry->type == VT_DATE)
7250 {
7252 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7253 }
7257 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7258 }
7259 else
7260 {
7262 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7263 }
7264
7265 /* for byte array from VT_ARRAY|VT_UI1 it's not a WCHAR buffer */
7266 if (entry->type == (VT_ARRAY|VT_UI1))
7267 {
7268 ok(!memcmp( V_BSTR(&value), entry->value, strlen(entry->value)),
7269 "expected %s\n", entry->value);
7270 }
7271 else
7272 ok(lstrcmpW( V_BSTR(&value), _bstr_(entry->value)) == 0,
7273 "expected %s, got %s\n", entry->value, wine_dbgstr_w(V_BSTR(&value)));
7274 }
7275 else
7276 {
7277 BSTR bstr, expected;
7278
7279 expected = entry->no_type ? _bstr_(strip_spaces(entry->value)) : _bstr_(entry->value);
7280 ok(!wcscmp( V_BSTR(&value), expected ), "expected %s, got %s\n",
7282 if (entry->no_type)
7283 {
7284 VariantClear( &value );
7285
7286 hr = IXMLDOMDocument_get_preserveWhiteSpace(doc, &b);
7287 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7288 ok(b == VARIANT_FALSE, "got %d\n", b);
7289
7290 hr = IXMLDOMNode_get_text(node, &bstr);
7291 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7292 ok(!wcscmp( bstr, expected ), "expected %s, got %s\n",
7294 SysFreeString(bstr);
7295
7296 hr = IXMLDOMDocument_put_preserveWhiteSpace(doc, VARIANT_TRUE);
7297 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7298
7299 expected = _bstr_(entry->value);
7300 hr = IXMLDOMNode_get_text(node, &bstr);
7301 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7302 ok(!wcscmp( bstr, expected ), "expected %s, got %s\n",
7304 SysFreeString(bstr);
7305
7306 hr = IXMLDOMNode_get_nodeTypedValue(node, &value);
7307 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7308 ok(V_VT(&value) == entry->type, "incorrect type, expected %d, got %d\n", entry->type, V_VT(&value));
7309 ok(!wcscmp( V_BSTR(&value), expected ), "expected %s, got %s\n",
7311
7312 hr = IXMLDOMDocument_put_preserveWhiteSpace(doc, VARIANT_FALSE);
7313 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7314 }
7315 }
7316
7317 VariantClear( &value );
7318 IXMLDOMNode_Release(node);
7319
7320 entry++;
7321 }
7322
7323 IXMLDOMDocument_Release(doc);
7324 free_bstrs();
7325}
7326
7328{
7329 IXMLDOMDocument *doc;
7330 IXMLDOMDocument *xsl;
7331 IXMLDOMNode *pNode;
7332 VARIANT_BOOL bSucc;
7333 HRESULT hr;
7334 HANDLE file;
7335 DWORD dwWritten;
7336 char lpPathBuffer[MAX_PATH];
7337 int i;
7338
7339 /* Create a Temp File. */
7340 GetTempPathA(MAX_PATH, lpPathBuffer);
7341 strcat(lpPathBuffer, "customers.xml" );
7342
7344 ok(file != INVALID_HANDLE_VALUE, "Could not create file: %lu\n", GetLastError());
7346 return;
7347
7350
7351 /* Correct path to not include an escape character. */
7352 for(i=0; i < strlen(lpPathBuffer); i++)
7353 {
7354 if(lpPathBuffer[i] == '\\')
7355 lpPathBuffer[i] = '/';
7356 }
7357
7358 doc = create_document(&IID_IXMLDOMDocument);
7359 xsl = create_document(&IID_IXMLDOMDocument);
7360
7361 hr = IXMLDOMDocument_loadXML(doc, _bstr_(szTypeValueXML), &bSucc);
7362 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7363 ok(bSucc == VARIANT_TRUE, "Expected VARIANT_TRUE got VARIANT_FALSE\n");
7364 if(bSucc == VARIANT_TRUE)
7365 {
7366 BSTR sXSL;
7369 BSTR sFileName = _bstr_(lpPathBuffer);
7370 int nLength = lstrlenW(sPart1) + lstrlenW(sPart2) + lstrlenW(sFileName) + 1;
7371
7373 lstrcpyW(sXSL, sPart1);
7374 lstrcatW(sXSL, sFileName);
7375 lstrcatW(sXSL, sPart2);
7376
7377 hr = IXMLDOMDocument_loadXML(xsl, sXSL, &bSucc);
7378 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7379 ok(bSucc == VARIANT_TRUE, "Expected VARIANT_TRUE got VARIANT_FALSE\n");
7380 if(bSucc == VARIANT_TRUE)
7381 {
7382 BSTR sResult;
7383
7384 hr = IXMLDOMDocument_QueryInterface(xsl, &IID_IXMLDOMNode, (void**)&pNode );
7385 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7386#ifdef __REACTOS__ // RTC failure in libxslt!xmlXPathCompOpEval
7387 if (!is_reactos())
7388#endif
7389 if(hr == S_OK)
7390 {
7391 /* This will load the temp file via the XSL */
7392 hr = IXMLDOMDocument_transformNode(doc, pNode, &sResult);
7393 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7394 if(hr == S_OK)
7395 {
7396 ok( compareIgnoreReturns( sResult, _bstr_(szBasicTransformOutput)), "Stylesheet output not correct\n");
7397 SysFreeString(sResult);
7398 }
7399
7400 IXMLDOMNode_Release(pNode);
7401 }
7402 }
7403
7404 SysFreeString(sXSL);
7405 }
7406
7407 IXMLDOMDocument_Release(doc);
7408 IXMLDOMDocument_Release(xsl);
7409
7410 DeleteFileA(lpPathBuffer);
7411 free_bstrs();
7412}
7413
7414static void test_put_nodeValue(void)
7415{
7416 IXMLDOMDocument *doc;
7418 IXMLDOMEntityReference *entityref;
7421 HRESULT hr;
7422 VARIANT data, type;
7423
7424 doc = create_document(&IID_IXMLDOMDocument);
7425
7426 /* test for unsupported types */
7427 /* NODE_DOCUMENT */
7428 hr = IXMLDOMDocument_QueryInterface(doc, &IID_IXMLDOMNode, (void**)&node);
7429 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7430 V_VT(&data) = VT_BSTR;
7431 V_BSTR(&data) = _bstr_("one two three");
7432 hr = IXMLDOMNode_put_nodeValue(node, data);
7433 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr );
7434 IXMLDOMNode_Release(node);
7435
7436 /* NODE_DOCUMENT_FRAGMENT */
7437 V_VT(&type) = VT_I1;
7439 hr = IXMLDOMDocument_createNode(doc, type, _bstr_("test"), NULL, &node);
7440 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7441 V_VT(&data) = VT_BSTR;
7442 V_BSTR(&data) = _bstr_("one two three");
7443 hr = IXMLDOMNode_put_nodeValue(node, data);
7444 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr );
7445 IXMLDOMNode_Release(node);
7446
7447 /* NODE_ELEMENT */
7448 V_VT(&type) = VT_I1;
7450 hr = IXMLDOMDocument_createNode(doc, type, _bstr_("test"), NULL, &node);
7451 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7452 V_VT(&data) = VT_BSTR;
7453 V_BSTR(&data) = _bstr_("one two three");
7454 hr = IXMLDOMNode_put_nodeValue(node, data);
7455 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr );
7456 IXMLDOMNode_Release(node);
7457
7458 /* NODE_ENTITY_REFERENCE */
7459 hr = IXMLDOMDocument_createEntityReference(doc, _bstr_("ref"), &entityref);
7460 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7461
7462 V_VT(&data) = VT_BSTR;
7463 V_BSTR(&data) = _bstr_("one two three");
7464 hr = IXMLDOMEntityReference_put_nodeValue(entityref, data);
7465 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr );
7466
7467 hr = IXMLDOMEntityReference_QueryInterface(entityref, &IID_IXMLDOMNode, (void**)&node);
7468 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7469 V_VT(&data) = VT_BSTR;
7470 V_BSTR(&data) = _bstr_("one two three");
7471 hr = IXMLDOMNode_put_nodeValue(node, data);
7472 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr );
7473 IXMLDOMNode_Release(node);
7474 IXMLDOMEntityReference_Release(entityref);
7475
7476 /* supported types */
7477 hr = IXMLDOMDocument_createTextNode(doc, _bstr_(""), &text);
7478 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7479 V_VT(&data) = VT_BSTR;
7480 V_BSTR(&data) = _bstr_("Jeeves & Wooster");
7481 hr = IXMLDOMText_put_nodeValue(text, data);
7482 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7483 IXMLDOMText_Release(text);
7484
7485 hr = IXMLDOMDocument_createAttribute(doc, _bstr_("attr"), &attr);
7486 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7487 V_VT(&data) = VT_BSTR;
7488 V_BSTR(&data) = _bstr_("Jeeves & Wooster");
7489 hr = IXMLDOMAttribute_put_nodeValue(attr, data);
7490 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7491 hr = IXMLDOMAttribute_get_nodeValue(attr, &data);
7492 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7493 ok(!lstrcmpW(V_BSTR(&data), L"Jeeves & Wooster"), "got %s\n", wine_dbgstr_w(V_BSTR(&data)));
7495 IXMLDOMAttribute_Release(attr);
7496
7497 free_bstrs();
7498
7499 IXMLDOMDocument_Release(doc);
7500}
7501
7502static void test_IObjectSafety(void)
7503{
7504 IXMLDOMDocument *doc;
7505 IObjectSafety *safety;
7506 HRESULT hr;
7507
7508 doc = create_document(&IID_IXMLDOMDocument);
7509
7510 hr = IXMLDOMDocument_QueryInterface(doc, &IID_IObjectSafety, (void**)&safety);
7511 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7512
7514
7515 IObjectSafety_Release(safety);
7516 IXMLDOMDocument_Release(doc);
7517
7518 hr = CoCreateInstance(&CLSID_XMLHTTPRequest, NULL, CLSCTX_INPROC_SERVER,
7519 &IID_IObjectSafety, (void**)&safety);
7520 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7521
7523
7524 IObjectSafety_Release(safety);
7525
7526}
7527
7528typedef struct _property_test_t {
7529 const GUID *guid;
7530 const char *clsid;
7531 const char *property;
7532 const char *value;
7534
7536 { &CLSID_DOMDocument, "CLSID_DOMDocument" , "SelectionLanguage", "XSLPattern" },
7537 { &CLSID_DOMDocument2, "CLSID_DOMDocument2" , "SelectionLanguage", "XSLPattern" },
7538 { &CLSID_DOMDocument30, "CLSID_DOMDocument30", "SelectionLanguage", "XSLPattern" },
7539 { &CLSID_DOMDocument40, "CLSID_DOMDocument40", "SelectionLanguage", "XPath" },
7540 { &CLSID_DOMDocument60, "CLSID_DOMDocument60", "SelectionLanguage", "XPath" },
7541 { 0 }
7542};
7543
7545{
7547
7548 while (entry->guid)
7549 {
7550 IXMLDOMDocument2 *doc;
7551 VARIANT var;
7552 HRESULT hr;
7553
7554 if (!is_clsid_supported(entry->guid, &IID_IXMLDOMDocument2))
7555 {
7556 entry++;
7557 continue;
7558 }
7559
7560 hr = CoCreateInstance(entry->guid, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (void**)&doc);
7561 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7562
7563 hr = IXMLDOMDocument2_getProperty(doc, _bstr_(entry->property), &var);
7564 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7565 ok(lstrcmpW(V_BSTR(&var), _bstr_(entry->value)) == 0, "expected %s, for %s\n",
7566 entry->value, entry->clsid);
7567 VariantClear(&var);
7568
7569 IXMLDOMDocument2_Release(doc);
7570
7571 entry++;
7572 }
7573}
7574
7575typedef struct {
7576 const char *query;
7577 const char *list;
7580
7582 { "root//elem[0]", "E1.E2.D1" },
7583 { "root//elem[index()=1]", "E2.E2.D1" },
7584 { "root//elem[index() $eq$ 1]", "E2.E2.D1" },
7585 { "root//elem[end()]", "E4.E2.D1" },
7586 { "root//elem[$not$ end()]", "E1.E2.D1 E2.E2.D1 E3.E2.D1" },
7587 { "root//elem[index() != 0]", "E2.E2.D1 E3.E2.D1 E4.E2.D1" },
7588 { "root//elem[index() $ne$ 0]", "E2.E2.D1 E3.E2.D1 E4.E2.D1" },
7589 { "root//elem[index() < 2]", "E1.E2.D1 E2.E2.D1" },
7590 { "root//elem[index() $lt$ 2]", "E1.E2.D1 E2.E2.D1" },
7591 { "root//elem[index() <= 1]", "E1.E2.D1 E2.E2.D1" },
7592 { "root//elem[index() $le$ 1]", "E1.E2.D1 E2.E2.D1" },
7593 { "root//elem[index() > 1]", "E3.E2.D1 E4.E2.D1" },
7594 { "root//elem[index() $gt$ 1]", "E3.E2.D1 E4.E2.D1" },
7595 { "root//elem[index() >= 2]", "E3.E2.D1 E4.E2.D1" },
7596 { "root//elem[index() $ge$ 2]", "E3.E2.D1 E4.E2.D1" },
7597 { "root//elem[a $ieq$ 'a2 field']", "E2.E2.D1" },
7598 { "root//elem[a $ine$ 'a2 field']", "E1.E2.D1 E3.E2.D1 E4.E2.D1" },
7599 { "root//elem[a $ilt$ 'a3 field']", "E1.E2.D1 E2.E2.D1" },
7600 { "root//elem[a $ile$ 'a2 field']", "E1.E2.D1 E2.E2.D1" },
7601 { "root//elem[a $igt$ 'a2 field']", "E3.E2.D1 E4.E2.D1" },
7602 { "root//elem[a $ige$ 'a3 field']", "E3.E2.D1 E4.E2.D1" },
7603 { "root//elem[$any$ *='B2 field']", "E2.E2.D1" },
7604 { "root//elem[$all$ *!='B2 field']", "E1.E2.D1 E3.E2.D1 E4.E2.D1" },
7605 { "root//elem[index()=0 or end()]", "E1.E2.D1 E4.E2.D1" },
7606 { "root//elem[index()=0 $or$ end()]", "E1.E2.D1 E4.E2.D1" },
7607 { "root//elem[index()=0 || end()]", "E1.E2.D1 E4.E2.D1" },
7608 { "root//elem[index()>0 and $not$ end()]", "E2.E2.D1 E3.E2.D1" },
7609 { "root//elem[index()>0 $and$ $not$ end()]", "E2.E2.D1 E3.E2.D1" },
7610 { "root//elem[index()>0 && $not$ end()]", "E2.E2.D1 E3.E2.D1" },
7611 { "root/elem[0]", "E1.E2.D1" },
7612 { "root/elem[index()=1]", "E2.E2.D1" },
7613 { "root/elem[index() $eq$ 1]", "E2.E2.D1" },
7614 { "root/elem[end()]", "E4.E2.D1" },
7615 { "root/elem[$not$ end()]", "E1.E2.D1 E2.E2.D1 E3.E2.D1" },
7616 { "root/elem[index() != 0]", "E2.E2.D1 E3.E2.D1 E4.E2.D1" },
7617 { "root/elem[index() $ne$ 0]", "E2.E2.D1 E3.E2.D1 E4.E2.D1" },
7618 { "root/elem[index() < 2]", "E1.E2.D1 E2.E2.D1" },
7619 { "root/elem[index() $lt$ 2]", "E1.E2.D1 E2.E2.D1" },
7620 { "root/elem[index() <= 1]", "E1.E2.D1 E2.E2.D1" },
7621 { "root/elem[index() $le$ 1]", "E1.E2.D1 E2.E2.D1" },
7622 { "root/elem[index() > 1]", "E3.E2.D1 E4.E2.D1" },
7623 { "root/elem[index() $gt$ 1]", "E3.E2.D1 E4.E2.D1" },
7624 { "root/elem[index() >= 2]", "E3.E2.D1 E4.E2.D1" },
7625 { "root/elem[index() $ge$ 2]", "E3.E2.D1 E4.E2.D1" },
7626 { "root/elem[a $ieq$ 'a2 field']", "E2.E2.D1" },
7627 { "root/elem[a $ine$ 'a2 field']", "E1.E2.D1 E3.E2.D1 E4.E2.D1" },
7628 { "root/elem[a $ilt$ 'a3 field']", "E1.E2.D1 E2.E2.D1" },
7629 { "root/elem[a $ile$ 'a2 field']", "E1.E2.D1 E2.E2.D1" },
7630 { "root/elem[a $igt$ 'a2 field']", "E3.E2.D1 E4.E2.D1" },
7631 { "root/elem[a $ige$ 'a3 field']", "E3.E2.D1 E4.E2.D1" },
7632 { "root/elem[$any$ *='B2 field']", "E2.E2.D1" },
7633 { "root/elem[$all$ *!='B2 field']", "E1.E2.D1 E3.E2.D1 E4.E2.D1" },
7634 { "root/elem[index()=0 or end()]", "E1.E2.D1 E4.E2.D1" },
7635 { "root/elem[index()=0 $or$ end()]", "E1.E2.D1 E4.E2.D1" },
7636 { "root/elem[index()=0 || end()]", "E1.E2.D1 E4.E2.D1" },
7637 { "root/elem[index()>0 and $not$ end()]", "E2.E2.D1 E3.E2.D1" },
7638 { "root/elem[index()>0 $and$ $not$ end()]", "E2.E2.D1 E3.E2.D1" },
7639 { "root/elem[index()>0 && $not$ end()]", "E2.E2.D1 E3.E2.D1" },
7640 { "root/elem[d]", "E1.E2.D1 E2.E2.D1 E4.E2.D1" },
7641 { "root/elem[@*]", "E2.E2.D1 E3.E2.D1", TRUE },
7642 { NULL }
7643};
7644
7646 /* prefixes don't need to be registered, you may use them as they are in the doc */
7647 { "//bar:x", "E6.E1.E5.E1.E2.D1 E6.E2.E5.E1.E2.D1" },
7648 /* prefixes must be explicitly specified in the name */
7649 { "//foo:elem", "" },
7650 { "//foo:c", "E3.E4.E2.D1" },
7651 { NULL }
7652};
7653
7655 { "attribute()", "" },
7656 { "attribute('depth')", "" },
7657 { "root/attribute('depth')", "A'depth'.E3.D1" },
7658 { "//x/attribute()", "A'id'.E3.E3.D1 A'depth'.E3.E3.D1" },
7659 { "//x//attribute(id)", NULL },
7660 { "//x//attribute('id')", "A'id'.E3.E3.D1 A'id'.E4.E3.E3.D1 A'id'.E5.E3.E3.D1 A'id'.E6.E3.E3.D1" },
7661 { "comment()", "C2.D1" },
7662 { "//comment()", "C2.D1 C1.E3.D1 C2.E3.E3.D1 C2.E4.E3.D1" },
7663 { "element()", "E3.D1" },
7664 { "root/y/element()", "E4.E4.E3.D1 E5.E4.E3.D1 E6.E4.E3.D1" },
7665 { "//element(a)", NULL },
7666 { "//element('a')", "E4.E3.E3.D1 E4.E4.E3.D1" },
7667 { "node()", "P1.D1 C2.D1 E3.D1" },
7668 { "//x/node()", "P1.E3.E3.D1 C2.E3.E3.D1 T3.E3.E3.D1 E4.E3.E3.D1 E5.E3.E3.D1 E6.E3.E3.D1" },
7669 { "//x/node()[nodeType()=1]", "E4.E3.E3.D1 E5.E3.E3.D1 E6.E3.E3.D1" },
7670 { "//x/node()[nodeType()=3]", "T3.E3.E3.D1" },
7671 { "//x/node()[nodeType()=7]", "P1.E3.E3.D1" },
7672 { "//x/node()[nodeType()=8]", "C2.E3.E3.D1" },
7673 { "pi()", "P1.D1" },
7674 { "//y/pi()", "P1.E4.E3.D1" },
7675 { "root/textnode()", "T2.E3.D1" },
7676 { "root/element()/textnode()", "T3.E3.E3.D1 T3.E4.E3.D1" },
7677 { NULL }
7678};
7679
7680static void test_XSLPattern(void)
7681{
7683 IXMLDOMDocument2 *doc;
7686 HRESULT hr;
7687 LONG len;
7688
7689 doc = create_document(&IID_IXMLDOMDocument2);
7690
7691 b = VARIANT_FALSE;
7692 hr = IXMLDOMDocument2_loadXML(doc, _bstr_(szExampleXML), &b);
7693 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7694 ok(b == VARIANT_TRUE, "failed to load XML string\n");
7695
7696 /* switch to XSLPattern */
7697 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionLanguage"), _variantbstr_("XSLPattern"));
7698 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7699
7700 /* XPath doesn't select elements with non-null default namespace with unqualified selectors, XSLPattern does */
7701 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("//elem/c"), &list);
7702 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7703
7704 len = 0;
7705 hr = IXMLDOMNodeList_get_length(list, &len);
7706 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7707 /* should select <elem><c> and <elem xmlns='...'><c> but not <elem><foo:c> */
7708 ok(len == 3, "expected 3 entries in list, got %ld\n", len);
7709 IXMLDOMNodeList_Release(list);
7710
7711 while (ptr->query)
7712 {
7713 list = NULL;
7714 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_(ptr->query), &list);
7715 ok(hr == S_OK, "query=%s, failed with %#lx\n", ptr->query, hr);
7716 len = 0;
7717 hr = IXMLDOMNodeList_get_length(list, &len);
7718 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7719 ok(len != 0, "query=%s, empty list\n", ptr->query);
7720 if (len) {
7721 if (ptr->todo) {
7722 char *str = list_to_string(list);
7723 todo_wine
7724 ok(!strcmp(str, ptr->list), "Invalid node list: %s, expected %s\n", str, ptr->list);
7725 IXMLDOMNodeList_Release(list);
7726 }
7727 else
7729 }
7730
7731 ptr++;
7732 }
7733
7734 /* namespace handling */
7735 /* no registered namespaces */
7736 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionNamespaces"), _variantbstr_(""));
7737 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7738
7740 while (ptr->query)
7741 {
7742 list = NULL;
7743 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_(ptr->query), &list);
7744 ok(hr == S_OK, "query=%s, failed with %#lx.\n", ptr->query, hr);
7745
7746 if (*ptr->list)
7747 {
7748 len = 0;
7749 hr = IXMLDOMNodeList_get_length(list, &len);
7750 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7751 ok(len != 0, "query=%s, empty list\n", ptr->query);
7752 }
7753 else
7754 {
7755 len = 1;
7756 hr = IXMLDOMNodeList_get_length(list, &len);
7757 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7758 ok(len == 0, "query=%s, empty list\n", ptr->query);
7759 }
7760 if (len)
7762
7763 ptr++;
7764 }
7765
7766 /* explicitly register prefix foo */
7767 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionNamespaces"),
7768 _variantbstr_("xmlns:foo='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'"));
7769 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7770
7771 /* now we get the same behavior as XPath */
7772 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("//foo:c"), &list);
7773 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7774 len = 0;
7775 hr = IXMLDOMNodeList_get_length(list, &len);
7776 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7777 ok(len != 0, "expected filled list\n");
7778 if (len)
7779 expect_list_and_release(list, "E3.E3.E2.D1 E3.E4.E2.D1");
7780
7781 /* set prefix foo to some nonexistent namespace */
7782 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionNamespaces"), _variantbstr_("xmlns:foo='urn:nonexistent-foo'"));
7783 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7784
7785 /* the registered prefix takes precedence */
7786 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("//foo:c"), &list);
7787 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7788 len = 0;
7789 hr = IXMLDOMNodeList_get_length(list, &len);
7790 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7791 ok(len == 0, "expected empty list\n");
7792 IXMLDOMNodeList_Release(list);
7793
7794 IXMLDOMDocument2_Release(doc);
7795
7796 doc = create_document(&IID_IXMLDOMDocument2);
7797
7798 hr = IXMLDOMDocument2_loadXML(doc, _bstr_(szNodeTypesXML), &b);
7799 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7800 ok(b == VARIANT_TRUE, "failed to load XML string\n");
7801
7803 while (ptr->query)
7804 {
7805 list = NULL;
7806 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_(ptr->query), &list);
7807 if (ptr->list)
7808 {
7809 ok(hr == S_OK, "query=%s, failed with %#lx.\n", ptr->query, hr);
7810 len = 0;
7811 hr = IXMLDOMNodeList_get_length(list, &len);
7812 ok(hr == S_OK, "Failed to get list length, hr %#lx.\n", hr);
7813 if (*ptr->list)
7814 {
7815 ok(len != 0, "query=%s, empty list\n", ptr->query);
7816 if (len)
7818 }
7819 else
7820 ok(len == 0, "query=%s, filled list\n", ptr->query);
7821 }
7822 else
7823 ok(hr == E_FAIL, "query=%s, failed with %#lx.\n", ptr->query, hr);
7824
7825 ptr++;
7826 }
7827
7828 IXMLDOMDocument2_Release(doc);
7829 free_bstrs();
7830}
7831
7832static void test_splitText(void)
7833{
7834 IXMLDOMCDATASection *cdata;
7836 IXMLDOMDocument *doc;
7837 IXMLDOMText *text, *text2;
7839 VARIANT var;
7841 LONG length;
7842 HRESULT hr;
7843
7844 doc = create_document(&IID_IXMLDOMDocument);
7845
7846 hr = IXMLDOMDocument_loadXML(doc, _bstr_("<root></root>"), &success);
7847 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7848
7849 hr = IXMLDOMDocument_get_documentElement(doc, &root);
7850 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7851
7852 hr = IXMLDOMDocument_createCDATASection(doc, _bstr_("beautiful plumage"), &cdata);
7853 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7854
7855 V_VT(&var) = VT_EMPTY;
7856 hr = IXMLDOMElement_appendChild(root, (IXMLDOMNode*)cdata, NULL);
7857 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7858
7859 length = 0;
7860 hr = IXMLDOMCDATASection_get_length(cdata, &length);
7861 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7862 ok(length > 0, "got %ld\n", length);
7863
7864 hr = IXMLDOMCDATASection_splitText(cdata, 0, NULL);
7865 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
7866
7867 text = (void*)0xdeadbeef;
7868 /* negative offset */
7869 hr = IXMLDOMCDATASection_splitText(cdata, -1, &text);
7870 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
7871 ok(text == (void*)0xdeadbeef, "got %p\n", text);
7872
7873 text = (void*)0xdeadbeef;
7874 /* offset outside data */
7875 hr = IXMLDOMCDATASection_splitText(cdata, length + 1, &text);
7876 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
7877 ok(text == 0, "got %p\n", text);
7878
7879 text = (void*)0xdeadbeef;
7880 /* offset outside data */
7881 hr = IXMLDOMCDATASection_splitText(cdata, length, &text);
7882 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
7883 ok(text == 0, "got %p\n", text);
7884
7885 /* no empty node created */
7886 node = (void*)0xdeadbeef;
7887 hr = IXMLDOMCDATASection_get_nextSibling(cdata, &node);
7888 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
7889 ok(node == 0, "got %p\n", text);
7890
7891 hr = IXMLDOMCDATASection_splitText(cdata, 10, &text);
7892 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7893
7894 length = 0;
7895 hr = IXMLDOMText_get_length(text, &length);
7896 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7897 ok(length == 7, "got %ld\n", length);
7898
7899 hr = IXMLDOMCDATASection_get_nextSibling(cdata, &node);
7900 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7901 IXMLDOMNode_Release(node);
7902
7903 /* split new text node */
7904 hr = IXMLDOMText_get_length(text, &length);
7905 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7906
7907 node = (void*)0xdeadbeef;
7908 hr = IXMLDOMText_get_nextSibling(text, &node);
7909 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
7910 ok(node == 0, "got %p\n", text);
7911
7912 hr = IXMLDOMText_splitText(text, 0, NULL);
7913 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
7914
7915 text2 = (void*)0xdeadbeef;
7916 /* negative offset */
7917 hr = IXMLDOMText_splitText(text, -1, &text2);
7918 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
7919 ok(text2 == (void*)0xdeadbeef, "got %p\n", text2);
7920
7921 text2 = (void*)0xdeadbeef;
7922 /* offset outside data */
7923 hr = IXMLDOMText_splitText(text, length + 1, &text2);
7924 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
7925 ok(text2 == 0, "got %p\n", text2);
7926
7927 text2 = (void*)0xdeadbeef;
7928 /* offset outside data */
7929 hr = IXMLDOMText_splitText(text, length, &text2);
7930 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
7931 ok(text2 == 0, "got %p\n", text);
7932
7933 text2 = 0;
7934 hr = IXMLDOMText_splitText(text, 4, &text2);
7935 todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7936 if (text2) IXMLDOMText_Release(text2);
7937
7938 node = 0;
7939 hr = IXMLDOMText_get_nextSibling(text, &node);
7940 todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7941 if (node) IXMLDOMNode_Release(node);
7942
7943 IXMLDOMText_Release(text);
7944 IXMLDOMElement_Release(root);
7945 IXMLDOMCDATASection_Release(cdata);
7946 free_bstrs();
7947}
7948
7949typedef struct {
7950 const char *name;
7951 const char *uri;
7953} ns_item_t;
7954
7955/* default_ns_doc used */
7957 { "xml:lang", NULL, S_FALSE },
7958 { "xml:lang", "http://www.w3.org/XML/1998/namespace", S_FALSE },
7959 { "lang", "http://www.w3.org/XML/1998/namespace", S_OK },
7960 { "ns:b", NULL, S_FALSE },
7961 { "ns:b", "nshref", S_FALSE },
7962 { "b", "nshref", S_OK },
7963 { "d", NULL, S_OK },
7964 { NULL }
7965};
7966
7967static const ns_item_t named_item_tests[] = {
7968 { "xml:lang", NULL, S_OK },
7969 { "lang", NULL, S_FALSE },
7970 { "ns:b", NULL, S_OK },
7971 { "b", NULL, S_FALSE },
7972 { "d", NULL, S_OK },
7973 { NULL }
7974};
7975
7976static void test_getQualifiedItem(void)
7977{
7978 IXMLDOMNode *pr_node, *node;
7979 IXMLDOMNodeList *root_list;
7982 const ns_item_t* ptr;
7983 IXMLDOMDocument *doc;
7985 HRESULT hr;
7986 LONG len;
7987
7988 doc = create_document(&IID_IXMLDOMDocument);
7989
7990 hr = IXMLDOMDocument_loadXML( doc, _bstr_(complete4A), &b );
7991 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7992 ok( b == VARIANT_TRUE, "failed to load XML string\n");
7993
7994 hr = IXMLDOMDocument_get_documentElement(doc, &element);
7995 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7996
7997 hr = IXMLDOMElement_get_childNodes(element, &root_list);
7998 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7999
8000 hr = IXMLDOMNodeList_get_item(root_list, 1, &pr_node);
8001 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8002 IXMLDOMNodeList_Release(root_list);
8003
8004 hr = IXMLDOMNode_get_attributes(pr_node, &map);
8005 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8006 IXMLDOMNode_Release(pr_node);
8007
8008 len = 0;
8009 hr = IXMLDOMNamedNodeMap_get_length(map, &len);
8010 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8011 ok( len == 3, "length %ld\n", len);
8012
8013 hr = IXMLDOMNamedNodeMap_getQualifiedItem(map, NULL, NULL, NULL);
8014 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8015
8016 node = (void*)0xdeadbeef;
8017 hr = IXMLDOMNamedNodeMap_getQualifiedItem(map, NULL, NULL, &node);
8018 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8019 ok( node == (void*)0xdeadbeef, "got %p\n", node);
8020
8021 hr = IXMLDOMNamedNodeMap_getQualifiedItem(map, _bstr_("id"), NULL, NULL);
8022 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8023
8024 hr = IXMLDOMNamedNodeMap_getQualifiedItem(map, _bstr_("id"), NULL, &node);
8025 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8026
8027 IXMLDOMNode_Release(node);
8028 IXMLDOMNamedNodeMap_Release(map);
8029 IXMLDOMElement_Release(element);
8030
8031 hr = IXMLDOMDocument_loadXML(doc, _bstr_(default_ns_doc), &b);
8032 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8033
8034 hr = IXMLDOMDocument_selectSingleNode(doc, _bstr_("a"), &node);
8035 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8036
8037 hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMElement, (void**)&element);
8038 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8039 IXMLDOMNode_Release(node);
8040
8041 hr = IXMLDOMElement_get_attributes(element, &map);
8042 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8043
8045 while (ptr->name)
8046 {
8047 node = (void*)0xdeadbeef;
8048 hr = IXMLDOMNamedNodeMap_getQualifiedItem(map, _bstr_(ptr->name), _bstr_(ptr->uri), &node);
8049 ok(hr == ptr->hr, "%s, %s: unexpected hr %#lx, expected %#lx.\n", ptr->name, ptr->uri, hr, ptr->hr);
8050 if (hr == S_OK)
8051 IXMLDOMNode_Release(node);
8052 else
8053 ok(node == NULL, "%s, %s: got %p\n", ptr->name, ptr->uri, node);
8054 ptr++;
8055 }
8056
8058 while (ptr->name)
8059 {
8060 node = (void*)0xdeadbeef;
8061 hr = IXMLDOMNamedNodeMap_getNamedItem(map, _bstr_(ptr->name), &node);
8062 ok(hr == ptr->hr, "%s: unexpected hr %#lx, expected %#lx.\n", ptr->name, hr, ptr->hr);
8063 if (hr == S_OK)
8064 IXMLDOMNode_Release(node);
8065 else
8066 ok(node == NULL, "%s: got %p\n", ptr->name, node);
8067 ptr++;
8068 }
8069
8070 IXMLDOMNamedNodeMap_Release(map);
8071
8072 IXMLDOMElement_Release(element);
8073 IXMLDOMDocument_Release(doc);
8074 free_bstrs();
8075}
8076
8078{
8079 IXMLDOMDocument *doc;
8081 IXMLDOMNode *pr_node, *node;
8082 IXMLDOMNodeList *root_list;
8085 LONG len;
8086 HRESULT hr;
8087
8088 doc = create_document(&IID_IXMLDOMDocument);
8089
8090 hr = IXMLDOMDocument_loadXML( doc, _bstr_(complete4A), &b );
8091 ok( hr == S_OK, "loadXML failed\n");
8092 ok( b == VARIANT_TRUE, "failed to load XML string\n");
8093
8094 hr = IXMLDOMDocument_get_documentElement(doc, &element);
8095 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8096
8097 hr = IXMLDOMElement_get_childNodes(element, &root_list);
8098 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8099
8100 hr = IXMLDOMNodeList_get_item(root_list, 1, &pr_node);
8101 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8102 IXMLDOMNodeList_Release(root_list);
8103
8104 hr = IXMLDOMNode_get_attributes(pr_node, &map);
8105 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8106 IXMLDOMNode_Release(pr_node);
8107
8108 hr = IXMLDOMNamedNodeMap_get_length(map, &len);
8109 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8110 ok( len == 3, "length %ld\n", len);
8111
8112 hr = IXMLDOMNamedNodeMap_removeQualifiedItem(map, NULL, NULL, NULL);
8113 ok( hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8114
8115 node = (void*)0xdeadbeef;
8116 hr = IXMLDOMNamedNodeMap_removeQualifiedItem(map, NULL, NULL, &node);
8117 ok( hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8118 ok( node == (void*)0xdeadbeef, "got %p\n", node);
8119
8120 /* out pointer is optional */
8121 hr = IXMLDOMNamedNodeMap_removeQualifiedItem(map, _bstr_("id"), NULL, NULL);
8122 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8123
8124 /* already removed */
8125 hr = IXMLDOMNamedNodeMap_removeQualifiedItem(map, _bstr_("id"), NULL, NULL);
8126 ok( hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
8127
8128 hr = IXMLDOMNamedNodeMap_removeQualifiedItem(map, _bstr_("vr"), NULL, &node);
8129 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8130 IXMLDOMNode_Release(node);
8131
8132 IXMLDOMNamedNodeMap_Release( map );
8133 IXMLDOMElement_Release( element );
8134 IXMLDOMDocument_Release( doc );
8135 free_bstrs();
8136}
8137
8138#define check_default_props(doc) _check_default_props(__LINE__, doc)
8139static inline void _check_default_props(int line, IXMLDOMDocument2* doc)
8140{
8142 VARIANT var;
8143 HRESULT hr;
8144
8145 VariantInit(&var);
8146 hr = IXMLDOMDocument2_getProperty(doc, _bstr_("SelectionLanguage"), &var);
8147 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8148 VariantClear(&var);
8149
8150 hr = IXMLDOMDocument2_getProperty(doc, _bstr_("SelectionNamespaces"), &var);
8151 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8152 ok_(__FILE__, line)(lstrcmpW(V_BSTR(&var), L"") == 0, "expected empty string\n");
8153 VariantClear(&var);
8154
8155 hr = IXMLDOMDocument2_get_preserveWhiteSpace(doc, &b);
8156 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8157 ok_(__FILE__, line)(b == VARIANT_FALSE, "expected FALSE\n");
8158
8159 hr = IXMLDOMDocument2_get_schemas(doc, &var);
8160 ok_(__FILE__, line)(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
8161 VariantClear(&var);
8162}
8163
8164#define check_set_props(doc) _check_set_props(__LINE__, doc)
8165static inline void _check_set_props(int line, IXMLDOMDocument2* doc)
8166{
8168 VARIANT var;
8169 HRESULT hr;
8170
8171 VariantInit(&var);
8172 hr = IXMLDOMDocument2_getProperty(doc, _bstr_("SelectionLanguage"), &var);
8173 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8174 ok_(__FILE__, line)(lstrcmpW(V_BSTR(&var), L"XPath") == 0, "expected XPath\n");
8175 VariantClear(&var);
8176
8177 hr = IXMLDOMDocument2_getProperty(doc, _bstr_("SelectionNamespaces"), &var);
8178 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8179 ok_(__FILE__, line)(lstrcmpW(V_BSTR(&var), L"xmlns:wi=\'www.winehq.org\'") == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&var)));
8180 VariantClear(&var);
8181
8182 hr = IXMLDOMDocument2_get_preserveWhiteSpace(doc, &b);
8183 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8184 ok_(__FILE__, line)(b == VARIANT_TRUE, "expected TRUE\n");
8185
8186 hr = IXMLDOMDocument2_get_schemas(doc, &var);
8187 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8188 ok_(__FILE__, line)(V_VT(&var) != VT_NULL, "expected pointer\n");
8189 VariantClear(&var);
8190}
8191
8192#define set_props(doc, cache) _set_props(__LINE__, doc, cache)
8193static inline void _set_props(int line, IXMLDOMDocument2* doc, IXMLDOMSchemaCollection* cache)
8194{
8195 VARIANT var;
8196 HRESULT hr;
8197
8198 VariantInit(&var);
8199 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionLanguage"), _variantbstr_("XPath"));
8200 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8201 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionNamespaces"), _variantbstr_("xmlns:wi=\'www.winehq.org\'"));
8202 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8203 hr = IXMLDOMDocument2_put_preserveWhiteSpace(doc, VARIANT_TRUE);
8204 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8205 V_VT(&var) = VT_DISPATCH;
8206 V_DISPATCH(&var) = NULL;
8207 hr = IXMLDOMSchemaCollection_QueryInterface(cache, &IID_IDispatch, (void**)&V_DISPATCH(&var));
8208 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8209 ok_(__FILE__, line)(V_DISPATCH(&var) != NULL, "expected pointer\n");
8210 hr = IXMLDOMDocument2_putref_schemas(doc, var);
8211 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8212 VariantClear(&var);
8213}
8214
8215#define unset_props(doc) _unset_props(__LINE__, doc)
8216static inline void _unset_props(int line, IXMLDOMDocument2* doc)
8217{
8218 VARIANT var;
8219 HRESULT hr;
8220
8221 VariantInit(&var);
8222 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionLanguage"), _variantbstr_("XSLPattern"));
8223 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8224 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionNamespaces"), _variantbstr_(""));
8225 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8226 hr = IXMLDOMDocument2_put_preserveWhiteSpace(doc, VARIANT_FALSE);
8227 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8228 V_VT(&var) = VT_NULL;
8229 hr = IXMLDOMDocument2_putref_schemas(doc, var);
8230 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8231 VariantClear(&var);
8232}
8233
8234static void test_get_ownerDocument(void)
8235{
8236 IXMLDOMDocument *doc1, *doc2, *doc3;
8237 IXMLDOMDocument2 *doc, *doc_owner;
8239 IXMLDOMSchemaCollection *cache;
8241 VARIANT var;
8243 IXMLDOMNodeList *node_list;
8245 LONG i, len;
8246 HRESULT hr;
8247 const CHAR nodeXML[] =
8248 "<root id='0'>"
8249 " <!-- comment node 0 -->"
8250 " text node 0"
8251 " <x attr='val'></x>"
8252 " <?foo value='PI for x'?>"
8253 " <![CDATA[ cdata ]]>"
8254 "</root>";
8255
8256 if (!is_clsid_supported(&CLSID_DOMDocument2, &IID_IXMLDOMDocument2)) return;
8257 if (!is_clsid_supported(&CLSID_XMLSchemaCache, &IID_IXMLDOMSchemaCollection)) return;
8258
8259 doc = create_document(&IID_IXMLDOMDocument2);
8260 cache = create_cache(&IID_IXMLDOMSchemaCollection);
8261
8262 VariantInit(&var);
8263
8264 hr = IXMLDOMDocument2_loadXML(doc, _bstr_(complete4A), &b);
8265 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8266 ok(b == VARIANT_TRUE, "failed to load XML string\n");
8267
8269
8270 /* set properties and check that new instances use them */
8271 set_props(doc, cache);
8272 check_set_props(doc);
8273
8274 hr = IXMLDOMDocument2_get_firstChild(doc, &node);
8275 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8276 hr = IXMLDOMNode_get_ownerDocument(node, &doc1);
8277 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8278
8279 /* new interface keeps props */
8280 hr = IXMLDOMDocument_QueryInterface(doc1, &IID_IXMLDOMDocument2, (void**)&doc_owner);
8281 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8282 ok( doc_owner != doc, "got %p, doc %p\n", doc_owner, doc);
8283 check_set_props(doc_owner);
8284 IXMLDOMDocument2_Release(doc_owner);
8285
8286 hr = IXMLDOMNode_get_ownerDocument(node, &doc2);
8287 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8288 IXMLDOMNode_Release(node);
8289
8290 ok(doc1 != doc2, "got %p, expected %p. original %p\n", doc2, doc1, doc);
8291
8292 /* reload */
8293 hr = IXMLDOMDocument2_loadXML(doc, _bstr_(complete4A), &b);
8294 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8295 ok(b == VARIANT_TRUE, "failed to load XML string\n");
8296
8297 /* properties retained even after reload */
8298 check_set_props(doc);
8299
8300 hr = IXMLDOMDocument2_get_firstChild(doc, &node);
8301 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8302 hr = IXMLDOMNode_get_ownerDocument(node, &doc3);
8303 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8304 IXMLDOMNode_Release(node);
8305
8306 hr = IXMLDOMDocument_QueryInterface(doc3, &IID_IXMLDOMDocument2, (void**)&doc_owner);
8307 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8308 ok(doc3 != doc1 && doc3 != doc2 && doc_owner != doc, "got %p, (%p, %p, %p)\n", doc3, doc, doc1, doc2);
8309 check_set_props(doc_owner);
8310
8311 /* changing properties for one instance changes them for all */
8312 unset_props(doc_owner);
8313 check_default_props(doc_owner);
8315
8316 /* NULL check */
8317 hr = IXMLDOMDocument_loadXML(doc1, _bstr_(nodeXML), &b);
8318 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8319 ok(b == VARIANT_TRUE, "failed to load XML string\n");
8320
8321 hr = IXMLDOMDocument_get_documentElement(doc1, &element);
8322 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8323
8324 hr = IXMLDOMElement_get_childNodes(element, &node_list);
8325 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8326
8327 hr = IXMLDOMNodeList_get_length(node_list, &len);
8328 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8329
8330 for(i = 0; i < len; i++) {
8331 hr = IXMLDOMNodeList_get_item(node_list, i, &node);
8332 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8333
8334 hr = IXMLDOMNode_get_ownerDocument(node, NULL);
8335 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8336
8337 IXMLDOMNode_Release(node);
8338 }
8339 IXMLDOMElement_Release(element);
8340
8341 /* Test Attribute Node */
8342 hr = IXMLDOMNodeList_get_item(node_list, 2, &node);
8343 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8344 hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMElement, (void**)&element);
8345 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8346 IXMLDOMNode_Release(node);
8347
8348 hr = IXMLDOMElement_getAttributeNode(element, _bstr_("attr"), &attr);
8349 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8350 ok(attr != NULL, "attr == NULL\n");
8351 IXMLDOMElement_Release(element);
8352 hr = IXMLDOMAttribute_get_ownerDocument(attr, NULL);
8353 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8354 IXMLDOMAttribute_Release(attr);
8355 IXMLDOMNodeList_Release(node_list);
8356
8357 IXMLDOMSchemaCollection_Release(cache);
8358 IXMLDOMDocument_Release(doc1);
8359 IXMLDOMDocument_Release(doc2);
8360 IXMLDOMDocument_Release(doc3);
8361 IXMLDOMDocument2_Release(doc);
8362#if defined(__REACTOS__) && defined(_M_AMD64)
8363 if (!is_reactos())
8364#endif
8365 IXMLDOMDocument2_Release(doc_owner);
8366 free_bstrs();
8367}
8368
8369static void test_setAttributeNode(void)
8370{
8371 IXMLDOMDocument *doc, *doc2;
8372 IXMLDOMElement *elem, *elem2;
8373 IXMLDOMAttribute *attr, *attr2, *ret_attr;
8375 HRESULT hr;
8376 VARIANT v;
8377 BSTR str;
8378 ULONG ref1, ref2;
8379
8380 doc = create_document(&IID_IXMLDOMDocument);
8381
8382 hr = IXMLDOMDocument_loadXML( doc, _bstr_(complete4A), &b );
8383 ok( hr == S_OK, "loadXML failed\n");
8384 ok( b == VARIANT_TRUE, "failed to load XML string\n");
8385
8386 hr = IXMLDOMDocument_get_documentElement(doc, &elem);
8387 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8388
8389 hr = IXMLDOMDocument_get_documentElement(doc, &elem2);
8390 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8391 ok( elem2 != elem, "got same instance\n");
8392
8393 ret_attr = (void*)0xdeadbeef;
8394 hr = IXMLDOMElement_setAttributeNode(elem, NULL, &ret_attr);
8395 ok( hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8396 ok( ret_attr == (void*)0xdeadbeef, "got %p\n", ret_attr);
8397
8398 hr = IXMLDOMDocument_createAttribute(doc, _bstr_("attr"), &attr);
8399 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8400
8401 ref1 = IXMLDOMElement_AddRef(elem);
8402 IXMLDOMElement_Release(elem);
8403
8404 ret_attr = (void*)0xdeadbeef;
8405 hr = IXMLDOMElement_setAttributeNode(elem, attr, &ret_attr);
8406 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8407 ok( ret_attr == NULL, "got %p\n", ret_attr);
8408
8409 /* no reference added */
8410 ref2 = IXMLDOMElement_AddRef(elem);
8411 IXMLDOMElement_Release(elem);
8412 ok(ref2 == ref1, "got %ld, expected %ld\n", ref2, ref1);
8413
8415 EXPECT_CHILDREN(elem2);
8416
8417 IXMLDOMElement_Release(elem2);
8418
8419 attr2 = NULL;
8420 hr = IXMLDOMElement_getAttributeNode(elem, _bstr_("attr"), &attr2);
8421 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8422 ok( attr2 != attr, "got same instance %p\n", attr2);
8423 IXMLDOMAttribute_Release(attr2);
8424
8425 /* try to add it another time */
8426 ret_attr = (void*)0xdeadbeef;
8427 hr = IXMLDOMElement_setAttributeNode(elem, attr, &ret_attr);
8428 ok( hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
8429 ok( ret_attr == (void*)0xdeadbeef, "got %p\n", ret_attr);
8430
8431 IXMLDOMElement_Release(elem);
8432
8433 /* initially used element is released, attribute still 'has' a container */
8434 hr = IXMLDOMDocument_get_documentElement(doc, &elem);
8435 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8436 ret_attr = (void*)0xdeadbeef;
8437 hr = IXMLDOMElement_setAttributeNode(elem, attr, &ret_attr);
8438 ok( hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
8439 ok( ret_attr == (void*)0xdeadbeef, "got %p\n", ret_attr);
8440 IXMLDOMElement_Release(elem);
8441
8442 /* add attribute already attached to another document */
8443 doc2 = create_document(&IID_IXMLDOMDocument);
8444
8445 hr = IXMLDOMDocument_loadXML( doc2, _bstr_(complete4A), &b );
8446 ok( hr == S_OK, "loadXML failed\n");
8447 ok( b == VARIANT_TRUE, "failed to load XML string\n");
8448
8449 hr = IXMLDOMDocument_get_documentElement(doc2, &elem);
8450 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8451 hr = IXMLDOMElement_setAttributeNode(elem, attr, NULL);
8452 ok( hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
8453 IXMLDOMElement_Release(elem);
8454
8455 IXMLDOMAttribute_Release(attr);
8456
8457 /* create element, add attribute, see if it's copied or linked */
8458 hr = IXMLDOMDocument_createElement(doc, _bstr_("test"), &elem);
8459 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8460
8461 attr = NULL;
8462 hr = IXMLDOMDocument_createAttribute(doc, _bstr_("attr"), &attr);
8463 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8464 ok(attr != NULL, "got %p\n", attr);
8465
8466 ref1 = IXMLDOMAttribute_AddRef(attr);
8467 IXMLDOMAttribute_Release(attr);
8468
8469 V_VT(&v) = VT_BSTR;
8470 V_BSTR(&v) = _bstr_("attrvalue1");
8471 hr = IXMLDOMAttribute_put_nodeValue(attr, v);
8472 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8473
8474 str = NULL;
8475 hr = IXMLDOMAttribute_get_xml(attr, &str);
8476 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8477 ok(lstrcmpW(str, L"attr=\"attrvalue1\"") == 0,
8478 "got %s\n", wine_dbgstr_w(str));
8480
8481 ret_attr = (void*)0xdeadbeef;
8482 hr = IXMLDOMElement_setAttributeNode(elem, attr, &ret_attr);
8483 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8484 ok(ret_attr == NULL, "got %p\n", ret_attr);
8485
8486 /* attribute reference increased */
8487 ref2 = IXMLDOMAttribute_AddRef(attr);
8488 IXMLDOMAttribute_Release(attr);
8489 ok(ref1 == ref2, "got %ld, expected %ld\n", ref2, ref1);
8490
8491 hr = IXMLDOMElement_get_xml(elem, &str);
8492 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8493 ok(lstrcmpW(str, L"<test attr=\"attrvalue1\"/>") == 0,
8494 "got %s\n", wine_dbgstr_w(str));
8496
8497 V_VT(&v) = VT_BSTR;
8498 V_BSTR(&v) = _bstr_("attrvalue2");
8499 hr = IXMLDOMAttribute_put_nodeValue(attr, v);
8500 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8501
8502 hr = IXMLDOMElement_get_xml(elem, &str);
8503 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8504 todo_wine ok(lstrcmpW(str, L"<test attr=\"attrvalue2\"/>") == 0,
8505 "got %s\n", wine_dbgstr_w(str));
8507
8508 IXMLDOMElement_Release(elem);
8509 IXMLDOMAttribute_Release(attr);
8510 IXMLDOMDocument_Release(doc2);
8511 IXMLDOMDocument_Release(doc);
8512 free_bstrs();
8513}
8514
8515static void test_createNode(void)
8516{
8517 IXMLDOMDocument *doc;
8520 VARIANT v, var;
8521 BSTR prefix, str;
8522 HRESULT hr;
8523 ULONG ref;
8524
8525 doc = create_document(&IID_IXMLDOMDocument);
8526
8527 EXPECT_REF(doc, 1);
8528
8529 /* reference count tests */
8530 hr = IXMLDOMDocument_createElement(doc, _bstr_("elem"), &elem);
8531 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8532
8533 /* initial reference is 2 */
8534todo_wine {
8535 EXPECT_REF(elem, 2);
8536 ref = IXMLDOMElement_Release(elem);
8537 ok(ref == 1, "got %ld\n", ref);
8538 /* it's released already, attempt to release now will crash it */
8539}
8540
8541 hr = IXMLDOMDocument_createElement(doc, _bstr_("elem"), &elem);
8542 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8544 IXMLDOMDocument_Release(doc);
8546 IXMLDOMElement_Release(elem);
8547
8548 doc = create_document(&IID_IXMLDOMDocument);
8549
8550 /* NODE_ELEMENT nodes */
8551 /* 1. specified namespace */
8552 V_VT(&v) = VT_I4;
8553 V_I4(&v) = NODE_ELEMENT;
8554
8555 hr = IXMLDOMDocument_createNode(doc, v, _bstr_("ns1:test"), _bstr_("http://winehq.org"), &node);
8556 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8557 prefix = NULL;
8558 hr = IXMLDOMNode_get_prefix(node, &prefix);
8559 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8560 ok(lstrcmpW(prefix, L"ns1") == 0, "wrong prefix\n");
8562 IXMLDOMNode_Release(node);
8563
8564 /* 2. default namespace */
8565 hr = IXMLDOMDocument_createNode(doc, v, _bstr_("test"), _bstr_("http://winehq.org/default"), &node);
8566 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8567 prefix = (void*)0xdeadbeef;
8568 hr = IXMLDOMNode_get_prefix(node, &prefix);
8569 ok( hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
8570 ok(prefix == 0, "expected empty prefix, got %p\n", prefix);
8571 /* check dump */
8572 hr = IXMLDOMNode_get_xml(node, &str);
8573 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8574 ok(lstrcmpW(str, L"<test xmlns=\"http://winehq.org/default\"/>") == 0,
8575 "got %s\n", wine_dbgstr_w(str));
8577
8578 hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMElement, (void**)&elem);
8579 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8580
8581 V_VT(&var) = VT_BSTR;
8582 hr = IXMLDOMElement_getAttribute(elem, _bstr_("xmlns"), &var);
8583 ok( hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
8584 ok( V_VT(&var) == VT_NULL, "got %d\n", V_VT(&var));
8585
8586 str = NULL;
8587 hr = IXMLDOMElement_get_namespaceURI(elem, &str);
8588 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8589 ok(lstrcmpW(str, L"http://winehq.org/default") == 0, "expected default namespace\n");
8591
8592 IXMLDOMElement_Release(elem);
8593 IXMLDOMNode_Release(node);
8594
8595 IXMLDOMDocument_Release(doc);
8596 free_bstrs();
8597}
8598
8599static const char get_prefix_doc[] =
8600 "<?xml version=\"1.0\" ?>"
8601 "<a xmlns:ns1=\"ns1 href\" />";
8602
8603static void test_get_prefix(void)
8604{
8605 IXMLDOMDocumentFragment *fragment;
8606 IXMLDOMCDATASection *cdata;
8609 IXMLDOMDocument *doc;
8611 HRESULT hr;
8612 BSTR str;
8613
8614 doc = create_document(&IID_IXMLDOMDocument);
8615
8616 /* nodes that can't support prefix */
8617 /* 1. document */
8618 str = (void*)0xdeadbeef;
8619 hr = IXMLDOMDocument_get_prefix(doc, &str);
8620 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
8621 ok(str == NULL, "got %p\n", str);
8622
8623 hr = IXMLDOMDocument_get_prefix(doc, NULL);
8624 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8625
8626 /* 2. cdata */
8627 hr = IXMLDOMDocument_createCDATASection(doc, NULL, &cdata);
8628 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8629
8630 str = (void*)0xdeadbeef;
8631 hr = IXMLDOMCDATASection_get_prefix(cdata, &str);
8632 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
8633 ok( str == 0, "got %p\n", str);
8634
8635 hr = IXMLDOMCDATASection_get_prefix(cdata, NULL);
8636 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8637 IXMLDOMCDATASection_Release(cdata);
8638
8639 /* 3. comment */
8640 hr = IXMLDOMDocument_createComment(doc, NULL, &comment);
8641 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8642
8643 str = (void*)0xdeadbeef;
8644 hr = IXMLDOMComment_get_prefix(comment, &str);
8645 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
8646 ok( str == 0, "got %p\n", str);
8647
8648 hr = IXMLDOMComment_get_prefix(comment, NULL);
8649 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8650 IXMLDOMComment_Release(comment);
8651
8652 /* 4. fragment */
8653 hr = IXMLDOMDocument_createDocumentFragment(doc, &fragment);
8654 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8655
8656 str = (void*)0xdeadbeef;
8657 hr = IXMLDOMDocumentFragment_get_prefix(fragment, &str);
8658 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
8659 ok( str == 0, "got %p\n", str);
8660
8661 hr = IXMLDOMDocumentFragment_get_prefix(fragment, NULL);
8662 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8663 IXMLDOMDocumentFragment_Release(fragment);
8664
8665 /* no prefix */
8666 hr = IXMLDOMDocument_createElement(doc, _bstr_("elem"), &element);
8667 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8668
8669 hr = IXMLDOMElement_get_prefix(element, NULL);
8670 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8671
8672 str = (void*)0xdeadbeef;
8673 hr = IXMLDOMElement_get_prefix(element, &str);
8674 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
8675 ok(str == 0, "got %p\n", str);
8676
8677 IXMLDOMElement_Release(element);
8678
8679 /* with prefix */
8680 hr = IXMLDOMDocument_createElement(doc, _bstr_("a:elem"), &element);
8681 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8682
8683 str = (void*)0xdeadbeef;
8684 hr = IXMLDOMElement_get_prefix(element, &str);
8685 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8686 ok(lstrcmpW(str, L"a") == 0, "expected prefix \"a\"\n");
8688
8689 str = (void*)0xdeadbeef;
8690 hr = IXMLDOMElement_get_namespaceURI(element, &str);
8691 ok( hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
8692 ok( str == 0, "got %p\n", str);
8693
8694 IXMLDOMElement_Release(element);
8695
8696 hr = IXMLDOMDocument_loadXML(doc, _bstr_(get_prefix_doc), &b);
8697 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8698
8699 hr = IXMLDOMDocument_get_documentElement(doc, &element);
8700 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8701
8702 str = (void*)0xdeadbeef;
8703 hr = IXMLDOMElement_get_prefix(element, &str);
8704 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
8705 ok(str == NULL, "got %p\n", str);
8706
8707 str = (void*)0xdeadbeef;
8708 hr = IXMLDOMElement_get_namespaceURI(element, &str);
8709 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
8710 ok(str == NULL, "got %s\n", wine_dbgstr_w(str));
8711
8712 IXMLDOMDocument_Release(doc);
8713 free_bstrs();
8714}
8715
8716static void test_selectSingleNode(void)
8717{
8718 IXMLDOMDocument *doc;
8722 HRESULT hr;
8723 LONG len;
8724
8725 doc = create_document(&IID_IXMLDOMDocument);
8726
8727 hr = IXMLDOMDocument_selectSingleNode(doc, NULL, NULL);
8728 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8729
8730 hr = IXMLDOMDocument_selectNodes(doc, NULL, NULL);
8731 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8732
8733 hr = IXMLDOMDocument_loadXML( doc, _bstr_(complete4A), &b );
8734 ok( hr == S_OK, "loadXML failed\n");
8735 ok( b == VARIANT_TRUE, "failed to load XML string\n");
8736
8737 hr = IXMLDOMDocument_selectSingleNode(doc, NULL, NULL);
8738 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8739
8740 hr = IXMLDOMDocument_selectNodes(doc, NULL, NULL);
8741 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8742
8743 hr = IXMLDOMDocument_selectSingleNode(doc, _bstr_("lc"), NULL);
8744 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8745
8746 hr = IXMLDOMDocument_selectNodes(doc, _bstr_("lc"), NULL);
8747 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8748
8749 hr = IXMLDOMDocument_selectSingleNode(doc, _bstr_("lc"), &node);
8750 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8751 IXMLDOMNode_Release(node);
8752
8753 hr = IXMLDOMDocument_selectNodes(doc, _bstr_("lc"), &list);
8754 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8755 IXMLDOMNodeList_Release(list);
8756
8757 list = (void*)0xdeadbeef;
8758 hr = IXMLDOMDocument_selectNodes(doc, NULL, &list);
8759 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8760 ok(list == (void*)0xdeadbeef, "got %p\n", list);
8761
8762 node = (void*)0xdeadbeef;
8763 hr = IXMLDOMDocument_selectSingleNode(doc, _bstr_("nonexistent"), &node);
8764 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
8765 ok(node == 0, "got %p\n", node);
8766
8767 list = (void*)0xdeadbeef;
8768 hr = IXMLDOMDocument_selectNodes(doc, _bstr_("nonexistent"), &list);
8769 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8770 len = 1;
8771 hr = IXMLDOMNodeList_get_length(list, &len);
8772 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8773 ok(len == 0, "got %ld\n", len);
8774 IXMLDOMNodeList_Release(list);
8775
8776 IXMLDOMDocument_Release(doc);
8777 free_bstrs();
8778}
8779
8780static void test_events(void)
8781{
8784 IXMLDOMDocument *doc;
8785 HRESULT hr;
8786 VARIANT v;
8788
8789 doc = create_document(&IID_IXMLDOMDocument);
8790
8791 hr = IXMLDOMDocument_QueryInterface(doc, &IID_IConnectionPointContainer, (void**)&conn);
8792 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8793
8794 hr = IConnectionPointContainer_FindConnectionPoint(conn, &IID_IDispatch, &point);
8795 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8796 IConnectionPoint_Release(point);
8797 hr = IConnectionPointContainer_FindConnectionPoint(conn, &IID_IPropertyNotifySink, &point);
8798 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8799 IConnectionPoint_Release(point);
8800 hr = IConnectionPointContainer_FindConnectionPoint(conn, &DIID_XMLDOMDocumentEvents, &point);
8801 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8802 IConnectionPoint_Release(point);
8803
8804 IConnectionPointContainer_Release(conn);
8805
8806 /* ready state callback */
8807 VariantInit(&v);
8808 hr = IXMLDOMDocument_put_onreadystatechange(doc, v);
8809 ok(hr == DISP_E_TYPEMISMATCH, "Unexpected hr %#lx.\n", hr);
8810
8811 event = create_dispevent();
8812 V_VT(&v) = VT_UNKNOWN;
8813 V_UNKNOWN(&v) = (IUnknown*)event;
8814
8815 hr = IXMLDOMDocument_put_onreadystatechange(doc, v);
8816 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8817 EXPECT_REF(event, 2);
8818
8819 V_VT(&v) = VT_DISPATCH;
8820 V_DISPATCH(&v) = event;
8821
8822 hr = IXMLDOMDocument_put_onreadystatechange(doc, v);
8823 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8824 EXPECT_REF(event, 2);
8825
8826 /* VT_NULL doesn't reset event handler */
8827 V_VT(&v) = VT_NULL;
8828 hr = IXMLDOMDocument_put_onreadystatechange(doc, v);
8829 ok(hr == DISP_E_TYPEMISMATCH, "Unexpected hr %#lx.\n", hr);
8830 EXPECT_REF(event, 2);
8831
8832 V_VT(&v) = VT_DISPATCH;
8833 V_DISPATCH(&v) = NULL;
8834
8835 hr = IXMLDOMDocument_put_onreadystatechange(doc, v);
8836 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8837 EXPECT_REF(event, 1);
8838
8839 V_VT(&v) = VT_UNKNOWN;
8840 V_DISPATCH(&v) = NULL;
8841 hr = IXMLDOMDocument_put_onreadystatechange(doc, v);
8842 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8843
8844 IDispatch_Release(event);
8845
8846 IXMLDOMDocument_Release(doc);
8847}
8848
8850{
8851 static const WCHAR xml1[] = L"<?xml version=\"1.0\"?>\r\n<test/>\r\n";
8852 static const char xml2[] = "<?xml version=\"1.0\" encoding=\"windows-1252\"?>\r\n<test/>\r\n";
8853 static const char xml2_wine[] = "<?xml version=\"1.0\" encoding=\"windows-1252\"?>\n<test/>\n";
8854 static const char xml3[] = "<?xml version=\"1.0\" standalone=\"yes\"?>\r\n<test/>\r\n";
8855 static const char xml3_wine[] = "<?xml version=\"1.0\" standalone=\"yes\"?>\n<test/>\n";
8857 IXMLDOMDocument *doc;
8859 IXMLDOMNamedNodeMap *node_map;
8861 WCHAR buff[10];
8862 BSTR xml, bstr;
8863 VARIANT var;
8864 HRESULT hr;
8865 IStream *stream;
8866 LARGE_INTEGER off;
8869 char *p;
8870
8871 doc = create_document(&IID_IXMLDOMDocument);
8872
8873 hr = IXMLDOMDocument_createProcessingInstruction(doc, _bstr_("xml"), _bstr_("version=\"1.0\" encoding=\"windows-1252\" dummy=\"value\""), &pi);
8874 ok(hr == XML_E_UNEXPECTED_ATTRIBUTE, "Unexpected hr %#lx.\n", hr);
8875 hr = IXMLDOMDocument_createProcessingInstruction(doc, NULL, _bstr_("version=\"1.0\" encoding=\"UTF-8\""), &pi);
8876 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
8877 hr = IXMLDOMDocument_createProcessingInstruction(doc, _bstr_("xml"), NULL, &pi);
8878 ok(hr == XML_E_XMLDECLSYNTAX, "Unexpected hr %#lx.\n", hr);
8879 hr = IXMLDOMDocument_createProcessingInstruction(doc, _bstr_("xml"), _bstr_("version=\"1.0\" encoding=UTF-8"), &pi);
8880 ok(hr == XML_E_MISSINGQUOTE, "Unexpected hr %#lx.\n", hr);
8881 hr = IXMLDOMDocument_createProcessingInstruction(doc, _bstr_("xml"), _bstr_("version=\"1.0\" encoding='UTF-8\""), &pi);
8882 ok(hr == XML_E_BADCHARINSTRING, "Unexpected hr %#lx.\n", hr);
8883 hr = IXMLDOMDocument_createProcessingInstruction(doc, _bstr_("xml"), _bstr_("version=\"1.0\" encoding=\"UTF-8"), &pi);
8884 ok(hr == XML_E_BADCHARINSTRING, "Unexpected hr %#lx.\n", hr);
8885 pi = NULL;
8886 hr = IXMLDOMDocument_createProcessingInstruction(doc, _bstr_("xml"), _bstr_("version=\"1.0\" encoding='UTF-8'"), &pi);
8887 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8888 hr = IXMLDOMProcessingInstruction_QueryInterface(pi, &IID_IXMLDOMNode, (void **)&node);
8889 node_map = NULL;
8890 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8891 hr = IXMLDOMNode_get_attributes(node, &node_map);
8892 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8893 IXMLDOMNamedNodeMap_Release(node_map);
8894 IXMLDOMNode_Release(node);
8895 IXMLDOMProcessingInstruction_Release(pi);
8896
8897 /* test for BSTR handling, pass broken BSTR */
8898 memcpy(&buff[2], L"test", 5 * sizeof(WCHAR));
8899 /* just a big length */
8900 *(DWORD*)buff = 0xf0f0;
8901 hr = IXMLDOMDocument_createProcessingInstruction(doc, _bstr_("test"), &buff[2], &pi);
8902 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8903
8904 IXMLDOMProcessingInstruction_Release(pi);
8905 IXMLDOMDocument_Release(doc);
8906
8907 doc = create_document(&IID_IXMLDOMDocument);
8908
8909 hr = IXMLDOMDocument_createProcessingInstruction(doc, _bstr_("xml"), _bstr_("version=\"1.0\" encoding=\"windows-1252\""), &pi);
8910 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8911 hr = IXMLDOMProcessingInstruction_QueryInterface(pi, &IID_IXMLDOMNode, (void **)&node);
8912 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8913 hr = IXMLDOMDocument_appendChild(doc, node, NULL);
8914 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8915
8916 hr = IXMLDOMNode_get_attributes(node, &node_map);
8917 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8918
8919 item = (void *)0xdeadbeef;
8920 hr = IXMLDOMNamedNodeMap_getNamedItem(node_map, _bstr_("xml"), &item);
8921 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
8922 ok(!item, "got %p\n", item);
8923
8924 item = NULL;
8925 hr = IXMLDOMNamedNodeMap_getNamedItem(node_map, _bstr_("encoding"), &item);
8926 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8927 ok(item != NULL, "got NULL\n");
8928
8929#ifdef __REACTOS__
8930 if (item != NULL) {
8931#endif
8932 hr = IXMLDOMNode_get_nodeName(item, &bstr);
8933 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8934 ok(!lstrcmpW(bstr, L"encoding"), "got %s\n", wine_dbgstr_w(bstr));
8935 SysFreeString(bstr);
8936
8937 VariantInit(&var);
8938 hr = IXMLDOMNode_get_nodeValue(item, &var);
8939 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8940 ok(V_VT(&var) == VT_BSTR, "got %u\n", V_VT(&var));
8941 ok(!lstrcmpW(V_BSTR(&var), L"windows-1252"), "got %s\n", wine_dbgstr_w(V_BSTR(&var)));
8942 VariantClear(&var);
8943#ifdef __REACTOS__
8944 }
8945#endif
8946
8947 IXMLDOMNamedNodeMap_Release(node_map);
8948 IXMLDOMNode_Release(node);
8949 IXMLDOMProcessingInstruction_Release(pi);
8950
8951 hr = IXMLDOMDocument_createElement(doc, _bstr_("test"), &element);
8952 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8953 hr = IXMLDOMDocument_appendChild(doc, (IXMLDOMNode *)element, NULL);
8954 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8955 IXMLDOMElement_Release(element);
8956
8957 hr = IXMLDOMDocument_get_xml(doc, &xml);
8958 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8959 todo_wine
8960 ok(!wcscmp(xml, xml1), "got %s\n", wine_dbgstr_w(xml));
8961 SysFreeString(xml);
8962
8964 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8965 V_VT(&var) = VT_UNKNOWN;
8967 hr = IXMLDOMDocument_save(doc, var);
8968 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8969
8971 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8972 p = GlobalLock(global);
8973 ok(!memcmp(p, xml2, sizeof(xml2) - 1) || !memcmp(p, xml2_wine, sizeof(xml2_wine) - 1), "got %s\n", wine_dbgstr_a(p));
8975
8976 /* Verify the result after load+save */
8977 off.QuadPart = 0;
8978 hr = IStream_Seek(stream, off, STREAM_SEEK_SET, NULL);
8979 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8980
8981 hr = IXMLDOMDocument_load(doc, var, &b);
8982 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8983 ok(b == VARIANT_TRUE, "got %d\n", b);
8984
8985 off.QuadPart = 0;
8986 hr = IStream_Seek(stream, off, STREAM_SEEK_SET, NULL);
8987 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8988
8989 hr = IXMLDOMDocument_save(doc, var);
8990 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8991
8993 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8994 p = GlobalLock(global);
8995 ok(!memcmp(p, xml2, sizeof(xml2) - 1) || !memcmp(p, xml2_wine, sizeof(xml2_wine) - 1), "got %s\n", wine_dbgstr_a(p));
8997
8998 IStream_Release(stream);
8999
9000 hr = IXMLDOMDocument_loadXML(doc, _bstr_("<?xml version=\"1.0\" standalone=\"yes\"?>\r\n<test/>\r\n"), &b);
9001 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9002 ok(b == VARIANT_TRUE, "got %d\n", b);
9003
9005 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9006
9007 V_VT(&var) = VT_UNKNOWN;
9009 hr = IXMLDOMDocument_save(doc, var);
9010 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9011
9013 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9014
9015 p = GlobalLock(global);
9016 ok(!memcmp(p, xml3, sizeof(xml3) - 1) || !memcmp(p, xml3_wine, sizeof(xml3_wine) - 1), "got %s\n", wine_dbgstr_a(p));
9018
9019 IStream_Release(stream);
9020 IXMLDOMDocument_Release(doc);
9021}
9022
9024{
9025 static const BYTE binhexdata[16] =
9026 {0,1,2,3,4,5,6,7,8,9,0xa,0xb,0xc,0xd,0xe,0xf};
9027 IXMLDOMDocument *doc;
9030 LONG ubound, lbound;
9033 HRESULT hr;
9034 BYTE *ptr;
9035 BSTR str;
9036
9037 doc = create_document(&IID_IXMLDOMDocument);
9038
9039 hr = IXMLDOMDocument_createElement(doc, _bstr_("Element"), &elem);
9040 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9041
9042 V_VT(&type) = VT_EMPTY;
9043 hr = IXMLDOMElement_get_dataType(elem, &type);
9044 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
9045 ok(V_VT(&type) == VT_NULL, "got %d, expected VT_NULL\n", V_VT(&type));
9046
9047 /* set typed value for untyped node */
9048 V_VT(&type) = VT_I1;
9049 V_I1(&type) = 1;
9050 hr = IXMLDOMElement_put_nodeTypedValue(elem, type);
9051 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9052
9053 V_VT(&type) = VT_EMPTY;
9054 hr = IXMLDOMElement_get_dataType(elem, &type);
9055 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
9056 ok(V_VT(&type) == VT_NULL, "got %d, expected VT_NULL\n", V_VT(&type));
9057
9058 /* no type info stored */
9059 V_VT(&type) = VT_EMPTY;
9060 hr = IXMLDOMElement_get_nodeTypedValue(elem, &type);
9061 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9062 ok(V_VT(&type) == VT_BSTR, "got %d, expected VT_BSTR\n", V_VT(&type));
9063 ok(memcmp(V_BSTR(&type), L"1", 2*sizeof(WCHAR)) == 0,
9064 "got %s, expected \"1\"\n", wine_dbgstr_w(V_BSTR(&type)));
9066
9067 /* int */
9068 hr = IXMLDOMElement_put_dataType(elem, _bstr_("int"));
9069 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9070
9071 V_VT(&value) = VT_BSTR;
9072 V_BSTR(&value) = _bstr_("1");
9073 hr = IXMLDOMElement_put_nodeTypedValue(elem, value);
9074 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9075
9076 V_VT(&value) = VT_EMPTY;
9077 hr = IXMLDOMElement_get_nodeTypedValue(elem, &value);
9078 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9079 ok(V_VT(&value) == VT_I4, "got %d\n", V_VT(&value));
9080 ok(V_I4(&value) == 1, "got %ld\n", V_I4(&value));
9081
9082 V_VT(&value) = VT_I2;
9083 V_I2(&value) = -1;
9084 hr = IXMLDOMElement_put_nodeTypedValue(elem, value);
9085 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9086
9087 V_VT(&value) = VT_EMPTY;
9088 hr = IXMLDOMElement_get_nodeTypedValue(elem, &value);
9089 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9090 ok(V_VT(&value) == VT_I4, "got %d\n", V_VT(&value));
9091 ok(V_I4(&value) == -1, "got %ld\n", V_I4(&value));
9092
9093 hr = IXMLDOMElement_get_firstChild(elem, &node);
9094 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9095 hr = IXMLDOMElement_removeChild(elem, node, NULL);
9096 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9097 IXMLDOMNode_Release(node);
9098
9099 hr = IXMLDOMDocument_appendChild(doc, (IXMLDOMNode*)elem, NULL);
9100 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9101
9102 /* bin.base64 */
9103 hr = IXMLDOMElement_put_dataType(elem, _bstr_("bin.base64"));
9104 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9105
9106 V_VT(&value) = VT_BSTR;
9107 V_BSTR(&value) = _bstr_("ABCD");
9108 hr = IXMLDOMElement_put_nodeTypedValue(elem, value);
9109 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9110
9111 V_VT(&value) = VT_EMPTY;
9112 hr = IXMLDOMElement_get_nodeTypedValue(elem, &value);
9113 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9114 ok(V_VT(&value) == (VT_UI1|VT_ARRAY), "got %d\n", V_VT(&value));
9115 ok(SafeArrayGetDim(V_ARRAY(&value)) == 1, "got wrong dimension\n");
9116 ubound = 0;
9117 hr = SafeArrayGetUBound(V_ARRAY(&value), 1, &ubound);
9118 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9119 ok(ubound == 2, "got %ld\n", ubound);
9120 lbound = 0;
9121 hr = SafeArrayGetLBound(V_ARRAY(&value), 1, &lbound);
9122 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9123 ok(lbound == 0, "got %ld\n", lbound);
9124 hr = SafeArrayAccessData(V_ARRAY(&value), (void*)&ptr);
9125 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9126 ok(ptr[0] == 0, "got %x\n", ptr[0]);
9127 ok(ptr[1] == 0x10, "got %x\n", ptr[1]);
9128 ok(ptr[2] == 0x83, "got %x\n", ptr[2]);
9131
9132 /* when set as VT_BSTR it's stored as is */
9133 hr = IXMLDOMElement_get_firstChild(elem, &node);
9134 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9135 hr = IXMLDOMNode_get_text(node, &str);
9136 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9137 ok(!lstrcmpW(str, L"ABCD"), "%s\n", wine_dbgstr_w(str));
9138 IXMLDOMNode_Release(node);
9140
9142 hr = SafeArrayAccessData(array, (void*)&ptr);
9143 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9144 memcpy(ptr, "dGVzdA=", strlen("dGVzdA="));
9146
9148 V_ARRAY(&value) = array;
9149 hr = IXMLDOMElement_put_nodeTypedValue(elem, value);
9150 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9151
9152 V_VT(&value) = VT_EMPTY;
9153 hr = IXMLDOMElement_get_nodeTypedValue(elem, &value);
9154 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9155 ok(V_VT(&value) == (VT_UI1|VT_ARRAY), "got %d\n", V_VT(&value));
9156 ok(SafeArrayGetDim(V_ARRAY(&value)) == 1, "got wrong dimension\n");
9157 ubound = 0;
9158 hr = SafeArrayGetUBound(V_ARRAY(&value), 1, &ubound);
9159 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9160 ok(ubound == 6, "got %ld\n", ubound);
9161 lbound = 0;
9162 hr = SafeArrayGetLBound(V_ARRAY(&value), 1, &lbound);
9163 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9164 ok(lbound == 0, "got %ld\n", lbound);
9165 hr = SafeArrayAccessData(V_ARRAY(&value), (void*)&ptr);
9166 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9167 ok(!memcmp(ptr, "dGVzdA=", strlen("dGVzdA=")), "got wrong data, %s\n", ptr);
9170
9171 /* if set with VT_UI1|VT_ARRAY it's encoded */
9172 hr = IXMLDOMElement_get_firstChild(elem, &node);
9173 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9174 hr = IXMLDOMNode_get_text(node, &str);
9175 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9176 ok(!lstrcmpW(str, L"ZEdWemRBPQ=="), "%s\n", wine_dbgstr_w(str));
9177 IXMLDOMNode_Release(node);
9180
9181 /* bin.hex */
9182 V_VT(&value) = VT_BSTR;
9183 V_BSTR(&value) = _bstr_("");
9184 hr = IXMLDOMElement_put_nodeTypedValue(elem, value);
9185 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9186
9187 hr = IXMLDOMElement_put_dataType(elem, _bstr_("bin.hex"));
9188 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9189
9191 hr = SafeArrayAccessData(array, (void*)&ptr);
9192 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9193 memcpy(ptr, binhexdata, sizeof(binhexdata));
9195
9197 V_ARRAY(&value) = array;
9198 hr = IXMLDOMElement_put_nodeTypedValue(elem, value);
9199 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9200
9201 V_VT(&value) = VT_EMPTY;
9202 hr = IXMLDOMElement_get_nodeTypedValue(elem, &value);
9203 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9204 ok(V_VT(&value) == (VT_UI1|VT_ARRAY), "got %d\n", V_VT(&value));
9205 ok(SafeArrayGetDim(V_ARRAY(&value)) == 1, "got wrong dimension\n");
9206 ubound = 0;
9207 hr = SafeArrayGetUBound(V_ARRAY(&value), 1, &ubound);
9208 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9209 ok(ubound == 15, "got %ld\n", ubound);
9210 lbound = 0;
9211 hr = SafeArrayGetLBound(V_ARRAY(&value), 1, &lbound);
9212 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9213 ok(lbound == 0, "got %ld\n", lbound);
9214 hr = SafeArrayAccessData(V_ARRAY(&value), (void*)&ptr);
9215 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9216 ok(!memcmp(ptr, binhexdata, sizeof(binhexdata)), "got wrong data\n");
9219
9220 /* if set with VT_UI1|VT_ARRAY it's encoded */
9221 hr = IXMLDOMElement_get_firstChild(elem, &node);
9222 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9223 hr = IXMLDOMNode_get_text(node, &str);
9224 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9225 ok(!lstrcmpW(str, L"000102030405060708090a0b0c0d0e0f"), "%s\n", wine_dbgstr_w(str));
9226 IXMLDOMNode_Release(node);
9229
9230 IXMLDOMElement_Release(elem);
9231 IXMLDOMDocument_Release(doc);
9232 free_bstrs();
9233}
9234
9235static void test_get_xml(void)
9236{
9237 static const char xmlA[] = "<?xml version=\"1.0\" encoding=\"UTF-16\"?>\r\n<a>test</a>\r\n";
9238 static const char attrA[] = "attr=\"&quot;a &amp; b&quot;\"";
9239 static const char attr2A[] = "\"a & b\"";
9240 static const char attr3A[] = "attr=\"&amp;quot;a\"";
9241 static const char attr4A[] = "&quot;a";
9242 static const char fooA[] = "<foo/>";
9247 IXMLDOMDocument *doc;
9249 VARIANT v;
9250 BSTR xml;
9251 HRESULT hr;
9252
9253 doc = create_document(&IID_IXMLDOMDocument);
9254
9255 b = VARIANT_TRUE;
9256 hr = IXMLDOMDocument_loadXML( doc, _bstr_("<a>test</a>"), &b );
9257 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9258 ok( b == VARIANT_TRUE, "got %d\n", b);
9259
9260 hr = IXMLDOMDocument_createProcessingInstruction(doc, _bstr_("xml"),
9261 _bstr_("version=\"1.0\" encoding=\"UTF-16\""), &pi);
9262 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9263
9264 hr = IXMLDOMDocument_get_firstChild(doc, &first);
9265 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9266
9267 V_UNKNOWN(&v) = (IUnknown*)first;
9268 V_VT(&v) = VT_UNKNOWN;
9269
9270 hr = IXMLDOMDocument_insertBefore(doc, (IXMLDOMNode*)pi, v, NULL);
9271 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9272
9273 IXMLDOMProcessingInstruction_Release(pi);
9274 IXMLDOMNode_Release(first);
9275
9276 hr = IXMLDOMDocument_get_xml(doc, &xml);
9277 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9278
9279 ok(memcmp(xml, _bstr_(xmlA), sizeof(xmlA)*sizeof(WCHAR)) == 0,
9280 "got %s, expected %s\n", wine_dbgstr_w(xml), xmlA);
9281 SysFreeString(xml);
9282
9283 IXMLDOMDocument_Release(doc);
9284
9285 doc = create_document(&IID_IXMLDOMDocument);
9286
9287 hr = IXMLDOMDocument_createElement(doc, _bstr_("foo"), &elem);
9288 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9289
9290 hr = IXMLDOMDocument_putref_documentElement(doc, elem);
9291 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9292
9293 hr = IXMLDOMDocument_get_xml(doc, &xml);
9294 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9295
9296 ok(memcmp(xml, _bstr_(fooA), (sizeof(fooA)-1)*sizeof(WCHAR)) == 0,
9297 "got %s, expected %s\n", wine_dbgstr_w(xml), fooA);
9298 SysFreeString(xml);
9299
9300 IXMLDOMElement_Release(elem);
9301
9302 /* attribute node */
9303 hr = IXMLDOMDocument_createAttribute(doc, _bstr_("attr"), &attr);
9304 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9305
9306 V_VT(&v) = VT_BSTR;
9307 V_BSTR(&v) = _bstr_("\"a & b\"");
9308 hr = IXMLDOMAttribute_put_value(attr, v);
9309 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9310
9311 xml = NULL;
9312 hr = IXMLDOMAttribute_get_xml(attr, &xml);
9313 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9314 ok(!memcmp(xml, _bstr_(attrA), (sizeof(attrA)-1)*sizeof(WCHAR)), "got %s\n", wine_dbgstr_w(xml));
9315 SysFreeString(xml);
9316
9317 VariantInit(&v);
9318 hr = IXMLDOMAttribute_get_value(attr, &v);
9319 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9320 ok(V_VT(&v) == VT_BSTR, "got type %d\n", V_VT(&v));
9321 ok(!memcmp(V_BSTR(&v), _bstr_(attr2A), (sizeof(attr2A)-1)*sizeof(WCHAR)),
9322 "got %s\n", wine_dbgstr_w(V_BSTR(&v)));
9323 VariantClear(&v);
9324
9325 V_VT(&v) = VT_BSTR;
9326 V_BSTR(&v) = _bstr_("&quot;a");
9327 hr = IXMLDOMAttribute_put_value(attr, v);
9328 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9329
9330 xml = NULL;
9331 hr = IXMLDOMAttribute_get_xml(attr, &xml);
9332 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9333 ok(!memcmp(xml, _bstr_(attr3A), (sizeof(attr3A)-1)*sizeof(WCHAR)), "got %s\n", wine_dbgstr_w(xml));
9334 SysFreeString(xml);
9335
9336 VariantInit(&v);
9337 hr = IXMLDOMAttribute_get_value(attr, &v);
9338 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9339 ok(V_VT(&v) == VT_BSTR, "got type %d\n", V_VT(&v));
9340 ok(!memcmp(V_BSTR(&v), _bstr_(attr4A), (sizeof(attr4A)-1)*sizeof(WCHAR)),
9341 "got %s\n", wine_dbgstr_w(V_BSTR(&v)));
9342 VariantClear(&v);
9343
9344 IXMLDOMAttribute_Release(attr);
9345
9346 IXMLDOMDocument_Release(doc);
9347
9348 free_bstrs();
9349}
9350
9351static void test_xsltemplate(void)
9352{
9353 IXMLDOMDocument *doc, *doc2, *doc3;
9354 IXSLTemplate *template;
9355 IXSLProcessor *processor;
9356 IStream *stream;
9358 HRESULT hr;
9359 ULONG ref1, ref2;
9360 VARIANT v;
9361 BSTR str;
9362
9363 if (!is_clsid_supported(&CLSID_XSLTemplate, &IID_IXSLTemplate)) return;
9364 template = create_xsltemplate(&IID_IXSLTemplate);
9365
9366 check_interface(template, &IID_IXSLTemplate, TRUE);
9367 check_interface(template, &IID_IDispatch, TRUE);
9368 check_interface(template, &IID_IDispatchEx, TRUE);
9369
9370 /* works as reset */
9371 hr = IXSLTemplate_putref_stylesheet(template, NULL);
9372 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9373
9374 doc = create_document(&IID_IXMLDOMDocument);
9375
9376 b = VARIANT_TRUE;
9377 hr = IXMLDOMDocument_loadXML( doc, _bstr_("<a>test</a>"), &b );
9378 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9379 ok( b == VARIANT_TRUE, "got %d\n", b);
9380
9381 /* putref with non-xsl document */
9382 hr = IXSLTemplate_putref_stylesheet(template, (IXMLDOMNode*)doc);
9383 todo_wine ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
9384
9385 b = VARIANT_TRUE;
9386 hr = IXMLDOMDocument_loadXML( doc, _bstr_(szTransformSSXML), &b );
9387 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9388 ok( b == VARIANT_TRUE, "got %d\n", b);
9389
9390 /* not a freethreaded document */
9391 hr = IXSLTemplate_putref_stylesheet(template, (IXMLDOMNode*)doc);
9392 todo_wine ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
9393
9394 IXMLDOMDocument_Release(doc);
9395
9396 if (!is_clsid_supported(&CLSID_FreeThreadedDOMDocument, &IID_IXMLDOMDocument))
9397 {
9398 IXSLTemplate_Release(template);
9399 return;
9400 }
9401
9402 hr = CoCreateInstance(&CLSID_FreeThreadedDOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (void**)&doc);
9403 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9404
9405 b = VARIANT_TRUE;
9406 hr = IXMLDOMDocument_loadXML( doc, _bstr_(szTransformSSXML), &b );
9407 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9408 ok( b == VARIANT_TRUE, "got %d\n", b);
9409
9410 /* freethreaded document */
9411 ref1 = IXMLDOMDocument_AddRef(doc);
9412 IXMLDOMDocument_Release(doc);
9413 hr = IXSLTemplate_putref_stylesheet(template, (IXMLDOMNode*)doc);
9414 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9415 ref2 = IXMLDOMDocument_AddRef(doc);
9416 IXMLDOMDocument_Release(doc);
9417 ok(ref2 > ref1, "got %ld\n", ref2);
9418
9419 /* processor */
9420 hr = IXSLTemplate_createProcessor(template, NULL);
9421 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
9422
9423 EXPECT_REF(template, 1);
9424 hr = IXSLTemplate_createProcessor(template, &processor);
9425 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9426 EXPECT_REF(template, 2);
9427
9428 /* input no set yet */
9429 V_VT(&v) = VT_BSTR;
9430 V_BSTR(&v) = NULL;
9431 hr = IXSLProcessor_get_input(processor, &v);
9432todo_wine {
9433 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9434 ok(V_VT(&v) == VT_EMPTY, "got %d\n", V_VT(&v));
9435}
9436
9437 hr = IXSLProcessor_get_output(processor, NULL);
9438 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
9439
9440 /* reset before it was set */
9441 V_VT(&v) = VT_EMPTY;
9442 hr = IXSLProcessor_put_output(processor, v);
9443 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9444
9445 V_VT(&v) = VT_UNKNOWN;
9446 V_UNKNOWN(&v) = NULL;
9447 hr = IXSLProcessor_put_output(processor, v);
9448 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9449
9450 V_VT(&v) = VT_UNKNOWN;
9451 V_DISPATCH(&v) = NULL;
9452 hr = IXSLProcessor_put_output(processor, v);
9453 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9454
9456 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9457 EXPECT_REF(stream, 1);
9458
9459 V_VT(&v) = VT_UNKNOWN;
9460 V_UNKNOWN(&v) = (IUnknown*)stream;
9461 hr = IXSLProcessor_put_output(processor, v);
9462 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9463
9464 /* it seems processor grabs 2 references */
9466
9467 V_VT(&v) = VT_EMPTY;
9468 hr = IXSLProcessor_get_output(processor, &v);
9469 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9470 ok(V_VT(&v) == VT_UNKNOWN, "got type %d\n", V_VT(&v));
9471 ok(V_UNKNOWN(&v) == (IUnknown*)stream, "got %p\n", V_UNKNOWN(&v));
9472
9474 VariantClear(&v);
9475
9476 hr = IXSLProcessor_transform(processor, NULL);
9477 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
9478
9479 /* reset and check stream refcount */
9480 V_VT(&v) = VT_EMPTY;
9481 hr = IXSLProcessor_put_output(processor, v);
9482 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9483
9484 EXPECT_REF(stream, 1);
9485
9486 IStream_Release(stream);
9487
9488 /* no output interface set, check output */
9489 doc2 = create_document(&IID_IXMLDOMDocument);
9490
9491 b = VARIANT_FALSE;
9492 hr = IXMLDOMDocument_loadXML( doc2, _bstr_("<a>test</a>"), &b );
9493 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9494 ok( b == VARIANT_TRUE, "got %d\n", b);
9495
9496 V_VT(&v) = VT_UNKNOWN;
9497 V_UNKNOWN(&v) = (IUnknown*)doc2;
9498 hr = IXSLProcessor_put_input(processor, v);
9499 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9500
9501 hr = IXSLProcessor_transform(processor, &b);
9502 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9503
9504 V_VT(&v) = VT_EMPTY;
9505 hr = IXSLProcessor_get_output(processor, &v);
9506 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9507 ok(V_VT(&v) == VT_BSTR, "got type %d\n", V_VT(&v));
9508 ok(*V_BSTR(&v) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v)));
9509 VariantClear(&v);
9510
9511 /* transform to document */
9512 b = VARIANT_FALSE;
9513 hr = IXMLDOMDocument_loadXML(doc2, _bstr_(szTransformXML), &b);
9514 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9515 ok(b == VARIANT_TRUE, "got %d\n", b);
9516
9517 V_VT(&v) = VT_UNKNOWN;
9518 V_UNKNOWN(&v) = (IUnknown*)doc2;
9519 hr = IXSLProcessor_put_input(processor, v);
9520 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9521
9522 doc3 = create_document(&IID_IXMLDOMDocument);
9523 V_VT(&v) = VT_UNKNOWN;
9524 V_UNKNOWN(&v) = (IUnknown *)doc3;
9525 hr = IXSLProcessor_put_output(processor, v);
9526 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9527
9528 hr = IXMLDOMDocument_get_xml(doc3, &str);
9529 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9530 ok(!*str, "Expected empty document\n");
9532
9533 hr = IXSLProcessor_transform(processor, &b);
9534 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9535
9536 V_VT(&v) = VT_EMPTY;
9537 hr = IXSLProcessor_get_output(processor, &v);
9538 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9539 ok(V_VT(&v) == VT_UNKNOWN, "got type %d\n", V_VT(&v));
9540 VariantClear(&v);
9541
9542 hr = IXMLDOMDocument_get_xml(doc3, &str);
9543 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9544 ok(!!*str, "Expected document\n");
9546
9547 /* transform to IResponse */
9548 V_VT(&v) = VT_EMPTY;
9549 hr = IXSLProcessor_put_output(processor, v);
9550 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9551
9552 V_VT(&v) = VT_UNKNOWN;
9554 hr = IXSLProcessor_put_output(processor, v);
9555 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9556
9557 b = VARIANT_FALSE;
9558 hr = IXSLProcessor_transform(processor, &b);
9559 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9560 ok(b == VARIANT_TRUE, "got %x\n", b);
9561
9562 IXSLProcessor_Release(processor);
9563 IXMLDOMDocument_Release(doc2);
9564 IXMLDOMDocument_Release(doc3);
9565
9566 /* drop reference */
9567 hr = IXSLTemplate_putref_stylesheet(template, NULL);
9568 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9569 ref2 = IXMLDOMDocument_AddRef(doc);
9570 IXMLDOMDocument_Release(doc);
9571 ok(ref2 == ref1, "got %ld\n", ref2);
9572
9573 IXMLDOMDocument_Release(doc);
9574 IXSLTemplate_Release(template);
9575 free_bstrs();
9576}
9577
9578static void test_insertBefore(void)
9579{
9580 IXMLDOMDocument *doc, *doc2, *doc3;
9582 IXMLDOMElement *elem1, *elem2, *elem3, *elem4, *elem5;
9583 IXMLDOMNode *node, *newnode, *cdata;
9584 HRESULT hr;
9585 VARIANT v;
9586 BSTR p;
9587
9588 doc = create_document(&IID_IXMLDOMDocument);
9589 doc3 = create_document(&IID_IXMLDOMDocument);
9590#ifdef __REACTOS__
9591 if (!is_reactos()) {
9592#endif
9593 /* NULL to document */
9594 V_VT(&v) = VT_NULL;
9595 node = (void*)0xdeadbeef;
9596 hr = IXMLDOMDocument_insertBefore(doc, NULL, v, &node);
9597 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
9598 ok(node == (void*)0xdeadbeef, "got %p\n", node);
9599#ifdef __REACTOS__
9600 }
9601#endif
9602
9603 /* document to document */
9604 V_VT(&v) = VT_NULL;
9605 node = (void*)0xdeadbeef;
9606 hr = IXMLDOMDocument_insertBefore(doc, (IXMLDOMNode*)doc3, v, &node);
9607 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
9608 ok(node == NULL, "got %p\n", node);
9609
9610 /* document to itself */
9611 V_VT(&v) = VT_NULL;
9612 node = (void*)0xdeadbeef;
9613 hr = IXMLDOMDocument_insertBefore(doc, (IXMLDOMNode*)doc, v, &node);
9614 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
9615 ok(node == NULL, "got %p\n", node);
9616
9617 /* insertBefore behaviour for attribute node */
9618 V_VT(&v) = VT_I4;
9619 V_I4(&v) = NODE_ATTRIBUTE;
9620
9621 attr = NULL;
9622 hr = IXMLDOMDocument_createNode(doc, v, _bstr_("attr"), NULL, (IXMLDOMNode**)&attr);
9623 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9624 ok(attr != NULL, "got %p\n", attr);
9625
9626 /* attribute to document */
9627 V_VT(&v) = VT_NULL;
9628 node = (void*)0xdeadbeef;
9629 hr = IXMLDOMDocument_insertBefore(doc3, (IXMLDOMNode*)attr, v, &node);
9630 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
9631 ok(node == NULL, "got %p\n", node);
9632
9633 /* cdata to document */
9634 V_VT(&v) = VT_I4;
9636
9637 cdata = NULL;
9638 hr = IXMLDOMDocument_createNode(doc3, v, _bstr_("cdata"), NULL, &cdata);
9639 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9640 ok(cdata != NULL, "got %p\n", cdata);
9641
9642 EXPECT_NO_CHILDREN(cdata);
9643
9644 /* attribute to cdata */
9645 V_VT(&v) = VT_NULL;
9646 node = (void*)0xdeadbeef;
9647 hr = IXMLDOMNode_insertBefore(cdata, (IXMLDOMNode*)attr, v, &node);
9648 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
9649 ok(node == NULL, "got %p\n", node);
9650
9651 /* document to cdata */
9652 V_VT(&v) = VT_NULL;
9653 node = (void*)0xdeadbeef;
9654 hr = IXMLDOMNode_insertBefore(cdata, (IXMLDOMNode*)doc, v, &node);
9655 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
9656 ok(node == NULL, "got %p\n", node);
9657
9658 V_VT(&v) = VT_NULL;
9659 node = (void*)0xdeadbeef;
9660 hr = IXMLDOMDocument_insertBefore(doc3, cdata, v, &node);
9661 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
9662 ok(node == NULL, "got %p\n", node);
9663
9664 IXMLDOMNode_Release(cdata);
9665 IXMLDOMDocument_Release(doc3);
9666
9667 /* attribute to attribute */
9668 V_VT(&v) = VT_I4;
9669 V_I4(&v) = NODE_ATTRIBUTE;
9670 newnode = NULL;
9671 hr = IXMLDOMDocument_createNode(doc, v, _bstr_("attr2"), NULL, &newnode);
9672 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9673 ok(newnode != NULL, "got %p\n", newnode);
9674
9675 V_VT(&v) = VT_NULL;
9676 node = (void*)0xdeadbeef;
9677 hr = IXMLDOMAttribute_insertBefore(attr, newnode, v, &node);
9678 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
9679 ok(node == NULL, "got %p\n", node);
9680
9681 V_VT(&v) = VT_UNKNOWN;
9682 V_UNKNOWN(&v) = (IUnknown*)attr;
9683 node = (void*)0xdeadbeef;
9684 hr = IXMLDOMAttribute_insertBefore(attr, newnode, v, &node);
9685 todo_wine ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
9686 ok(node == NULL, "got %p\n", node);
9687 IXMLDOMNode_Release(newnode);
9688
9689 /* cdata to attribute */
9690 V_VT(&v) = VT_I4;
9692 newnode = NULL;
9693 hr = IXMLDOMDocument_createNode(doc, v, _bstr_("cdata"), NULL, &newnode);
9694 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9695 ok(newnode != NULL, "got %p\n", newnode);
9696
9697 V_VT(&v) = VT_NULL;
9698 node = (void*)0xdeadbeef;
9699 hr = IXMLDOMAttribute_insertBefore(attr, newnode, v, &node);
9700 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
9701 ok(node == NULL, "got %p\n", node);
9702 IXMLDOMNode_Release(newnode);
9703
9704 /* comment to attribute */
9705 V_VT(&v) = VT_I4;
9706 V_I4(&v) = NODE_COMMENT;
9707 newnode = NULL;
9708 hr = IXMLDOMDocument_createNode(doc, v, _bstr_("cdata"), NULL, &newnode);
9709 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9710 ok(newnode != NULL, "got %p\n", newnode);
9711
9712 V_VT(&v) = VT_NULL;
9713 node = (void*)0xdeadbeef;
9714 hr = IXMLDOMAttribute_insertBefore(attr, newnode, v, &node);
9715 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
9716 ok(node == NULL, "got %p\n", node);
9717 IXMLDOMNode_Release(newnode);
9718
9719 /* element to attribute */
9720 V_VT(&v) = VT_I4;
9721 V_I4(&v) = NODE_ELEMENT;
9722 newnode = NULL;
9723 hr = IXMLDOMDocument_createNode(doc, v, _bstr_("cdata"), NULL, &newnode);
9724 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9725 ok(newnode != NULL, "got %p\n", newnode);
9726
9727 V_VT(&v) = VT_NULL;
9728 node = (void*)0xdeadbeef;
9729 hr = IXMLDOMAttribute_insertBefore(attr, newnode, v, &node);
9730 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
9731 ok(node == NULL, "got %p\n", node);
9732 IXMLDOMNode_Release(newnode);
9733
9734 /* pi to attribute */
9735 V_VT(&v) = VT_I4;
9737 newnode = NULL;
9738 hr = IXMLDOMDocument_createNode(doc, v, _bstr_("cdata"), NULL, &newnode);
9739 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9740 ok(newnode != NULL, "got %p\n", newnode);
9741
9742 V_VT(&v) = VT_NULL;
9743 node = (void*)0xdeadbeef;
9744 hr = IXMLDOMAttribute_insertBefore(attr, newnode, v, &node);
9745 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
9746 ok(node == NULL, "got %p\n", node);
9747 IXMLDOMNode_Release(newnode);
9748 IXMLDOMAttribute_Release(attr);
9749
9750 /* insertBefore for elements */
9751 hr = IXMLDOMDocument_createElement(doc, _bstr_("elem"), &elem1);
9752 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9753
9754 hr = IXMLDOMDocument_createElement(doc, _bstr_("elem2"), &elem2);
9755 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9756
9757 hr = IXMLDOMDocument_createElement(doc, _bstr_("elem3"), &elem3);
9758 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9759
9760 hr = IXMLDOMDocument_createElement(doc, _bstr_("elem3"), &elem3);
9761 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9762
9763 hr = IXMLDOMDocument_createElement(doc, _bstr_("elem4"), &elem4);
9764 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9765
9766 EXPECT_NO_CHILDREN(elem1);
9767 EXPECT_NO_CHILDREN(elem2);
9768 EXPECT_NO_CHILDREN(elem3);
9769
9770 todo_wine EXPECT_REF(elem2, 2);
9771
9772#ifdef __REACTOS__
9773 if (!is_reactos()) {
9774#endif
9775 /* NULL to element */
9776 V_VT(&v) = VT_NULL;
9777 node = (void*)0xdeadbeef;
9778 hr = IXMLDOMElement_insertBefore(elem1, NULL, v, &node);
9779 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
9780 ok(node == (void*)0xdeadbeef, "got %p\n", node);
9781#ifdef __REACTOS__
9782 }
9783#endif
9784
9785 /* document to element */
9786 V_VT(&v) = VT_DISPATCH;
9787 V_DISPATCH(&v) = NULL;
9788 hr = IXMLDOMElement_insertBefore(elem1, (IXMLDOMNode*)doc, v, NULL);
9789 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
9790
9791 V_VT(&v) = VT_DISPATCH;
9792 V_DISPATCH(&v) = NULL;
9793 node = NULL;
9794 hr = IXMLDOMElement_insertBefore(elem1, (IXMLDOMNode*)elem4, v, &node);
9795 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9796 ok(node == (void*)elem4, "got %p\n", node);
9797
9798 EXPECT_CHILDREN(elem1);
9799 hr = IXMLDOMElement_removeChild(elem1, (IXMLDOMNode*)elem4, NULL);
9800 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9801 IXMLDOMElement_Release(elem4);
9802
9803 EXPECT_NO_CHILDREN(elem1);
9804
9805 V_VT(&v) = VT_NULL;
9806 node = NULL;
9807 hr = IXMLDOMElement_insertBefore(elem1, (IXMLDOMNode*)elem2, v, &node);
9808 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9809 ok(node == (void*)elem2, "got %p\n", node);
9810
9811 EXPECT_CHILDREN(elem1);
9812 todo_wine EXPECT_REF(elem2, 3);
9813 IXMLDOMNode_Release(node);
9814
9815 /* again for already linked node */
9816 V_VT(&v) = VT_NULL;
9817 node = NULL;
9818 hr = IXMLDOMElement_insertBefore(elem1, (IXMLDOMNode*)elem2, v, &node);
9819 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9820 ok(node == (void*)elem2, "got %p\n", node);
9821
9822 EXPECT_CHILDREN(elem1);
9823
9824 /* increments each time */
9825 todo_wine EXPECT_REF(elem2, 3);
9826 IXMLDOMNode_Release(node);
9827
9828 /* try to add to another element */
9829 V_VT(&v) = VT_NULL;
9830 node = (void*)0xdeadbeef;
9831 hr = IXMLDOMElement_insertBefore(elem3, (IXMLDOMNode*)elem2, v, &node);
9832 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9833 ok(node == (void*)elem2, "got %p\n", node);
9834
9835 EXPECT_CHILDREN(elem3);
9836 EXPECT_NO_CHILDREN(elem1);
9837
9838 IXMLDOMNode_Release(node);
9839
9840 /* cross document case - try to add as child to a node created with other doc */
9841 doc2 = create_document(&IID_IXMLDOMDocument);
9842
9843 hr = IXMLDOMDocument_createElement(doc2, _bstr_("elem4"), &elem4);
9844 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9845 todo_wine EXPECT_REF(elem4, 2);
9846
9847 /* same name, another instance */
9848 hr = IXMLDOMDocument_createElement(doc2, _bstr_("elem4"), &elem5);
9849 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9850 todo_wine EXPECT_REF(elem5, 2);
9851
9852 todo_wine EXPECT_REF(elem3, 2);
9853 V_VT(&v) = VT_NULL;
9854 node = NULL;
9855 hr = IXMLDOMElement_insertBefore(elem3, (IXMLDOMNode*)elem4, v, &node);
9856 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9857 ok(node == (void*)elem4, "got %p\n", node);
9858 todo_wine EXPECT_REF(elem4, 3);
9859 todo_wine EXPECT_REF(elem3, 2);
9860 IXMLDOMNode_Release(node);
9861
9862 V_VT(&v) = VT_NULL;
9863 node = NULL;
9864 hr = IXMLDOMElement_insertBefore(elem3, (IXMLDOMNode*)elem5, v, &node);
9865 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9866 ok(node == (void*)elem5, "got %p\n", node);
9867 todo_wine EXPECT_REF(elem4, 2);
9868 todo_wine EXPECT_REF(elem5, 3);
9869 IXMLDOMNode_Release(node);
9870
9871 IXMLDOMDocument_Release(doc2);
9872
9873 IXMLDOMElement_Release(elem1);
9874 IXMLDOMElement_Release(elem2);
9875 IXMLDOMElement_Release(elem3);
9876 IXMLDOMElement_Release(elem4);
9877 IXMLDOMElement_Release(elem5);
9878
9879 /* elements with same default namespace */
9880 V_VT(&v) = VT_I4;
9881 V_I4(&v) = NODE_ELEMENT;
9882 elem1 = NULL;
9883 hr = IXMLDOMDocument_createNode(doc, v, _bstr_("elem1"), _bstr_("http://winehq.org/default"), (IXMLDOMNode**)&elem1);
9884 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9885 ok(elem1 != NULL, "got %p\n", elem1);
9886
9887 V_VT(&v) = VT_I4;
9888 V_I4(&v) = NODE_ELEMENT;
9889 elem2 = NULL;
9890 hr = IXMLDOMDocument_createNode(doc, v, _bstr_("elem2"), _bstr_("http://winehq.org/default"), (IXMLDOMNode**)&elem2);
9891 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9892 ok(elem2 != NULL, "got %p\n", elem2);
9893
9894 /* check contents so far */
9895 p = NULL;
9896 hr = IXMLDOMElement_get_xml(elem1, &p);
9897 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9898 ok(!lstrcmpW(p, L"<elem1 xmlns=\"http://winehq.org/default\"/>"), "got %s\n", wine_dbgstr_w(p));
9900
9901 p = NULL;
9902 hr = IXMLDOMElement_get_xml(elem2, &p);
9903 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9904 ok(!lstrcmpW(p, L"<elem2 xmlns=\"http://winehq.org/default\"/>"), "got %s\n", wine_dbgstr_w(p));
9906
9907 V_VT(&v) = VT_NULL;
9908 hr = IXMLDOMElement_insertBefore(elem1, (IXMLDOMNode*)elem2, v, NULL);
9909 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9910
9911 /* get_xml depends on context, for top node it omits child namespace attribute,
9912 but at child level it's still returned */
9913 p = NULL;
9914 hr = IXMLDOMElement_get_xml(elem1, &p);
9915 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9916 todo_wine ok(!lstrcmpW(p, L"<elem1 xmlns=\"http://winehq.org/default\"><elem2/></elem1>"),
9917 "got %s\n", wine_dbgstr_w(p));
9919
9920 p = NULL;
9921 hr = IXMLDOMElement_get_xml(elem2, &p);
9922 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9923 ok(!lstrcmpW(p, L"<elem2 xmlns=\"http://winehq.org/default\"/>"), "got %s\n", wine_dbgstr_w(p));
9925
9926 IXMLDOMElement_Release(elem1);
9927 IXMLDOMElement_Release(elem2);
9928
9929 /* child without default namespace added to node with default namespace */
9930 V_VT(&v) = VT_I4;
9931 V_I4(&v) = NODE_ELEMENT;
9932 elem1 = NULL;
9933 hr = IXMLDOMDocument_createNode(doc, v, _bstr_("elem1"), _bstr_("http://winehq.org/default"), (IXMLDOMNode**)&elem1);
9934 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9935 ok(elem1 != NULL, "got %p\n", elem1);
9936
9937 V_VT(&v) = VT_I4;
9938 V_I4(&v) = NODE_ELEMENT;
9939 elem2 = NULL;
9940 hr = IXMLDOMDocument_createNode(doc, v, _bstr_("elem2"), NULL, (IXMLDOMNode**)&elem2);
9941 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9942 ok(elem2 != NULL, "got %p\n", elem2);
9943
9944 EXPECT_REF(elem2, 1);
9945 V_VT(&v) = VT_NULL;
9946 hr = IXMLDOMElement_insertBefore(elem1, (IXMLDOMNode*)elem2, v, NULL);
9947 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9948 EXPECT_REF(elem2, 1);
9949
9950 p = NULL;
9951 hr = IXMLDOMElement_get_xml(elem2, &p);
9952 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9953 ok(!lstrcmpW(p, L"<elem2/>"), "got %s\n", wine_dbgstr_w(p));
9955
9956 hr = IXMLDOMElement_removeChild(elem1, (IXMLDOMNode*)elem2, NULL);
9957 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9958
9959 p = NULL;
9960 hr = IXMLDOMElement_get_xml(elem2, &p);
9961 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9962 ok(!lstrcmpW(p, L"<elem2/>"), "got %s\n", wine_dbgstr_w(p));
9964
9965 IXMLDOMElement_Release(elem1);
9966 IXMLDOMElement_Release(elem2);
9967 IXMLDOMDocument_Release(doc);
9968}
9969
9970static void test_appendChild(void)
9971{
9972 IXMLDOMDocument *doc, *doc2;
9973 IXMLDOMElement *elem, *elem2;
9974 HRESULT hr;
9975
9976 doc = create_document(&IID_IXMLDOMDocument);
9977 doc2 = create_document(&IID_IXMLDOMDocument);
9978
9979 hr = IXMLDOMDocument_createElement(doc, _bstr_("elem"), &elem);
9980 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9981
9982 hr = IXMLDOMDocument_createElement(doc2, _bstr_("elem2"), &elem2);
9983 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9984
9985 EXPECT_REF(doc, 1);
9987 EXPECT_REF(doc2, 1);
9988 todo_wine EXPECT_REF(elem2, 2);
9989 EXPECT_NO_CHILDREN(doc);
9990 EXPECT_NO_CHILDREN(doc2);
9991
9992 hr = IXMLDOMDocument_appendChild(doc2, NULL, NULL);
9993 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
9994
9995 hr = IXMLDOMElement_appendChild(elem, NULL, NULL);
9996 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
9997
9998 /* append from another document */
9999 hr = IXMLDOMDocument_appendChild(doc2, (IXMLDOMNode*)elem, NULL);
10000 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10001
10002 EXPECT_REF(doc, 1);
10004 EXPECT_REF(doc2, 1);
10005 todo_wine EXPECT_REF(elem2, 2);
10006 EXPECT_NO_CHILDREN(doc);
10007 EXPECT_CHILDREN(doc2);
10008
10009 IXMLDOMElement_Release(elem);
10010 IXMLDOMElement_Release(elem2);
10011 IXMLDOMDocument_Release(doc);
10012 IXMLDOMDocument_Release(doc2);
10013}
10014
10015static void test_get_doctype(void)
10016{
10017 IXMLDOMDocumentType *doctype;
10018 IXMLDOMDocument *doc;
10020 HRESULT hr;
10021 BSTR s;
10022
10023 doc = create_document(&IID_IXMLDOMDocument);
10024
10025 hr = IXMLDOMDocument_get_doctype(doc, NULL);
10026 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
10027
10028 doctype = (void*)0xdeadbeef;
10029 hr = IXMLDOMDocument_get_doctype(doc, &doctype);
10030 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
10031 ok(doctype == NULL, "got %p\n", doctype);
10032
10033 hr = IXMLDOMDocument_loadXML(doc, _bstr_(szEmailXML), &b);
10034 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10035 ok(b == VARIANT_TRUE, "failed to load XML string\n");
10036
10037 doctype = NULL;
10038 hr = IXMLDOMDocument_get_doctype(doc, &doctype);
10039 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10040 ok(doctype != NULL, "got %p\n", doctype);
10041
10042 hr = IXMLDOMDocumentType_get_name(doctype, NULL);
10043 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
10044
10045 hr = IXMLDOMDocumentType_get_name(doctype, &s);
10046 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10047 ok(!lstrcmpW(L"email", s), "got name %s\n", wine_dbgstr_w(s));
10049
10050 hr = IXMLDOMDocumentType_get_nodeName(doctype, &s);
10051 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10052 ok(!lstrcmpW(L"email", s), "got name %s\n", wine_dbgstr_w(s));
10054
10055 IXMLDOMDocumentType_Release(doctype);
10056 IXMLDOMDocument_Release(doc);
10057}
10058
10059static void test_get_tagName(void)
10060{
10061 IXMLDOMDocument *doc;
10062 IXMLDOMElement *elem, *elem2;
10063 HRESULT hr;
10064 BSTR str;
10065
10066 doc = create_document(&IID_IXMLDOMDocument);
10067
10068 hr = IXMLDOMDocument_createElement(doc, _bstr_("element"), &elem);
10069 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10070
10071 hr = IXMLDOMElement_get_tagName(elem, NULL);
10072 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
10073
10074 str = NULL;
10075 hr = IXMLDOMElement_get_tagName(elem, &str);
10076 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10077 ok(!lstrcmpW(str, L"element"), "got %s\n", wine_dbgstr_w(str));
10079
10080 hr = IXMLDOMDocument_createElement(doc, _bstr_("s:element"), &elem2);
10081 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10082
10083 str = NULL;
10084 hr = IXMLDOMElement_get_tagName(elem2, &str);
10085 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10086 ok(!lstrcmpW(str, L"s:element"), "got %s\n", wine_dbgstr_w(str));
10088
10089 IXMLDOMElement_Release(elem);
10090 IXMLDOMElement_Release(elem2);
10091 IXMLDOMDocument_Release(doc);
10092 free_bstrs();
10093}
10094
10095typedef struct {
10097 const char *name;
10100} node_type_t;
10101
10102static const node_type_t get_datatype[] = {
10103 { NODE_ELEMENT, "element", VT_NULL, S_FALSE },
10104 { NODE_ATTRIBUTE, "attr", VT_NULL, S_FALSE },
10105 { NODE_TEXT, "text", VT_NULL, S_FALSE },
10106 { NODE_CDATA_SECTION , "cdata", VT_NULL, S_FALSE },
10107 { NODE_ENTITY_REFERENCE, "entityref", VT_NULL, S_FALSE },
10109 { NODE_COMMENT, "comment", VT_NULL, S_FALSE },
10110 { NODE_DOCUMENT_FRAGMENT, "docfrag", VT_NULL, S_FALSE },
10111 { 0 }
10112};
10113
10114static void test_get_dataType(void)
10115{
10117 IXMLDOMDocument *doc;
10118
10119 doc = create_document(&IID_IXMLDOMDocument);
10120
10121 while (entry->type)
10122 {
10124 VARIANT var, type;
10125 HRESULT hr;
10126
10127 V_VT(&var) = VT_I4;
10128 V_I4(&var) = entry->type;
10129 hr = IXMLDOMDocument_createNode(doc, var, _bstr_(entry->name), NULL, &node);
10130 ok(hr == S_OK, "failed to create node, type %d\n", entry->type);
10131
10132 hr = IXMLDOMNode_get_dataType(node, NULL);
10133 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
10134
10135 VariantInit(&type);
10136 hr = IXMLDOMNode_get_dataType(node, &type);
10137 ok(hr == entry->hr, "Unexpected hr %#lx, expected %#lx. node type %d\n",
10138 hr, entry->hr, entry->type);
10139 ok(V_VT(&type) == entry->vt, "got %d, expected %d. node type %d\n",
10140 V_VT(&type), entry->vt, entry->type);
10142
10143 IXMLDOMNode_Release(node);
10144
10145 entry++;
10146 }
10147
10148 IXMLDOMDocument_Release(doc);
10149 free_bstrs();
10150}
10151
10154 const char *string;
10156
10158 { NODE_ELEMENT, "element" },
10159 { NODE_ATTRIBUTE, "attribute" },
10160 { NODE_TEXT, "text" },
10161 { NODE_CDATA_SECTION , "cdatasection" },
10162 { NODE_ENTITY_REFERENCE, "entityreference" },
10163 { NODE_PROCESSING_INSTRUCTION, "processinginstruction" },
10164 { NODE_COMMENT, "comment" },
10165 { NODE_DOCUMENT_FRAGMENT, "documentfragment" },
10166 { 0 }
10167};
10168
10170{
10172 IXMLDOMDocument *doc;
10173 HRESULT hr;
10174 BSTR str;
10175
10176 doc = create_document(&IID_IXMLDOMDocument);
10177
10178 hr = IXMLDOMDocument_get_nodeTypeString(doc, &str);
10179 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10180 ok(!lstrcmpW(str, L"document"), "got string %s\n", wine_dbgstr_w(str));
10182
10183 while (entry->type)
10184 {
10186 VARIANT var;
10187
10188 V_VT(&var) = VT_I4;
10189 V_I4(&var) = entry->type;
10190 hr = IXMLDOMDocument_createNode(doc, var, _bstr_("node"), NULL, &node);
10191 ok(hr == S_OK, "failed to create node, type %d\n", entry->type);
10192
10193 hr = IXMLDOMNode_get_nodeTypeString(node, NULL);
10194 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
10195
10196 hr = IXMLDOMNode_get_nodeTypeString(node, &str);
10197 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10198 ok(!lstrcmpW(str, _bstr_(entry->string)), "got string %s, expected %s. node type %d\n",
10199 wine_dbgstr_w(str), entry->string, entry->type);
10201 IXMLDOMNode_Release(node);
10202
10203 entry++;
10204 }
10205
10206 IXMLDOMDocument_Release(doc);
10207 free_bstrs();
10208}
10209
10210typedef struct _get_attributes_t {
10214
10217 { NODE_TEXT, S_FALSE },
10221 { NODE_COMMENT, S_FALSE },
10223 { 0 }
10224};
10225
10226static void test_get_attributes(void)
10227{
10228 const WCHAR *namespaces[] =
10229 {
10230 L"xmlns:oslc_am",
10231 L"xmlns:rdf",
10232 L"xmlns:dcterms",
10233 L"xmlns:foaf"
10234 };
10237 IXMLDOMDocument *doc, *doc2;
10238 IXMLDOMNode *node, *node2;
10241 HRESULT hr;
10242 VARIANT v;
10243 BSTR str;
10244 LONG length, i;
10245
10246 doc = create_document(&IID_IXMLDOMDocument);
10247
10248 hr = IXMLDOMDocument_loadXML(doc, _bstr_(complete4A), &b);
10249 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10250
10251 hr = IXMLDOMDocument_get_attributes(doc, NULL);
10252 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
10253
10254 map = (void*)0xdeadbeef;
10255 hr = IXMLDOMDocument_get_attributes(doc, &map);
10256 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
10257 ok(map == NULL, "got %p\n", map);
10258
10259 /* first child is <?xml ?> */
10260 hr = IXMLDOMDocument_get_firstChild(doc, &node);
10261 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10262
10263 hr = IXMLDOMNode_get_attributes(node, &map);
10264 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10265
10266 node2 = (void*)0xdeadbeef;
10267 hr = IXMLDOMNamedNodeMap_getNamedItem(map, _bstr_("attr"), &node2);
10268 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
10269 ok(node2 == NULL, "got %p\n", node2);
10270
10271 length = -1;
10272 hr = IXMLDOMNamedNodeMap_get_length(map, &length);
10273 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10274 todo_wine ok(length == 1, "got %ld\n", length);
10275
10276 if (hr == S_OK && length == 1)
10277 {
10280 VARIANT v;
10281
10282 node2 = NULL;
10283 hr = IXMLDOMNamedNodeMap_get_item(map, 0, &node2);
10284 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10285 ok(node != NULL, "got %p\n", node2);
10286
10287 hr = IXMLDOMNode_get_nodeName(node2, &str);
10288 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10289 ok(!lstrcmpW(str, L"version"), "got %s\n", wine_dbgstr_w(str));
10291
10292 length = -1;
10293 hr = IXMLDOMNamedNodeMap_get_length(map, &length);
10294 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10295 ok(length == 1, "got %ld\n", length);
10296
10297 type = -1;
10298 hr = IXMLDOMNode_get_nodeType(node2, &type);
10299 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10300 ok(type == NODE_ATTRIBUTE, "got %d\n", type);
10301
10302 hr = IXMLDOMNode_get_xml(node, &str);
10303 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10304 ok(!lstrcmpW(str, L"<?xml version=\"1.0\"?>"), "got %s\n", wine_dbgstr_w(str));
10306
10307 hr = IXMLDOMNode_get_text(node, &str);
10308 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10309 ok(!lstrcmpW(str, L"version=\"1.0\""), "got %s\n", wine_dbgstr_w(str));
10311
10312 hr = IXMLDOMNamedNodeMap_removeNamedItem(map, _bstr_("version"), NULL);
10313 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10314
10315 length = -1;
10316 hr = IXMLDOMNamedNodeMap_get_length(map, &length);
10317 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10318 ok(length == 0, "got %ld\n", length);
10319
10320 hr = IXMLDOMNode_get_xml(node, &str);
10321 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10322 ok(!lstrcmpW(str, L"<?xml version=\"1.0\"?>"), "got %s\n", wine_dbgstr_w(str));
10324
10325 hr = IXMLDOMNode_get_text(node, &str);
10326 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10327 ok(!lstrcmpW(str, L""), "got %s\n", wine_dbgstr_w(str));
10329
10330 IXMLDOMNamedNodeMap_Release(map);
10331
10332 hr = IXMLDOMNode_get_attributes(node, &map);
10333 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10334
10335 length = -1;
10336 hr = IXMLDOMNamedNodeMap_get_length(map, &length);
10337 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10338 ok(length == 0, "got %ld\n", length);
10339
10340 hr = IXMLDOMDocument_createAttribute(doc, _bstr_("encoding"), &attr);
10341 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10342
10343 V_VT(&v) = VT_BSTR;
10344 V_BSTR(&v) = _bstr_("UTF-8");
10345 hr = IXMLDOMAttribute_put_nodeValue(attr, v);
10346 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10347
10348 EXPECT_REF(attr, 2);
10349 hr = IXMLDOMNamedNodeMap_setNamedItem(map, (IXMLDOMNode*)attr, NULL);
10350 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10351 EXPECT_REF(attr, 2);
10352
10353 hr = IXMLDOMNode_get_attributes(node, &map);
10354 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10355
10356 length = -1;
10357 hr = IXMLDOMNamedNodeMap_get_length(map, &length);
10358 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10359 ok(length == 1, "got %ld\n", length);
10360
10361 hr = IXMLDOMNode_get_xml(node, &str);
10362 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10363 ok(!lstrcmpW(str, L"<?xml version=\"1.0\"?>"), "got %s\n", wine_dbgstr_w(str));
10365
10366 hr = IXMLDOMNode_get_text(node, &str);
10367 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10368 ok(!lstrcmpW(str, L"encoding=\"UTF-8\""), "got %s\n", wine_dbgstr_w(str));
10370
10371 IXMLDOMNamedNodeMap_Release(map);
10372 IXMLDOMNode_Release(node2);
10373 }
10374
10375 IXMLDOMNode_Release(node);
10376
10377 /* last child is element */
10378 EXPECT_REF(doc, 1);
10379 hr = IXMLDOMDocument_get_lastChild(doc, &node);
10380 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10381 EXPECT_REF(doc, 1);
10382
10383 EXPECT_REF(node, 1);
10384 hr = IXMLDOMNode_get_attributes(node, &map);
10385 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10386 EXPECT_REF(node, 1);
10387 EXPECT_REF(doc, 1);
10388
10389 EXPECT_REF(map, 1);
10390 hr = IXMLDOMNamedNodeMap_get_item(map, 0, &node2);
10391 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10392 EXPECT_REF(node, 1);
10393 EXPECT_REF(node2, 1);
10394 EXPECT_REF(map, 1);
10395 EXPECT_REF(doc, 1);
10396 IXMLDOMNode_Release(node2);
10397
10398 /* release node before map release, map still works */
10399 IXMLDOMNode_Release(node);
10400
10401 length = 0;
10402 hr = IXMLDOMNamedNodeMap_get_length(map, &length);
10403 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10404 ok(length == 1, "got %ld\n", length);
10405
10406 node2 = NULL;
10407 hr = IXMLDOMNamedNodeMap_get_item(map, 0, &node2);
10408 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10409 EXPECT_REF(node2, 1);
10410 IXMLDOMNode_Release(node2);
10411
10412 IXMLDOMNamedNodeMap_Release(map);
10413
10414 /* append created element a different document, map still works */
10415 hr = IXMLDOMDocument_createElement(doc, _bstr_("test"), &elem);
10416 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10417
10418 V_VT(&v) = VT_I4;
10419 V_I4(&v) = 1;
10420 hr = IXMLDOMElement_setAttribute(elem, _bstr_("testattr"), v);
10421 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10422
10423 hr = IXMLDOMElement_get_attributes(elem, &map);
10424 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10425
10426 length = 0;
10427 hr = IXMLDOMNamedNodeMap_get_length(map, &length);
10428 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10429 ok(length == 1, "got %ld\n", length);
10430
10431 doc2 = create_document(&IID_IXMLDOMDocument);
10432
10433 hr = IXMLDOMDocument_appendChild(doc2, (IXMLDOMNode*)elem, &node);
10434 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10435 ok(node == (IXMLDOMNode*)elem, "node != elem\n");
10436 IXMLDOMNode_Release(node);
10437 IXMLDOMElement_Release(elem);
10438 IXMLDOMDocument_Release(doc2);
10439
10440 length = 0;
10441 hr = IXMLDOMNamedNodeMap_get_length(map, &length);
10442 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10443 ok(length == 1, "got %ld\n", length);
10444
10445 IXMLDOMNamedNodeMap_Release(map);
10446
10447 while (entry->type)
10448 {
10449 VARIANT var;
10450
10451 node = NULL;
10452
10453 V_VT(&var) = VT_I4;
10454 V_I4(&var) = entry->type;
10455 hr = IXMLDOMDocument_createNode(doc, var, _bstr_("node"), NULL, &node);
10456 ok(hr == S_OK, "failed to create node, type %d\n", entry->type);
10457
10458 hr = IXMLDOMNode_get_attributes(node, NULL);
10459 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
10460
10461 map = (void*)0xdeadbeef;
10462 hr = IXMLDOMNode_get_attributes(node, &map);
10463 ok(hr == entry->hr, "Unexpected hr %#lx, expected %#lx. node type %d\n",
10464 hr, entry->hr, entry->type);
10465 ok(map == NULL, "got %p\n", map);
10466
10467 IXMLDOMNode_Release(node);
10468
10469 entry++;
10470 }
10471
10472 IXMLDOMDocument_Release(doc);
10473
10474 str = SysAllocString(L"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
10475 L"<rdf:RDF xmlns:oslc_am=\"http://open-services.net/ns/am#\""
10476 L" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\""
10477 L" xmlns:dcterms=\"http://purl.org/dc/terms/\""
10478 L" xmlns:foaf=\"http://xmlns.com/foaf/0.1/\" >"
10479 L"</rdf:RDF>");
10480
10481 doc = create_document(&IID_IXMLDOMDocument2);
10482
10483 hr = IXMLDOMDocument_loadXML(doc, str, &b);
10484 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10485 ok(b == VARIANT_TRUE, "got %d\n", b);
10486
10487 hr = IXMLDOMDocument_get_documentElement(doc, &elem);
10488 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10489
10490 hr = IXMLDOMElement_get_attributes(elem, &map);
10491 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10492
10493 length = -1;
10494 hr = IXMLDOMNamedNodeMap_get_length(map, &length);
10495 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10496 ok(length == 4, "length %#lx.\n", length);
10497
10498 for(i=0; i < length; i++)
10499 {
10500 hr = IXMLDOMNamedNodeMap_get_item(map, i, &node2);
10501 ok( hr == S_OK, "Unexpected hr %#lx (%ld).\n", hr, i);
10502
10503 hr = IXMLDOMNode_get_nodeName(node2, &str);
10504 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10505 ok(!lstrcmpW(str, namespaces[i]), "got %s\n", wine_dbgstr_w(str));
10507
10508 IXMLDOMNode_Release(node2);
10509 }
10510
10511 IXMLDOMNamedNodeMap_Release(map);
10512 IXMLDOMElement_Release(elem);
10513
10514 IXMLDOMDocument_Release(doc);
10515
10516 free_bstrs();
10517}
10518
10519static void test_selection(void)
10520{
10521 IXMLDOMSelection *selection, *selection2;
10522 IEnumVARIANT *enum1, *enum2, *enum3;
10524 IUnknown *unk1, *unk2;
10525 IXMLDOMDocument *doc;
10526 IDispatchEx *dispex;
10528 IDispatch *disp;
10530 VARIANT v[3];
10531 HRESULT hr;
10532 DISPID did;
10533 BSTR name;
10534 ULONG ret;
10535 LONG len;
10536
10537 doc = create_document(&IID_IXMLDOMDocument);
10538
10539 hr = IXMLDOMDocument_loadXML(doc, _bstr_(szExampleXML), &b);
10540 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10541
10542 hr = IXMLDOMDocument_selectNodes(doc, _bstr_("root"), &list);
10543 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10544
10545 hr = IXMLDOMNodeList_QueryInterface(list, &IID_IXMLDOMSelection, (void**)&selection);
10546 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10547 IXMLDOMSelection_Release(selection);
10548
10549 /* collection disp id */
10550 hr = IXMLDOMSelection_QueryInterface(selection, &IID_IDispatchEx, (void**)&dispex);
10551 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10552 did = 0;
10553 hr = IDispatchEx_GetDispID(dispex, _bstr_("0"), 0, &did);
10554 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10555 ok(did == DISPID_DOM_COLLECTION_BASE, "got %ld\n", did);
10556 len = 0;
10557 hr = IXMLDOMSelection_get_length(selection, &len);
10558 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10559 ok(len == 1, "got %ld\n", len);
10560 hr = IDispatchEx_GetDispID(dispex, _bstr_("10"), 0, &did);
10561 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10562 ok(did == DISPID_DOM_COLLECTION_BASE+10, "got %ld\n", did);
10563 IDispatchEx_Release(dispex);
10564
10565 /* IEnumVARIANT tests */
10566 enum1 = NULL;
10567 hr = IXMLDOMSelection_QueryInterface(selection, &IID_IEnumVARIANT, (void**)&enum1);
10568 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10569 ok(enum1 != NULL, "got %p\n", enum1);
10570 EXPECT_REF(enum1, 2);
10571
10573 hr = IXMLDOMSelection_QueryInterface(selection, &IID_IUnknown, (void**)&unk1);
10574 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10576 EXPECT_REF(enum1, 2);
10577
10578 /* enumerator and selection object return same IUnknown* */
10579 hr = IEnumVARIANT_QueryInterface(enum1, &IID_IUnknown, (void**)&unk2);
10580 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10582 EXPECT_REF(enum1, 2);
10583 ok(unk2 == unk1, "got %p, %p\n", unk1, unk2);
10584 IUnknown_Release(unk2);
10585
10587 IEnumVARIANT_AddRef(enum1);
10589 IEnumVARIANT_Release(enum1);
10590
10591 enum3 = NULL;
10592 hr = IXMLDOMSelection_QueryInterface(selection, &IID_IEnumVARIANT, (void**)&enum3);
10593 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10594 ok(enum3 != NULL, "got %p\n", enum3);
10595 ok(enum1 == enum3, "got %p and %p\n", enum1, enum3);
10596 EXPECT_REF(enum1, 3);
10597 IEnumVARIANT_Release(enum3);
10598
10600 EXPECT_REF(enum1, 2);
10601
10602 enum2 = NULL;
10603 hr = IXMLDOMSelection_get__newEnum(selection, (IUnknown**)&enum2);
10604 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10605 ok(enum2 != NULL, "got %p\n", enum2);
10606
10608 EXPECT_REF(enum1, 2);
10609 EXPECT_REF(enum2, 1);
10610
10611 ok(enum1 != enum2, "got %p, %p\n", enum1, enum2);
10612
10613 hr = IEnumVARIANT_QueryInterface(enum2, &IID_IUnknown, (void**)&unk2);
10614 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10616 EXPECT_REF(enum2, 2);
10617 ok(unk2 != unk1, "got %p, %p\n", unk1, unk2);
10618 IUnknown_Release(unk2);
10619 IUnknown_Release(unk1);
10620
10621 selection2 = NULL;
10622 hr = IEnumVARIANT_QueryInterface(enum1, &IID_IXMLDOMSelection, (void**)&selection2);
10623 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10624 ok(selection2 == selection, "got %p and %p\n", selection, selection2);
10626 EXPECT_REF(enum1, 2);
10627
10628 IXMLDOMSelection_Release(selection2);
10629
10630 hr = IEnumVARIANT_QueryInterface(enum1, &IID_IDispatch, (void**)&disp);
10631 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10633 IDispatch_Release(disp);
10634
10635 hr = IEnumVARIANT_QueryInterface(enum1, &IID_IEnumVARIANT, (void**)&enum3);
10636 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10637 ok(enum3 == enum1, "got %p and %p\n", enum3, enum1);
10639 EXPECT_REF(enum1, 3);
10640
10641 IEnumVARIANT_Release(enum1);
10642 IEnumVARIANT_Release(enum2);
10643 IEnumVARIANT_Release(enum3);
10644
10645 enum1 = NULL;
10646 hr = IXMLDOMSelection_get__newEnum(selection, (IUnknown**)&enum1);
10647 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10648 ok(enum1 != NULL, "got %p\n", enum1);
10649 EXPECT_REF(enum1, 1);
10651
10652 enum2 = NULL;
10653 hr = IXMLDOMSelection_get__newEnum(selection, (IUnknown**)&enum2);
10654 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10655 ok(enum2 != NULL, "got %p\n", enum2);
10656 EXPECT_REF(enum2, 1);
10658
10659 ok(enum1 != enum2, "got %p, %p\n", enum1, enum2);
10660
10661 IEnumVARIANT_AddRef(enum1);
10663 EXPECT_REF(enum1, 2);
10664 EXPECT_REF(enum2, 1);
10665 IEnumVARIANT_Release(enum1);
10666
10667 IEnumVARIANT_Release(enum1);
10668 IEnumVARIANT_Release(enum2);
10669
10671
10672 IXMLDOMNodeList_Release(list);
10673
10674 hr = IXMLDOMDocument_get_childNodes(doc, &list);
10675 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10676
10677 hr = IXMLDOMNodeList_QueryInterface(list, &IID_IXMLDOMSelection, (void**)&selection);
10678 ok(hr == E_NOINTERFACE, "Unexpected hr %#lx.\n", hr);
10679
10680 IXMLDOMNodeList_Release(list);
10681
10682 /* test if IEnumVARIANT touches selection context */
10683 hr = IXMLDOMDocument_loadXML(doc, _bstr_(xpath_simple_list), &b);
10684 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10685
10686 hr = IXMLDOMDocument_selectNodes(doc, _bstr_("root/*"), &list);
10687 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10688
10689 hr = IXMLDOMNodeList_QueryInterface(list, &IID_IXMLDOMSelection, (void**)&selection);
10690 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10691
10692 len = 0;
10693 hr = IXMLDOMSelection_get_length(selection, &len);
10694 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10695 ok(len == 4, "got %ld\n", len);
10696
10697 enum1 = NULL;
10698 hr = IXMLDOMSelection_get__newEnum(selection, (IUnknown**)&enum1);
10699 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10700
10701 /* no-op if zero count */
10702 V_VT(&v[0]) = VT_I2;
10703 hr = IEnumVARIANT_Next(enum1, 0, &v[0], NULL);
10704 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10705 ok(V_VT(&v[0]) == VT_I2, "got var type %d\n", V_VT(&v[0]));
10706
10707 /* positive count, null array pointer */
10708 hr = IEnumVARIANT_Next(enum1, 1, NULL, NULL);
10709 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
10710
10711 hr = IEnumVARIANT_Next(enum1, 1, NULL, &ret);
10712 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
10713 ok(ret == 0, "got %ld\n", ret);
10714
10715 V_VT(&v[0]) = VT_I2;
10716 hr = IEnumVARIANT_Next(enum1, 1, &v[0], NULL);
10717 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10718 ok(V_VT(&v[0]) == VT_DISPATCH, "got var type %d\n", V_VT(&v[0]));
10719
10720 hr = IDispatch_QueryInterface(V_DISPATCH(&v[0]), &IID_IXMLDOMNode, (void**)&node);
10721 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10722 hr = IXMLDOMNode_get_nodeName(node, &name);
10723 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10724 ok(!lstrcmpW(name, L"a"), "got node name %s\n", wine_dbgstr_w(name));
10726 IXMLDOMNode_Release(node);
10727 VariantClear(&v[0]);
10728
10729 /* list cursor is updated */
10730 hr = IXMLDOMSelection_nextNode(selection, &node);
10731 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10732 hr = IXMLDOMNode_get_nodeName(node, &name);
10733 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10734 ok(!lstrcmpW(name, L"c"), "got node name %s\n", wine_dbgstr_w(name));
10735 IXMLDOMNode_Release(node);
10737
10738 V_VT(&v[0]) = VT_I2;
10739 hr = IEnumVARIANT_Next(enum1, 1, &v[0], NULL);
10740 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10741 ok(V_VT(&v[0]) == VT_DISPATCH, "got var type %d\n", V_VT(&v[0]));
10742 hr = IDispatch_QueryInterface(V_DISPATCH(&v[0]), &IID_IXMLDOMNode, (void**)&node);
10743 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10744 hr = IXMLDOMNode_get_nodeName(node, &name);
10745 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10746 ok(!lstrcmpW(name, L"b"), "got node name %s\n", wine_dbgstr_w(name));
10748 IXMLDOMNode_Release(node);
10749 VariantClear(&v[0]);
10750
10751 hr = IXMLDOMSelection_nextNode(selection, &node);
10752 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10753 hr = IXMLDOMNode_get_nodeName(node, &name);
10754 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10755 ok(!lstrcmpW(name, L"d"), "got node name %s\n", wine_dbgstr_w(name));
10756 IXMLDOMNode_Release(node);
10758
10759 hr = IEnumVARIANT_Reset(enum1);
10760 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10761
10762 /* getting multiple elements */
10763 V_VT(&v[1]) = VT_EMPTY;
10764 V_VT(&v[0]) = VT_EMPTY;
10765 hr = IEnumVARIANT_Next(enum1, 2, v, &ret);
10766 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10767 ok(ret == 2, "got %ld, expected 2\n", ret);
10768 ok(V_VT(&v[0]) == VT_DISPATCH, "got var type %d\n", V_VT(&v[0]));
10769 ok(V_VT(&v[1]) == VT_DISPATCH, "got var type %d\n", V_VT(&v[1]));
10770
10771 hr = IDispatch_QueryInterface(V_DISPATCH(&v[0]), &IID_IXMLDOMNode, (void**)&node);
10772 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10773 hr = IXMLDOMNode_get_nodeName(node, &name);
10774 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10775 ok(!lstrcmpW(name, L"a"), "got node name %s\n", wine_dbgstr_w(name));
10777 IXMLDOMNode_Release(node);
10778
10779 hr = IDispatch_QueryInterface(V_DISPATCH(&v[1]), &IID_IXMLDOMNode, (void**)&node);
10780 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10781 hr = IXMLDOMNode_get_nodeName(node, &name);
10782 ok(!lstrcmpW(name, L"b"), "got node name %s\n", wine_dbgstr_w(name));
10784 IXMLDOMNode_Release(node);
10785
10786 VariantClear(&v[1]);
10787 VariantClear(&v[0]);
10788
10789 /* IEnumVARIANT_Next makes the IXMLDOMSelection cursor advance one step more */
10790#ifdef __REACTOS__
10791 if (!is_reactos()) {
10792#endif
10793 hr = IXMLDOMSelection_nextNode(selection, &node);
10794 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10795 hr = IXMLDOMNode_get_nodeName(node, &name);
10796 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10797 ok(!lstrcmpW(name, L"d"), "got node name %s\n", wine_dbgstr_w(name));
10799 IXMLDOMNode_Release(node);
10800#ifdef __REACTOS__
10801 }
10802#endif
10803
10804 /* The IEnumVARIANT cursor is still at position '2', */
10805 /* therefore attempting to fetch 4 elements yields 'c' and 'd' */
10806 V_VT(&v[2]) = VT_NULL;
10807 V_VT(&v[1]) = VT_EMPTY;
10808 V_VT(&v[0]) = VT_EMPTY;
10809 hr = IEnumVARIANT_Next(enum1, 4, v, &ret);
10810 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
10811 ok(ret == 2, "got %ld, expected 2\n", ret);
10812
10813#ifdef __REACTOS__
10814 if (!is_reactos()) {
10815#endif
10816 ok(V_VT(&v[0]) == VT_DISPATCH, "got var type %d\n", V_VT(&v[0]));
10817 hr = IDispatch_QueryInterface(V_DISPATCH(&v[0]), &IID_IXMLDOMNode, (void**)&node);
10818 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10819 hr = IXMLDOMNode_get_nodeName(node, &name);
10820 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10821 ok(!lstrcmpW(name, L"c"), "got node name %s\n", wine_dbgstr_w(name));
10823 IXMLDOMNode_Release(node);
10824#ifdef __REACTOS__
10825 }
10826#endif
10827
10828 ok(V_VT(&v[1]) == VT_DISPATCH, "got var type %d\n", V_VT(&v[1]));
10829 hr = IDispatch_QueryInterface(V_DISPATCH(&v[1]), &IID_IXMLDOMNode, (void**)&node);
10830 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10831 hr = IXMLDOMNode_get_nodeName(node, &name);
10832 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10833 ok(!lstrcmpW(name, L"d"), "got node name %s\n", wine_dbgstr_w(name));
10835 IXMLDOMNode_Release(node);
10836
10837 ok(V_VT(&v[2]) == VT_EMPTY, "got var type %d, expected %d (VT_EMPTY)\n", V_VT(&v[2]), VT_EMPTY);
10838
10839 VariantClear(&v[1]);
10840 VariantClear(&v[0]);
10841
10842 IEnumVARIANT_Release(enum1);
10843
10844 IXMLDOMSelection_Release(selection);
10845 IXMLDOMNodeList_Release(list);
10846#ifdef __REACTOS__
10847 if (!is_reactos())
10848#endif
10849 IXMLDOMDocument_Release(doc);
10850
10851 free_bstrs();
10852}
10853
10854static void write_to_file(const char *name, const char *data)
10855{
10856 DWORD written;
10857 HANDLE hfile;
10858 BOOL ret;
10859
10861 ok(hfile != INVALID_HANDLE_VALUE, "failed to create test file: %s\n", name);
10862
10863 ret = WriteFile(hfile, data, strlen(data), &written, NULL);
10864 ok(ret, "WriteFile failed: %s, %ld\n", name, GetLastError());
10865
10866 CloseHandle(hfile);
10867}
10868
10869#define TEST_DOC_LOAD_FROM_PATH(doc,path,expected_hr, expected_ret) \
10870 _test_doc_load_from_path(doc, path, expected_hr, expected_ret, __LINE__)
10871static void _test_doc_load_from_path(IXMLDOMDocument *doc, const char *path,
10872 HRESULT expected_hr, VARIANT_BOOL expected_ret, int line)
10873{
10874 IXMLDOMDocument *doc2;
10876 BSTR url, url2;
10878 VARIANT src;
10879 HRESULT hr;
10880
10881 url = _bstr_(path);
10882
10883 V_VT(&src) = VT_BSTR;
10884 V_BSTR(&src) = url;
10885 hr = IXMLDOMDocument_load(doc, src, &b);
10886 ok_(__FILE__, line)(hr == expected_hr, "Failed to load document, %#lx.\n", hr);
10887 ok_(__FILE__, line)(b == expected_ret, "got %d\n", b);
10888
10889 V_VT(&src) = VT_BSTR | VT_BYREF;
10890 V_BSTRREF(&src) = &url;
10891 hr = IXMLDOMDocument_load(doc, src, &b);
10892 ok_(__FILE__, line)(hr == expected_hr, "Failed to load document, %#lx.\n", hr);
10893 ok_(__FILE__, line)(b == expected_ret, "got %d\n", b);
10894
10895 if (expected_hr != S_OK)
10896 return;
10897
10898 url = NULL;
10899 hr = IXMLDOMDocument_get_url(doc, &url);
10900 ok_(__FILE__, line)(hr == S_OK, "Failed to get document url, hr %#lx.\n", hr);
10901
10902 hr = IXMLDOMDocument_get_documentElement(doc, &elem);
10903 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10904
10905 /* Create another instance for the same document, check url */
10906#ifdef __REACTOS__
10907 if (!is_reactos()) {
10908#endif
10909 hr = IXMLDOMElement_get_ownerDocument(elem, &doc2);
10910 ok_(__FILE__, line)(hr == S_OK, "Failed to get owner document, hr %#lx.\n", hr);
10911
10912 hr = IXMLDOMDocument_get_url(doc2, &url2);
10913 ok_(__FILE__, line)(hr == S_OK, "Failed to get document url, hr %#lx.\n", hr);
10914 ok_(__FILE__, line)(!lstrcmpW(url, url2), "Unexpected url %s.\n", wine_dbgstr_w(url2));
10915
10916 IXMLDOMDocument_Release(doc2);
10917 IXMLDOMElement_Release(elem);
10919#ifdef __REACTOS__
10920 }
10921#endif
10923}
10924
10925static void url_forward_slash(char *url)
10926{
10927 char *p = url;
10928
10929 while (*p)
10930 {
10931 if (*p == '\\')
10932 *p = '/';
10933 p++;
10934 }
10935}
10936
10937static void test_load(void)
10938{
10939 char path[MAX_PATH], path2[MAX_PATH];
10941 IXMLDOMDocument *doc;
10942 BSTR bstr1, bstr2;
10943 IStream *stream;
10945 VARIANT src;
10946 HRESULT hr;
10947 void* ptr;
10948 int n;
10949 struct encoding_test
10950 {
10951 const char *xml;
10952 HRESULT expected_hr;
10953 VARIANT_BOOL expected_ret;
10954 } encoding_tests[] =
10955 {
10956 { gbkxml, S_OK, VARIANT_TRUE },
10957 { iso8859_1_xml, S_OK, VARIANT_TRUE },
10958 { win1252xml, S_OK, VARIANT_TRUE },
10959 { win936xml, S_FALSE, VARIANT_FALSE },
10960 };
10961
10962
10964 strcat(path, "winetest.xml");
10965
10966 /* prepare a file */
10968
10969 doc = create_document(&IID_IXMLDOMDocument);
10970
10971 /* null pointer as input */
10972 V_VT(&src) = VT_UNKNOWN;
10973 V_UNKNOWN(&src) = NULL;
10974 hr = IXMLDOMDocument_load(doc, src, &b);
10975 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
10976 ok(b == VARIANT_FALSE, "got %d\n", b);
10977
10978 /* "file://" url */
10979 strcpy(path2, "file://");
10980 strcat(path2, path);
10981 TEST_DOC_LOAD_FROM_PATH(doc, path2, S_OK, VARIANT_TRUE);
10982
10983 /* file:// url, forward slashes */
10985 TEST_DOC_LOAD_FROM_PATH(doc, path2, S_OK, VARIANT_TRUE);
10986
10987 /* "file:/" url */
10988 strcpy(path2, "file:/");
10989 strcat(path2, path);
10990 TEST_DOC_LOAD_FROM_PATH(doc, path, S_OK, VARIANT_TRUE);
10991
10992 /* file:/ with forward slashes. */
10994 TEST_DOC_LOAD_FROM_PATH(doc, path2, S_OK, VARIANT_TRUE);
10995
10996 /* Regular local path. */
10997 TEST_DOC_LOAD_FROM_PATH(doc, path, S_OK, VARIANT_TRUE);
10998
10999 /* load from a path: VT_BSTR|VT_BYREF, null ptr */
11000 V_VT(&src) = VT_BSTR | VT_BYREF;
11001 V_BSTRREF(&src) = NULL;
11002 hr = IXMLDOMDocument_load(doc, src, &b);
11003 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
11004 ok(b == VARIANT_FALSE, "got %d\n", b);
11005
11006 bstr1 = NULL;
11007 hr = IXMLDOMDocument_get_url(doc, &bstr1);
11008 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11009 SysFreeString(bstr1);
11010
11011 /* Regular local path with some URL encoded characters. */
11012 strcpy(path2, path);
11013 n = strlen(path2);
11014 strcpy(&path2[n-1], "%6C"); /* C:\path\to\winetest.xm%6C */
11015 TEST_DOC_LOAD_FROM_PATH(doc, path2, S_OK, VARIANT_TRUE);
11016
11017 /* Both spaces and %20s work. */
11019 strcat(path2, "wine test.xml");
11021 TEST_DOC_LOAD_FROM_PATH(doc, path2, S_OK, VARIANT_TRUE);
11023 strcat(path2, "wine%20test.xml");
11024 TEST_DOC_LOAD_FROM_PATH(doc, path2, S_OK, VARIANT_TRUE);
11026
11028
11029 /* load from existing path, no xml content */
11031
11032 V_VT(&src) = VT_BSTR;
11033 V_BSTR(&src) = _bstr_(path);
11034 b = VARIANT_TRUE;
11035 hr = IXMLDOMDocument_load(doc, src, &b);
11036 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
11037 ok(b == VARIANT_FALSE, "got %d\n", b);
11038
11039 bstr1 = (void *)0xdeadbeef;
11040 hr = IXMLDOMDocument_get_url(doc, &bstr1);
11041 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
11042 ok(bstr1 == NULL, "got %p\n", bstr1);
11043
11045 IXMLDOMDocument_Release(doc);
11046
11047 doc = create_document(&IID_IXMLDOMDocument);
11048
11049 hr = IXMLDOMDocument_loadXML(doc, _bstr_(szExampleXML), &b);
11050 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11051 ok(b == VARIANT_TRUE, "got %d\n", b);
11052
11053 hr = IXMLDOMDocument_selectNodes(doc, _bstr_("//*"), &list);
11054 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11055 bstr1 = _bstr_(list_to_string(list));
11056
11057 hr = IXMLDOMNodeList_reset(list);
11058 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11059
11060 IXMLDOMDocument_Release(doc);
11061
11062 doc = create_document(&IID_IXMLDOMDocument);
11063
11064 VariantInit(&src);
11066 V_VT(&src) = VT_ARRAY|VT_UI1;
11067 ok(V_ARRAY(&src) != NULL, "SafeArrayCreateVector() returned NULL\n");
11068 ptr = NULL;
11070 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11071 ok(ptr != NULL, "SafeArrayAccessData() returned NULL\n");
11072
11075 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11076
11077 hr = IXMLDOMDocument_load(doc, src, &b);
11078 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11079 ok(b == VARIANT_TRUE, "got %d\n", b);
11080
11081 hr = IXMLDOMDocument_selectNodes(doc, _bstr_("//*"), &list);
11082 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11083 bstr2 = _bstr_(list_to_string(list));
11084
11085 hr = IXMLDOMNodeList_reset(list);
11086 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11087
11088 ok(lstrcmpW(bstr1, bstr2) == 0, "strings not equal: %s : %s\n",
11089 wine_dbgstr_w(bstr1), wine_dbgstr_w(bstr2));
11090
11091 IXMLDOMDocument_Release(doc);
11092 IXMLDOMNodeList_Release(list);
11093 VariantClear(&src);
11094
11095 /* UTF-16 isn't accepted */
11096 doc = create_document(&IID_IXMLDOMDocument);
11097
11099 V_VT(&src) = VT_ARRAY|VT_UI1;
11100 ok(V_ARRAY(&src) != NULL, "SafeArrayCreateVector() returned NULL\n");
11101 ptr = NULL;
11103 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11104 ok(ptr != NULL, "SafeArrayAccessData() returned NULL\n");
11105
11108 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11109
11110 hr = IXMLDOMDocument_load(doc, src, &b);
11111 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
11112 ok(b == VARIANT_FALSE, "got %d\n", b);
11113
11114 VariantClear(&src);
11115
11116 /* it doesn't like it as a VT_ARRAY|VT_UI2 either */
11118 V_VT(&src) = VT_ARRAY|VT_UI2;
11119 ok(V_ARRAY(&src) != NULL, "SafeArrayCreateVector() returned NULL\n");
11120 ptr = NULL;
11122 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11123 ok(ptr != NULL, "SafeArrayAccessData() returned NULL\n");
11124
11127 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11128
11129 hr = IXMLDOMDocument_load(doc, src, &b);
11130 todo_wine ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
11131 ok(b == VARIANT_FALSE, "got %d\n", b);
11132
11133 VariantClear(&src);
11134
11135 /* test istream with empty content */
11137 V_VT(&src) = VT_UNKNOWN;
11139 b = VARIANT_TRUE;
11140 hr = IXMLDOMDocument_load(doc, src, &b);
11141 todo_wine ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
11142 ok(b == VARIANT_FALSE, "got %d\n", b);
11144 VariantClear(&src);
11145
11146 /* test istream with valid xml */
11148 V_VT(&src) = VT_UNKNOWN;
11150 b = VARIANT_FALSE;
11151 hr = IXMLDOMDocument_load(doc, src, &b);
11152 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11153 ok(b == VARIANT_TRUE, "got %d\n", b);
11155 VariantClear(&src);
11156
11157 IXMLDOMDocument_Release(doc);
11158
11159 /* Encoding tests. */
11160 for (n = 0; n < ARRAY_SIZE(encoding_tests); n++)
11161 {
11163 strcat(path, "codepage_test.xml");
11164 write_to_file(path, encoding_tests[n].xml);
11165 doc = create_document(&IID_IXMLDOMDocument);
11166 TEST_DOC_LOAD_FROM_PATH(doc, path, encoding_tests[n].expected_hr, encoding_tests[n].expected_ret);
11168 IXMLDOMDocument_Release(doc);
11169 }
11170
11171 free_bstrs();
11172}
11173
11175{
11177 IDispatchEx *dispex;
11178 IUnknown *unk;
11179 DWORD props;
11180 UINT ticnt;
11181 HRESULT hr;
11182 BSTR name;
11183
11184 hr = IUnknown_QueryInterface(obj, &IID_IDispatchEx, (void**)&dispex);
11185 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11186 if (FAILED(hr)) return;
11187
11188 ticnt = 0;
11189 hr = IDispatchEx_GetTypeInfoCount(dispex, &ticnt);
11190 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11191 ok(ticnt == 1, "ticnt=%u\n", ticnt);
11192
11193 name = SysAllocString(L"*");
11194 hr = IDispatchEx_DeleteMemberByName(dispex, name, fdexNameCaseSensitive);
11195 ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr);
11197
11198 hr = IDispatchEx_DeleteMemberByDispID(dispex, dispid);
11199 ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr);
11200
11201 props = 0;
11202 hr = IDispatchEx_GetMemberProperties(dispex, dispid, grfdexPropCanAll, &props);
11203 ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr);
11204 ok(props == 0, "expected 0 got %ld\n", props);
11205
11206 hr = IDispatchEx_GetMemberName(dispex, dispid, &name);
11207 ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr);
11209
11210 hr = IDispatchEx_GetNextDispID(dispex, fdexEnumDefault, DISPID_XMLDOM_NODELIST_RESET, &dispid);
11211 ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr);
11212
11213 unk = (IUnknown*)0xdeadbeef;
11214 hr = IDispatchEx_GetNameSpaceParent(dispex, &unk);
11215 ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr);
11216 ok(unk == (IUnknown*)0xdeadbeef, "got %p\n", unk);
11217
11218 name = SysAllocString(L"testprop");
11219 hr = IDispatchEx_GetDispID(dispex, name, fdexNameEnsure, &dispid);
11220 ok(hr == DISP_E_UNKNOWNNAME, "Unexpected hr %#lx.\n", hr);
11222
11223 IDispatchEx_Release(dispex);
11224}
11225
11227{
11228 static const char xmluriA[] = "http://www.w3.org/XML/1998/namespace";
11229 IMXNamespacePrefixes *prefixes;
11230 IVBMXNamespaceManager *mgr2;
11231 IMXNamespaceManager *nsmgr;
11232 IUnknown *unk1, *unk2;
11233 WCHAR buffW[250];
11234 IUnknown *unk;
11235 HRESULT hr;
11236 INT len;
11237
11238 hr = CoCreateInstance(&CLSID_MXNamespaceManager40, NULL, CLSCTX_INPROC_SERVER,
11239 &IID_IMXNamespaceManager, (void**)&nsmgr);
11240 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11241
11243 check_interface(nsmgr, &IID_IDispatchEx, TRUE);
11244 check_interface(nsmgr, &IID_IMXNamespaceManager, TRUE);
11245 check_interface(nsmgr, &IID_IVBMXNamespaceManager, TRUE);
11246
11247 hr = IMXNamespaceManager_QueryInterface(nsmgr, &IID_IVBMXNamespaceManager, (void**)&mgr2);
11248 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11249
11250 EXPECT_REF(nsmgr, 2);
11251 EXPECT_REF(mgr2, 2);
11252 prefixes = NULL;
11253 hr = IVBMXNamespaceManager_getDeclaredPrefixes(mgr2, &prefixes);
11254 todo_wine
11255 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11256 if (hr == S_OK)
11257 {
11258 IDispatchEx *dispex;
11259 VARIANT arg, ret;
11260 DISPPARAMS dispparams;
11261
11262 ok(prefixes != NULL, "got %p\n", prefixes);
11263 EXPECT_REF(nsmgr, 2);
11264 EXPECT_REF(mgr2, 2);
11265 EXPECT_REF(prefixes, 1);
11266
11267 IVBMXNamespaceManager_QueryInterface(mgr2, &IID_IUnknown, (void**)&unk1);
11268 IMXNamespacePrefixes_QueryInterface(prefixes, &IID_IUnknown, (void**)&unk2);
11269
11270 EXPECT_REF(mgr2, 3);
11271 EXPECT_REF(prefixes, 2);
11272
11273 IUnknown_Release(unk1);
11274 IUnknown_Release(unk2);
11275
11276 hr = IMXNamespacePrefixes_QueryInterface(prefixes, &IID_IDispatchEx, (void**)&dispex);
11277 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11278
11279 V_VT(&arg) = VT_I4;
11280 V_I4(&arg) = 0;
11281 dispparams.cArgs = 1;
11282 dispparams.cNamedArgs = 0;
11283 dispparams.rgdispidNamedArgs = NULL;
11284 dispparams.rgvarg = &arg;
11285
11286 V_VT(&ret) = VT_EMPTY;
11287 V_DISPATCH(&ret) = (void*)0x1;
11288 hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_METHOD, &dispparams, &ret, NULL, NULL);
11289 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11290 ok(V_VT(&ret) == VT_BSTR, "got %d\n", V_VT(&ret));
11291 ok(V_BSTR(&ret) != NULL, "got %p\n", V_BSTR(&ret));
11292 VariantClear(&ret);
11293
11294 IDispatchEx_Release(dispex);
11295 IMXNamespacePrefixes_Release(prefixes);
11296 }
11297 IVBMXNamespaceManager_Release(mgr2);
11298
11299 hr = IMXNamespaceManager_declarePrefix(nsmgr, NULL, NULL);
11300 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11301
11302 /* prefix already added */
11303 hr = IMXNamespaceManager_declarePrefix(nsmgr, NULL, _bstr_("ns0 uri"));
11304 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
11305
11306 hr = IMXNamespaceManager_declarePrefix(nsmgr, _bstr_("ns0"), NULL);
11307 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
11308
11309 /* "xml" and "xmlns" are not allowed here */
11310 hr = IMXNamespaceManager_declarePrefix(nsmgr, _bstr_("xml"), _bstr_("uri1"));
11311 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
11312
11313 hr = IMXNamespaceManager_declarePrefix(nsmgr, _bstr_("xmlns"), _bstr_("uri1"));
11314 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
11315todo_wine {
11316 hr = IMXNamespaceManager_getDeclaredPrefix(nsmgr, -1, NULL, NULL);
11317 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
11318}
11319 hr = IMXNamespaceManager_getDeclaredPrefix(nsmgr, 0, NULL, NULL);
11320 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
11321
11322 len = -1;
11323 hr = IMXNamespaceManager_getDeclaredPrefix(nsmgr, 0, NULL, &len);
11324 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11325 ok(len == 3, "got %d\n", len);
11326
11327 len = -1;
11328 buffW[0] = 0x1;
11329 hr = IMXNamespaceManager_getDeclaredPrefix(nsmgr, 0, buffW, &len);
11330 ok(hr == E_XML_BUFFERTOOSMALL, "Unexpected hr %#lx.\n", hr);
11331 ok(len == -1, "got %d\n", len);
11332 ok(buffW[0] == 0x1, "got %x\n", buffW[0]);
11333
11334 len = 10;
11335 buffW[0] = 0x1;
11336 hr = IMXNamespaceManager_getDeclaredPrefix(nsmgr, 0, buffW, &len);
11337 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11338 ok(len == 3, "got %d\n", len);
11339 ok(!lstrcmpW(buffW, L"xml"), "got prefix %s\n", wine_dbgstr_w(buffW));
11340
11341 /* getURI */
11342 hr = IMXNamespaceManager_getURI(nsmgr, NULL, NULL, NULL, NULL);
11343 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
11344
11345 len = -1;
11346 hr = IMXNamespaceManager_getURI(nsmgr, NULL, NULL, NULL, &len);
11347 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
11348 ok(len == -1, "got %d\n", len);
11349
11350 hr = IMXNamespaceManager_getURI(nsmgr, _bstr_("xml"), NULL, NULL, NULL);
11351 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
11352
11353 len = -1;
11354 hr = IMXNamespaceManager_getURI(nsmgr, _bstr_("xml"), NULL, NULL, &len);
11355 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11356 /* length of "xml" uri is constant */
11357 ok(len == strlen(xmluriA), "got %d\n", len);
11358
11359 len = 100;
11360 hr = IMXNamespaceManager_getURI(nsmgr, _bstr_("xml"), NULL, buffW, &len);
11361 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11362 ok(len == strlen(xmluriA), "got %d\n", len);
11363 ok(!lstrcmpW(buffW, _bstr_(xmluriA)), "got prefix %s\n", wine_dbgstr_w(buffW));
11364
11365 len = strlen(xmluriA)-1;
11366 buffW[0] = 0x1;
11367 hr = IMXNamespaceManager_getURI(nsmgr, _bstr_("xml"), NULL, buffW, &len);
11368 ok(hr == E_XML_BUFFERTOOSMALL, "Unexpected hr %#lx.\n", hr);
11369 ok(len == strlen(xmluriA)-1, "got %d\n", len);
11370 ok(buffW[0] == 0x1, "got %x\n", buffW[0]);
11371
11372 /* prefix xml1 not defined */
11373 len = -1;
11374 hr = IMXNamespaceManager_getURI(nsmgr, _bstr_("xml1"), NULL, NULL, &len);
11375 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
11376 ok(len == 0, "got %d\n", len);
11377
11378 len = 100;
11379 buffW[0] = 0x1;
11380 hr = IMXNamespaceManager_getURI(nsmgr, _bstr_("xml1"), NULL, buffW, &len);
11381 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
11382 ok(buffW[0] == 0, "got %x\n", buffW[0]);
11383 ok(len == 0, "got %d\n", len);
11384
11385 /* IDispatchEx tests */
11386 hr = IMXNamespaceManager_QueryInterface(nsmgr, &IID_IUnknown, (void**)&unk);
11387 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11388 test_domobj_dispex(unk);
11389 IUnknown_Release(unk);
11390
11391 IMXNamespaceManager_Release(nsmgr);
11392
11393 /* ::getPrefix() */
11394 hr = CoCreateInstance(&CLSID_MXNamespaceManager40, NULL, CLSCTX_INPROC_SERVER,
11395 &IID_IMXNamespaceManager, (void**)&nsmgr);
11396 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11397
11398 hr = IMXNamespaceManager_getPrefix(nsmgr, NULL, 0, NULL, NULL);
11399 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
11400
11401 len = -1;
11402 hr = IMXNamespaceManager_getPrefix(nsmgr, NULL, 0, NULL, &len);
11403 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
11404 ok(len == -1, "got %d\n", len);
11405
11406 len = 100;
11407 buffW[0] = 0x1;
11408 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("ns0 uri"), 0, buffW, &len);
11409 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
11410 ok(buffW[0] == 0x1, "got %x\n", buffW[0]);
11411 ok(len == 100, "got %d\n", len);
11412
11413 len = 0;
11414 buffW[0] = 0x1;
11415 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("ns0 uri"), 0, buffW, &len);
11416 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
11417 ok(buffW[0] == 0x1, "got %x\n", buffW[0]);
11418 ok(len == 0, "got %d\n", len);
11419
11420 hr = IMXNamespaceManager_declarePrefix(nsmgr, _bstr_("ns1"), _bstr_("ns1 uri"));
11421 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11422
11423 len = 100;
11424 buffW[0] = 0x1;
11425 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("ns1 uri"), 0, buffW, &len);
11426 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11427 ok(!lstrcmpW(buffW, L"ns1"), "got %s\n", wine_dbgstr_w(buffW));
11428 ok(len == 3, "got %d\n", len);
11429
11430 len = 100;
11431 buffW[0] = 0x1;
11432 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("http://www.w3.org/XML/1998/namespace"), 0, buffW, &len);
11433 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11434 ok(!lstrcmpW(buffW, L"xml"), "got %s\n", wine_dbgstr_w(buffW));
11435 ok(len == 3, "got %d\n", len);
11436
11437 /* with null buffer it's possible to get required length */
11438 len = 100;
11439 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("http://www.w3.org/XML/1998/namespace"), 0, NULL, &len);
11440 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11441 ok(len == 3, "got %d\n", len);
11442
11443 len = 0;
11444 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("http://www.w3.org/XML/1998/namespace"), 0, NULL, &len);
11445 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11446 ok(len == 3, "got %d\n", len);
11447
11448 len = 100;
11449 buffW[0] = 0x1;
11450 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("ns1 uri"), 1, buffW, &len);
11451 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
11452 ok(buffW[0] == 0x1, "got %x\n", buffW[0]);
11453 ok(len == 100, "got %d\n", len);
11454
11455 len = 100;
11456 buffW[0] = 0x1;
11457 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("ns1 uri"), 2, buffW, &len);
11458 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
11459 ok(buffW[0] == 0x1, "got %x\n", buffW[0]);
11460 ok(len == 100, "got %d\n", len);
11461
11462 len = 100;
11463 buffW[0] = 0x1;
11464 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_(""), 0, buffW, &len);
11465 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
11466 ok(buffW[0] == 0x1, "got %x\n", buffW[0]);
11467 ok(len == 100, "got %d\n", len);
11468
11469 len = 100;
11470 buffW[0] = 0x1;
11471 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_(""), 1, buffW, &len);
11472 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
11473 ok(buffW[0] == 0x1, "got %x\n", buffW[0]);
11474 ok(len == 100, "got %d\n", len);
11475
11476 len = 100;
11477 buffW[0] = 0x1;
11478 hr = IMXNamespaceManager_getPrefix(nsmgr, NULL, 0, buffW, &len);
11479 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
11480 ok(buffW[0] == 0x1, "got %x\n", buffW[0]);
11481 ok(len == 100, "got %d\n", len);
11482
11483 len = 100;
11484 buffW[0] = 0x1;
11485 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("ns0 uri"), 1, buffW, &len);
11486 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
11487 ok(buffW[0] == 0x1, "got %x\n", buffW[0]);
11488 ok(len == 100, "got %d\n", len);
11489
11490 len = 100;
11491 buffW[0] = 0x1;
11492 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_(""), 1, buffW, &len);
11493 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
11494 ok(buffW[0] == 0x1, "got %x\n", buffW[0]);
11495 ok(len == 100, "got %d\n", len);
11496
11497 /* declare another one, indices are shifted */
11498 hr = IMXNamespaceManager_declarePrefix(nsmgr, _bstr_("ns2"), _bstr_("ns2 uri"));
11499 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11500
11501 len = 100;
11502 buffW[0] = 0x1;
11503 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("ns1 uri"), 0, buffW, &len);
11504 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11505 ok(!lstrcmpW(buffW, L"ns1"), "got %s\n", wine_dbgstr_w(buffW));
11506 ok(len == 3, "got %d\n", len);
11507
11508 len = 100;
11509 buffW[0] = 0x1;
11510 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("ns2 uri"), 0, buffW, &len);
11511 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11512 ok(!lstrcmpW(buffW, L"ns2"), "got %s\n", wine_dbgstr_w(buffW));
11513 ok(len == 3, "got %d\n", len);
11514
11515 len = 100;
11516 buffW[0] = 0x1;
11517 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("ns2 uri"), 1, buffW, &len);
11518 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
11519 ok(buffW[0] == 0x1, "got %x\n", buffW[0]);
11520 ok(len == 100, "got %d\n", len);
11521
11522 len = 100;
11523 buffW[0] = 0x1;
11524 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_(""), 1, buffW, &len);
11525 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
11526 ok(buffW[0] == 0x1, "got %x\n", buffW[0]);
11527 ok(len == 100, "got %d\n", len);
11528
11529 IMXNamespaceManager_Release(nsmgr);
11530
11531 /* push/pop tests */
11532 hr = CoCreateInstance(&CLSID_MXNamespaceManager40, NULL, CLSCTX_INPROC_SERVER,
11533 &IID_IMXNamespaceManager, (void**)&nsmgr);
11534 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11535
11536 /* pop with empty stack */
11537 hr = IMXNamespaceManager_popContext(nsmgr);
11538 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
11539
11540 hr = IMXNamespaceManager_declarePrefix(nsmgr, _bstr_("ns1"), _bstr_("ns1 uri"));
11541 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11542
11543 len = 100;
11544 buffW[0] = 0x1;
11545 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("ns1 uri"), 0, buffW, &len);
11546 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11547 ok(!lstrcmpW(buffW, L"ns1"), "got %s\n", wine_dbgstr_w(buffW));
11548 ok(len == 3, "got %d\n", len);
11549
11550 hr = IMXNamespaceManager_pushContext(nsmgr);
11551 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11552
11553 len = 100;
11554 buffW[0] = 0x1;
11555 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("ns1 uri"), 0, buffW, &len);
11556 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11557 ok(!lstrcmpW(buffW, L"ns1"), "got %s\n", wine_dbgstr_w(buffW));
11558 ok(len == 3, "got %d\n", len);
11559
11560 hr = IMXNamespaceManager_declarePrefix(nsmgr, _bstr_("ns2"), _bstr_("ns2 uri"));
11561 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11562
11563 len = 100;
11564 buffW[0] = 0x1;
11565 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("ns2 uri"), 0, buffW, &len);
11566 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11567 ok(!lstrcmpW(buffW, L"ns2"), "got %s\n", wine_dbgstr_w(buffW));
11568 ok(len == 3, "got %d\n", len);
11569
11570 hr = IMXNamespaceManager_pushContext(nsmgr);
11571 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11572 hr = IMXNamespaceManager_declarePrefix(nsmgr, _bstr_("ns3"), _bstr_("ns3 uri"));
11573 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11574
11575 len = 100;
11576 buffW[0] = 0x1;
11577 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("ns2 uri"), 0, buffW, &len);
11578 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11579 ok(!lstrcmpW(buffW, L"ns2"), "got %s\n", wine_dbgstr_w(buffW));
11580 ok(len == 3, "got %d\n", len);
11581
11582 len = 100;
11583 buffW[0] = 0x1;
11584 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("ns1 uri"), 0, buffW, &len);
11585 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11586 ok(!lstrcmpW(buffW, L"ns1"), "got %s\n", wine_dbgstr_w(buffW));
11587 ok(len == 3, "got %d\n", len);
11588
11589 hr = IMXNamespaceManager_popContext(nsmgr);
11590 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11591
11592 hr = IMXNamespaceManager_popContext(nsmgr);
11593 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11594
11595 len = 100;
11596 buffW[0] = 0x1;
11597 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("ns2 uri"), 0, buffW, &len);
11598 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
11599 ok(buffW[0] == 0x1, "got %x\n", buffW[0]);
11600 ok(len == 100, "got %d\n", len);
11601
11602 len = 100;
11603 buffW[0] = 0x1;
11604 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("ns1 uri"), 0, buffW, &len);
11605 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11606 ok(!lstrcmpW(buffW, L"ns1"), "got %s\n", wine_dbgstr_w(buffW));
11607 ok(len == 3, "got %d\n", len);
11608
11609 IMXNamespaceManager_Release(nsmgr);
11610
11611 free_bstrs();
11612}
11613
11615{
11616 IMXNamespaceManager *nsmgr;
11617 WCHAR buffW[250];
11619 HRESULT hr;
11620 INT len;
11621
11622 hr = CoCreateInstance(&CLSID_MXNamespaceManager40, NULL, CLSCTX_INPROC_SERVER,
11623 &IID_IMXNamespaceManager, (void**)&nsmgr);
11624 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11625
11626 len = ARRAY_SIZE(buffW);
11627 buffW[0] = 0;
11628 hr = IMXNamespaceManager_getDeclaredPrefix(nsmgr, 0, buffW, &len);
11629 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11630 ok(!lstrcmpW(buffW, L"xml"), "got prefix %s\n", wine_dbgstr_w(buffW));
11631
11632 len = ARRAY_SIZE(buffW);
11633 buffW[0] = 0;
11634 hr = IMXNamespaceManager_getDeclaredPrefix(nsmgr, 1, buffW, &len);
11635 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
11636
11637 hr = IMXNamespaceManager_getAllowOverride(nsmgr, NULL);
11638 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
11639
11640 b = VARIANT_FALSE;
11641 hr = IMXNamespaceManager_getAllowOverride(nsmgr, &b);
11642 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11643 ok(b == VARIANT_TRUE, "got %d\n", b);
11644
11645 hr = IMXNamespaceManager_putAllowOverride(nsmgr, VARIANT_FALSE);
11646 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11647
11648 hr = IMXNamespaceManager_declarePrefix(nsmgr, NULL, _bstr_("ns0 uri"));
11649 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11650
11651 len = ARRAY_SIZE(buffW);
11652 buffW[0] = 0;
11653 hr = IMXNamespaceManager_getURI(nsmgr, _bstr_(""), NULL, buffW, &len);
11654 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11655 ok(!lstrcmpW(buffW, L"ns0 uri"), "got uri %s\n", wine_dbgstr_w(buffW));
11656
11657 hr = IMXNamespaceManager_declarePrefix(nsmgr, _bstr_("ns0"), _bstr_("ns0 uri"));
11658 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11659
11660 len = ARRAY_SIZE(buffW);
11661 buffW[0] = 0;
11662 hr = IMXNamespaceManager_getDeclaredPrefix(nsmgr, 0, buffW, &len);
11663 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11664 ok(!lstrcmpW(buffW, L"xml"), "got prefix %s\n", wine_dbgstr_w(buffW));
11665
11666 len = ARRAY_SIZE(buffW);
11667 buffW[0] = 0;
11668 hr = IMXNamespaceManager_getDeclaredPrefix(nsmgr, 1, buffW, &len);
11669 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11670 ok(!lstrcmpW(buffW, L"ns0"), "got prefix %s\n", wine_dbgstr_w(buffW));
11671
11672 len = ARRAY_SIZE(buffW);
11673 buffW[0] = 0;
11674 hr = IMXNamespaceManager_getDeclaredPrefix(nsmgr, 2, buffW, &len);
11675 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11676 ok(!lstrcmpW(buffW, L""), "got prefix %s\n", wine_dbgstr_w(buffW));
11677
11678 /* new prefix placed at index 1 always */
11679 hr = IMXNamespaceManager_declarePrefix(nsmgr, _bstr_("ns1"), _bstr_("ns1 uri"));
11680 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11681
11682 len = ARRAY_SIZE(buffW);
11683 buffW[0] = 0;
11684 hr = IMXNamespaceManager_getDeclaredPrefix(nsmgr, 1, buffW, &len);
11685 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11686 ok(!lstrcmpW(buffW, L"ns1"), "got prefix %s\n", wine_dbgstr_w(buffW));
11687
11688 hr = IMXNamespaceManager_declarePrefix(nsmgr, _bstr_(""), NULL);
11689 todo_wine ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
11690
11691 hr = IMXNamespaceManager_declarePrefix(nsmgr, NULL, NULL);
11692 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
11693
11694 hr = IMXNamespaceManager_declarePrefix(nsmgr, NULL, _bstr_("ns0 uri"));
11695 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
11696
11697 hr = IMXNamespaceManager_putAllowOverride(nsmgr, VARIANT_TRUE);
11698 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11699
11700 hr = IMXNamespaceManager_declarePrefix(nsmgr, NULL, _bstr_("ns0 uri override"));
11701 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
11702
11703 len = ARRAY_SIZE(buffW);
11704 buffW[0] = 0;
11705 hr = IMXNamespaceManager_getURI(nsmgr, _bstr_(""), NULL, buffW, &len);
11706 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11707 ok(!lstrcmpW(buffW, L"ns0 uri override"), "got uri %s\n", wine_dbgstr_w(buffW));
11708
11709 len = ARRAY_SIZE(buffW);
11710 buffW[0] = 0;
11711 hr = IMXNamespaceManager_getDeclaredPrefix(nsmgr, 3, buffW, &len);
11712 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11713 ok(!lstrcmpW(buffW, L""), "got prefix %s\n", wine_dbgstr_w(buffW));
11714
11715 IMXNamespaceManager_Release(nsmgr);
11716
11717 free_bstrs();
11718}
11719
11721{
11724 NODE_TEXT,
11731};
11732
11733static void test_dispex(void)
11734{
11737 IXMLDOMNodeList *node_list;
11740 IXSLProcessor *processor;
11741 IXSLTemplate *template;
11742 IXMLDOMDocument *doc;
11743 IXMLHTTPRequest *req;
11745 IDispatchEx *dispex;
11746 DISPPARAMS dispparams;
11748 VARIANT arg, ret;
11750 IUnknown *unk;
11751 HRESULT hr;
11752 DISPID did;
11753
11754 doc = create_document(&IID_IXMLDOMDocument);
11755
11756 hr = IXMLDOMDocument_QueryInterface(doc, &IID_IUnknown, (void**)&unk);
11757 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11758 test_domobj_dispex(unk);
11759 IUnknown_Release(unk);
11760
11761 for(; *type != NODE_INVALID; type++)
11762 {
11764 VARIANT v;
11765
11766 V_VT(&v) = VT_I2;
11767 V_I2(&v) = *type;
11768
11769 hr = IXMLDOMDocument_createNode(doc, v, _bstr_("name"), NULL, &node);
11770 ok(hr == S_OK, "failed to create node type %d\n", *type);
11771
11772 IXMLDOMNode_QueryInterface(node, &IID_IUnknown, (void**)&unk);
11773
11774 test_domobj_dispex(unk);
11775 IUnknown_Release(unk);
11776 IXMLDOMNode_Release(node);
11777 }
11778
11779 /* IXMLDOMNodeList */
11780 hr = IXMLDOMDocument_getElementsByTagName(doc, _bstr_("*"), &node_list);
11781 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11782 hr = IXMLDOMNodeList_QueryInterface(node_list, &IID_IUnknown, (void**)&unk);
11783 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11784 test_domobj_dispex(unk);
11785 IUnknown_Release(unk);
11786 IXMLDOMNodeList_Release(node_list);
11787
11788 /* IXMLDOMNodeList for children list */
11789 hr = IXMLDOMDocument_get_childNodes(doc, &node_list);
11790 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11791 hr = IXMLDOMNodeList_QueryInterface(node_list, &IID_IUnknown, (void**)&unk);
11792 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11793 test_domobj_dispex(unk);
11794 IUnknown_Release(unk);
11795
11796 /* collection dispex test, empty collection */
11797 hr = IXMLDOMNodeList_QueryInterface(node_list, &IID_IDispatchEx, (void**)&dispex);
11798 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11799 did = 0;
11800 hr = IDispatchEx_GetDispID(dispex, _bstr_("0"), 0, &did);
11801 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11802 ok(did == DISPID_DOM_COLLECTION_BASE, "Unexpected value %ld.\n", did);
11803 hr = IDispatchEx_GetDispID(dispex, _bstr_("1"), 0, &did);
11804 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11805 ok(did == DISPID_DOM_COLLECTION_BASE+1, "Unexpected value %ld.\n", did);
11806 IDispatchEx_Release(dispex);
11807
11808 did = -1;
11809 hr = IDispatchEx_GetDispID(dispex, _bstr_("item"), 0, &did);
11810 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11811 ok(did == DISPID_VALUE, "got %ld\n", did);
11812
11813 V_VT(&arg) = VT_I4;
11814 V_I4(&arg) = 0;
11815 dispparams.cArgs = 0;
11816 dispparams.cNamedArgs = 0;
11817 dispparams.rgdispidNamedArgs = NULL;
11818 dispparams.rgvarg = &arg;
11819
11820 V_VT(&ret) = VT_EMPTY;
11821 V_DISPATCH(&ret) = (void*)0x1;
11822 hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_METHOD, &dispparams, &ret, NULL, NULL);
11823 ok(hr == DISP_E_BADPARAMCOUNT, "Unexpected hr %#lx.\n", hr);
11824 ok(V_VT(&ret) == VT_EMPTY, "got %d\n", V_VT(&ret));
11825 todo_wine
11826 ok(broken(V_DISPATCH(&ret) == (void*)0x1) || (V_DISPATCH(&ret) == NULL), "got %p\n", V_DISPATCH(&ret));
11827
11828 V_VT(&arg) = VT_I4;
11829 V_I4(&arg) = 0;
11830 dispparams.cArgs = 2;
11831 dispparams.cNamedArgs = 0;
11832 dispparams.rgdispidNamedArgs = NULL;
11833 dispparams.rgvarg = &arg;
11834
11835 V_VT(&ret) = VT_EMPTY;
11836 V_DISPATCH(&ret) = (void*)0x1;
11837 hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_METHOD, &dispparams, &ret, NULL, NULL);
11838 ok(hr == DISP_E_BADPARAMCOUNT, "Unexpected hr %#lx.\n", hr);
11839 ok(V_VT(&ret) == VT_EMPTY, "got %d\n", V_VT(&ret));
11840 todo_wine
11841 ok(broken(V_DISPATCH(&ret) == (void*)0x1) || (V_DISPATCH(&ret) == NULL), "got %p\n", V_DISPATCH(&ret));
11842
11843 V_VT(&arg) = VT_I4;
11844 V_I4(&arg) = 0;
11845 dispparams.cArgs = 1;
11846 dispparams.cNamedArgs = 0;
11847 dispparams.rgdispidNamedArgs = NULL;
11848 dispparams.rgvarg = &arg;
11849
11850 V_VT(&ret) = VT_EMPTY;
11851 V_DISPATCH(&ret) = (void*)0x1;
11852 hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_METHOD, &dispparams, &ret, NULL, NULL);
11853 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11854 ok(V_VT(&ret) == VT_DISPATCH, "got %d\n", V_VT(&ret));
11855 ok(V_DISPATCH(&ret) == NULL, "got %p\n", V_DISPATCH(&ret));
11856
11857 V_VT(&ret) = VT_EMPTY;
11858 V_DISPATCH(&ret) = (void*)0x1;
11859 hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dispparams, &ret, NULL, NULL);
11860 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11861 ok(V_VT(&ret) == VT_DISPATCH, "got %d\n", V_VT(&ret));
11862 ok(V_DISPATCH(&ret) == NULL, "got %p\n", V_DISPATCH(&ret));
11863
11864 V_VT(&ret) = VT_EMPTY;
11865 V_DISPATCH(&ret) = (void*)0x1;
11866 hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dispparams, &ret, NULL, NULL);
11867 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11868 ok(V_VT(&ret) == VT_DISPATCH, "got %d\n", V_VT(&ret));
11869 ok(V_DISPATCH(&ret) == NULL, "got %p\n", V_DISPATCH(&ret));
11870
11871 dispparams.cArgs = 0;
11872 dispparams.cNamedArgs = 0;
11873 dispparams.rgdispidNamedArgs = NULL;
11874 dispparams.rgvarg = NULL;
11875
11876 V_VT(&ret) = VT_EMPTY;
11877 V_I4(&ret) = 1;
11878 hr = IDispatchEx_Invoke(dispex, DISPID_DOM_NODELIST_LENGTH, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dispparams, &ret, NULL, NULL);
11879 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11880 ok(V_VT(&ret) == VT_I4, "got %d\n", V_VT(&ret));
11881 ok(V_I4(&ret) == 0, "got %ld\n", V_I4(&ret));
11882
11883 dispparams.cArgs = 0;
11884 dispparams.cNamedArgs = 0;
11885 dispparams.rgdispidNamedArgs = NULL;
11886 dispparams.rgvarg = NULL;
11887
11888 V_VT(&ret) = VT_EMPTY;
11889 V_I4(&ret) = 1;
11890 hr = IDispatchEx_Invoke(dispex, DISPID_DOM_NODELIST_LENGTH, &IID_NULL, 0, DISPATCH_METHOD, &dispparams, &ret, NULL, NULL);
11891 ok(hr == DISP_E_MEMBERNOTFOUND, "Unexpected hr %#lx.\n", hr);
11892 ok(V_VT(&ret) == VT_EMPTY, "got %d\n", V_VT(&ret));
11893 todo_wine
11894 ok(broken(V_I4(&ret) == 1) || (V_I4(&ret) == 0), "got %ld\n", V_I4(&ret));
11895
11896 IXMLDOMNodeList_Release(node_list);
11897
11898 /* IXMLDOMParseError */
11899 hr = IXMLDOMDocument_get_parseError(doc, &error);
11900 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11901 IXMLDOMParseError_QueryInterface(error, &IID_IUnknown, (void**)&unk);
11902 test_domobj_dispex(unk);
11903
11904 hr = IXMLDOMParseError_QueryInterface(error, &IID_IDispatchEx, (void**)&dispex);
11905 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11906
11907 V_VT(&arg) = VT_I4;
11908 V_I4(&arg) = 0;
11909 dispparams.cArgs = 1;
11910 dispparams.cNamedArgs = 0;
11911 dispparams.rgdispidNamedArgs = NULL;
11912 dispparams.rgvarg = &arg;
11913
11914 V_VT(&ret) = VT_EMPTY;
11915 V_DISPATCH(&ret) = (void*)0x1;
11916 hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_METHOD, &dispparams, &ret, NULL, NULL);
11917 ok(hr == DISP_E_MEMBERNOTFOUND, "Unexpected hr %#lx.\n", hr);
11918 ok(V_VT(&ret) == VT_EMPTY, "got %d\n", V_VT(&ret));
11919 todo_wine
11920 ok(broken(V_DISPATCH(&ret) == (void*)0x1) || (V_DISPATCH(&ret) == NULL), "got %p\n", V_DISPATCH(&ret));
11921
11922 IDispatchEx_Release(dispex);
11923
11924 IUnknown_Release(unk);
11925 IXMLDOMParseError_Release(error);
11926
11927 /* IXMLDOMNamedNodeMap */
11928 hr = IXMLDOMDocument_loadXML(doc, _bstr_(xpath_simple_list), &b);
11929 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11930
11931 hr = IXMLDOMDocument_selectNodes(doc, _bstr_("root/a"), &node_list);
11932 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11933 hr = IXMLDOMNodeList_get_item(node_list, 0, &node);
11934 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11935 IXMLDOMNodeList_Release(node_list);
11936
11937 hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMElement, (void**)&elem);
11938 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11939 IXMLDOMNode_Release(node);
11940 hr = IXMLDOMElement_get_attributes(elem, &map);
11941 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11942 IXMLDOMNamedNodeMap_QueryInterface(map, &IID_IUnknown, (void**)&unk);
11943 test_domobj_dispex(unk);
11944 IUnknown_Release(unk);
11945 /* collection dispex test */
11946 hr = IXMLDOMNamedNodeMap_QueryInterface(map, &IID_IDispatchEx, (void**)&dispex);
11947 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11948 did = 0;
11949 hr = IDispatchEx_GetDispID(dispex, _bstr_("0"), 0, &did);
11950 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11951 ok(did == DISPID_DOM_COLLECTION_BASE, "Unexpected value %ld.\n", did);
11952 IDispatchEx_Release(dispex);
11953 IXMLDOMNamedNodeMap_Release(map);
11954
11955 hr = IXMLDOMDocument_selectNodes(doc, _bstr_("root/b"), &node_list);
11956 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11957 hr = IXMLDOMNodeList_get_item(node_list, 0, &node);
11958 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11959 IXMLDOMNodeList_Release(node_list);
11960 hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMElement, (void**)&elem);
11961 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11962 IXMLDOMNode_Release(node);
11963 hr = IXMLDOMElement_get_attributes(elem, &map);
11964 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11965 /* collection dispex test, empty collection */
11966 hr = IXMLDOMNamedNodeMap_QueryInterface(map, &IID_IDispatchEx, (void**)&dispex);
11967 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11968 did = 0;
11969 hr = IDispatchEx_GetDispID(dispex, _bstr_("0"), 0, &did);
11970 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11971 ok(did == DISPID_DOM_COLLECTION_BASE, "Unexpected value %ld\n", did);
11972 hr = IDispatchEx_GetDispID(dispex, _bstr_("1"), 0, &did);
11973 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11974 ok(did == DISPID_DOM_COLLECTION_BASE+1, "Unexpected value %ld.\n", did);
11975 IXMLDOMNamedNodeMap_Release(map);
11976
11977 did = -1;
11978 hr = IDispatchEx_GetDispID(dispex, _bstr_("item"), 0, &did);
11979 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11980 ok(did == DISPID_VALUE, "got %ld\n", did);
11981
11982 V_VT(&arg) = VT_I4;
11983 V_I4(&arg) = 0;
11984 dispparams.cArgs = 0;
11985 dispparams.cNamedArgs = 0;
11986 dispparams.rgdispidNamedArgs = NULL;
11987 dispparams.rgvarg = &arg;
11988
11989 V_VT(&ret) = VT_EMPTY;
11990 V_DISPATCH(&ret) = (void*)0x1;
11991 hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_METHOD, &dispparams, &ret, NULL, NULL);
11992todo_wine {
11993 ok(hr == DISP_E_BADPARAMCOUNT, "Unexpected hr %#lx.\n", hr);
11994 ok(V_VT(&ret) == VT_EMPTY, "got %d\n", V_VT(&ret));
11995}
11996 ok(broken(V_DISPATCH(&ret) == (void*)0x1) || (V_DISPATCH(&ret) == NULL), "got %p\n", V_DISPATCH(&ret));
11997
11998 V_VT(&arg) = VT_I4;
11999 V_I4(&arg) = 0;
12000 dispparams.cArgs = 2;
12001 dispparams.cNamedArgs = 0;
12002 dispparams.rgdispidNamedArgs = NULL;
12003 dispparams.rgvarg = &arg;
12004
12005 V_VT(&ret) = VT_EMPTY;
12006 V_DISPATCH(&ret) = (void*)0x1;
12007 hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_METHOD, &dispparams, &ret, NULL, NULL);
12008todo_wine {
12009 ok(hr == DISP_E_BADPARAMCOUNT, "Unexpected hr %#lx.\n", hr);
12010 ok(V_VT(&ret) == VT_EMPTY, "got %d\n", V_VT(&ret));
12011}
12012 ok(broken(V_DISPATCH(&ret) == (void*)0x1) || (V_DISPATCH(&ret) == NULL), "got %p\n", V_DISPATCH(&ret));
12013
12014 V_VT(&arg) = VT_I4;
12015 V_I4(&arg) = 0;
12016 dispparams.cArgs = 1;
12017 dispparams.cNamedArgs = 0;
12018 dispparams.rgdispidNamedArgs = NULL;
12019 dispparams.rgvarg = &arg;
12020
12021 V_VT(&ret) = VT_EMPTY;
12022 V_DISPATCH(&ret) = (void*)0x1;
12023 hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_METHOD, &dispparams, &ret, NULL, NULL);
12024 todo_wine
12025 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12026 ok(V_VT(&ret) == VT_DISPATCH, "got %d\n", V_VT(&ret));
12027 ok(V_DISPATCH(&ret) == NULL, "got %p\n", V_DISPATCH(&ret));
12028
12029 V_VT(&ret) = VT_EMPTY;
12030 V_DISPATCH(&ret) = (void*)0x1;
12031 hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dispparams, &ret, NULL, NULL);
12032 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12033 ok(V_VT(&ret) == VT_DISPATCH, "got %d\n", V_VT(&ret));
12034 ok(V_DISPATCH(&ret) == NULL, "got %p\n", V_DISPATCH(&ret));
12035
12036 V_VT(&ret) = VT_EMPTY;
12037 V_DISPATCH(&ret) = (void*)0x1;
12038 hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dispparams, &ret, NULL, NULL);
12039 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12040 ok(V_VT(&ret) == VT_DISPATCH, "got %d\n", V_VT(&ret));
12041 ok(V_DISPATCH(&ret) == NULL, "got %p\n", V_DISPATCH(&ret));
12042
12043 dispparams.cArgs = 0;
12044 dispparams.cNamedArgs = 0;
12045 dispparams.rgdispidNamedArgs = NULL;
12046 dispparams.rgvarg = NULL;
12047
12048 V_VT(&ret) = VT_EMPTY;
12049 V_I4(&ret) = 1;
12050 hr = IDispatchEx_Invoke(dispex, DISPID_DOM_NODELIST_LENGTH, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dispparams, &ret, NULL, NULL);
12051 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12052 ok(V_VT(&ret) == VT_I4, "got %d\n", V_VT(&ret));
12053 ok(V_I4(&ret) == 0, "got %ld\n", V_I4(&ret));
12054
12055 dispparams.cArgs = 0;
12056 dispparams.cNamedArgs = 0;
12057 dispparams.rgdispidNamedArgs = NULL;
12058 dispparams.rgvarg = NULL;
12059
12060 V_VT(&ret) = VT_EMPTY;
12061 V_I4(&ret) = 1;
12062 hr = IDispatchEx_Invoke(dispex, DISPID_DOM_NODELIST_LENGTH, &IID_NULL, 0, DISPATCH_METHOD, &dispparams, &ret, NULL, NULL);
12063 ok(hr == DISP_E_MEMBERNOTFOUND, "Unexpected hr %#lx.\n", hr);
12064 todo_wine
12065 ok(V_VT(&ret) == VT_EMPTY, "got %d\n", V_VT(&ret));
12066 ok(broken(V_I4(&ret) == 1) || (V_I4(&ret) == 0), "got %ld\n", V_I4(&ret));
12067
12068 IDispatchEx_Release(dispex);
12069 IXMLDOMElement_Release(elem);
12070
12071 /* IXMLDOMImplementation */
12072 hr = IXMLDOMDocument_get_implementation(doc, &impl);
12073 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12074
12075 hr = IXMLDOMImplementation_QueryInterface(impl, &IID_IDispatchEx, (void**)&dispex);
12076 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12077 IDispatchEx_Release(dispex);
12078 IXMLDOMImplementation_Release(impl);
12079
12080 IXMLDOMDocument_Release(doc);
12081
12082 /* IXMLHTTPRequest */
12083 hr = CoCreateInstance(&CLSID_XMLHTTPRequest, NULL, CLSCTX_INPROC_SERVER,
12084 &IID_IXMLHttpRequest, (void**)&req);
12085 if (hr == S_OK)
12086 {
12087 hr = IXMLHTTPRequest_QueryInterface(req, &IID_IDispatchEx, (void**)&dispex);
12088 ok(hr == E_NOINTERFACE, "Unexpected hr %#lx.\n", hr);
12089 IXMLHTTPRequest_Release(req);
12090 }
12091
12092 /* IXSLTemplate */
12093 template = create_xsltemplate(&IID_IXSLTemplate);
12094 hr = IXSLTemplate_QueryInterface(template, &IID_IDispatchEx, (void**)&dispex);
12095 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12096 hr = IDispatchEx_QueryInterface(dispex, &IID_IUnknown, (void**)&unk);
12097 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12098 test_domobj_dispex(unk);
12099 IUnknown_Release(unk);
12100 IDispatchEx_Release(dispex);
12101
12102 /* IXSLProcessor */
12103 hr = CoCreateInstance(&CLSID_FreeThreadedDOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (void**)&doc);
12104 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12105 b = VARIANT_FALSE;
12106 hr = IXMLDOMDocument_loadXML(doc, _bstr_(szTransformSSXML), &b);
12107 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12108 ok(b == VARIANT_TRUE, "got %d\n", b);
12109
12110 hr = IXSLTemplate_putref_stylesheet(template, (IXMLDOMNode*)doc);
12111 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12112 IXMLDOMDocument_Release(doc);
12113
12114 hr = IXSLTemplate_createProcessor(template, &processor);
12115 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12116 hr = IXSLProcessor_QueryInterface(processor, &IID_IDispatchEx, (void**)&dispex);
12117 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12118 hr = IDispatchEx_QueryInterface(dispex, &IID_IUnknown, (void**)&unk);
12119 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12120 test_domobj_dispex(unk);
12121 IUnknown_Release(unk);
12122 IDispatchEx_Release(dispex);
12123
12124 IXSLProcessor_Release(processor);
12125 IXSLTemplate_Release(template);
12126
12127 if (is_clsid_supported(&CLSID_DOMDocument60, &IID_IXMLDOMDocument))
12128 {
12129 doc = create_document_version(60, &IID_IXMLDOMDocument);
12131 IXMLDOMDocument_Release(doc);
12132 }
12133
12134 free_bstrs();
12135}
12136
12137static void test_parseerror(void)
12138{
12139 IXMLDOMParseError2 *error2;
12141 IXMLDOMDocument *doc;
12142 HRESULT hr;
12143
12144 doc = create_document(&IID_IXMLDOMDocument);
12145
12146 hr = IXMLDOMDocument_get_parseError(doc, &error);
12147 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12148
12149 hr = IXMLDOMParseError_get_line(error, NULL);
12150 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
12151
12152 hr = IXMLDOMParseError_get_srcText(error, NULL);
12153 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
12154
12155 hr = IXMLDOMParseError_get_linepos(error, NULL);
12156 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
12157
12158 IXMLDOMParseError_Release(error);
12159 IXMLDOMDocument_Release(doc);
12160
12161 if (!is_clsid_supported(&CLSID_DOMDocument60, &IID_IXMLDOMDocument)) return;
12162 doc = create_document_version(60, &IID_IXMLDOMDocument);
12163
12164 hr = IXMLDOMDocument_get_parseError(doc, &error);
12165 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12166 hr = IXMLDOMParseError_QueryInterface(error, &IID_IXMLDOMParseError2, (void**)&error2);
12167 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12168 IXMLDOMParseError2_Release(error2);
12169 IXMLDOMParseError_Release(error);
12170 IXMLDOMDocument_Release(doc);
12171}
12172
12173static void test_getAttributeNode(void)
12174{
12176 IXMLDOMDocument *doc;
12179 HRESULT hr;
12180 BSTR str;
12181
12182 doc = create_document(&IID_IXMLDOMDocument);
12183
12184 hr = IXMLDOMDocument_loadXML(doc, _bstr_(szExampleXML), &v);
12185 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12186
12187 hr = IXMLDOMDocument_get_documentElement(doc, &elem);
12188 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12189
12191 hr = IXMLDOMElement_getAttributeNode(elem, str, NULL);
12192 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
12193
12194 attr = (IXMLDOMAttribute*)0xdeadbeef;
12195 hr = IXMLDOMElement_getAttributeNode(elem, str, &attr);
12196 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
12197 ok(attr == NULL, "got %p\n", attr);
12199
12200 str = SysAllocString(L"nonExistingAttribute");
12201 hr = IXMLDOMElement_getAttributeNode(elem, str, NULL);
12202 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
12203
12204 attr = (IXMLDOMAttribute*)0xdeadbeef;
12205 hr = IXMLDOMElement_getAttributeNode(elem, str, &attr);
12206 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
12207 ok(attr == NULL, "got %p\n", attr);
12209
12210 hr = IXMLDOMElement_getAttributeNode(elem, _bstr_("foo:b"), &attr);
12211 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12212 IXMLDOMAttribute_Release(attr);
12213
12214 hr = IXMLDOMElement_getAttributeNode(elem, _bstr_("b"), &attr);
12215 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
12216
12217 hr = IXMLDOMElement_getAttributeNode(elem, _bstr_("a"), &attr);
12218 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12219 IXMLDOMAttribute_Release(attr);
12220
12221 IXMLDOMElement_Release(elem);
12222 IXMLDOMDocument_Release(doc);
12223 free_bstrs();
12224}
12225
12226static void test_getAttribute(void)
12227{
12228 IXMLDOMDocument *doc;
12231 VARIANT var;
12232 HRESULT hr;
12233
12234 doc = create_document(&IID_IXMLDOMDocument);
12235
12236 hr = IXMLDOMDocument_loadXML(doc, _bstr_(szExampleXML), &v);
12237 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12238
12239 hr = IXMLDOMDocument_get_documentElement(doc, &elem);
12240 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12241
12242 VariantInit(&var);
12243 hr = IXMLDOMElement_getAttribute( elem, _bstr_("xmlns:foo"), &var );
12244 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12245 ok( V_VT(&var) == VT_BSTR, "vt = %x\n", V_VT(&var));
12246 ok(!lstrcmpW(V_BSTR(&var), L"urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29"), "wrong attr value: %s\n", wine_dbgstr_w(V_BSTR(&var)));
12247 VariantClear(&var);
12248
12249 hr = IXMLDOMElement_getAttribute( elem, _bstr_("a"), &var );
12250 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12251 ok( V_VT(&var) == VT_BSTR, "vt = %x\n", V_VT(&var));
12252 ok(!lstrcmpW(V_BSTR(&var), L"attr a"), "wrong attr value: %s\n", wine_dbgstr_w(V_BSTR(&var)));
12253 VariantClear(&var);
12254
12255 hr = IXMLDOMElement_getAttribute( elem, _bstr_("foo:b"), &var );
12256 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12257 ok( V_VT(&var) == VT_BSTR, "vt = %x\n", V_VT(&var));
12258 ok(!lstrcmpW(V_BSTR(&var), L"attr b"), "wrong attr value: %s\n", wine_dbgstr_w(V_BSTR(&var)));
12259 VariantClear(&var);
12260
12261 hr = IXMLDOMElement_getAttribute( elem, _bstr_("b"), &var );
12262 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
12263 ok( V_VT(&var) == VT_NULL, "vt = %x\n", V_VT(&var));
12264 VariantClear(&var);
12265
12266 hr = IXMLDOMElement_getAttribute( elem, _bstr_("non-existent"), &var );
12267 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
12268 ok( V_VT(&var) == VT_NULL, "vt = %x\n", V_VT(&var));
12269 VariantClear(&var);
12270
12271 IXMLDOMElement_Release(elem);
12272 IXMLDOMDocument_Release(doc);
12273 free_bstrs();
12274}
12275
12276typedef struct {
12278 const char *name;
12279 REFIID iids[3];
12281
12283 { NODE_ELEMENT, "element", { &IID_IXMLDOMNode, &IID_IXMLDOMElement } },
12284 { NODE_ATTRIBUTE, "attribute", { &IID_IXMLDOMNode, &IID_IXMLDOMAttribute } },
12285 { NODE_CDATA_SECTION, "cdata", { &IID_IXMLDOMNode, &IID_IXMLDOMCDATASection } },
12286 { NODE_ENTITY_REFERENCE, "entityref", { &IID_IXMLDOMNode, &IID_IXMLDOMEntityReference } },
12287 { NODE_PROCESSING_INSTRUCTION, "pi", { &IID_IXMLDOMNode, &IID_IXMLDOMProcessingInstruction } },
12288 { NODE_COMMENT, "comment", { &IID_IXMLDOMNode, &IID_IXMLDOMComment } },
12289 { NODE_DOCUMENT_FRAGMENT, "fragment", { &IID_IXMLDOMNode, &IID_IXMLDOMDocumentFragment } },
12290 { NODE_INVALID }
12291};
12292
12293static void test_supporterrorinfo(void)
12294{
12295 static REFIID iids[5] = { &IID_IXMLDOMNode, &IID_IXMLDOMDocument,
12296 &IID_IXMLDOMDocument2, &IID_IXMLDOMDocument3 };
12298 ISupportErrorInfo *errorinfo, *info2;
12299 IXMLDOMSchemaCollection *schemacache;
12300 IXMLDOMNamedNodeMap *map, *map2;
12301 IXMLDOMDocument *doc;
12304 IUnknown *unk;
12305 REFIID *iid;
12306 void *dummy;
12307 HRESULT hr;
12308
12309 if (!is_clsid_supported(&CLSID_DOMDocument60, &IID_IXMLDOMDocument3)) return;
12310 doc = create_document_version(60, &IID_IXMLDOMDocument3);
12311
12312 EXPECT_REF(doc, 1);
12313 hr = IXMLDOMDocument_QueryInterface(doc, &IID_ISupportErrorInfo, (void**)&errorinfo);
12314 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12315 EXPECT_REF(doc, 1);
12316 ISupportErrorInfo_AddRef(errorinfo);
12317 EXPECT_REF(errorinfo, 2);
12318 EXPECT_REF(doc, 1);
12319 ISupportErrorInfo_Release(errorinfo);
12320
12321 hr = IXMLDOMDocument_QueryInterface(doc, &IID_ISupportErrorInfo, (void**)&info2);
12322 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12323 ok(errorinfo != info2, "got %p, %p\n", info2, errorinfo);
12324
12325 /* error interface can't be queried back for DOM interface */
12326 hr = ISupportErrorInfo_QueryInterface(info2, &IID_IXMLDOMDocument, &dummy);
12327 ok(hr == E_NOINTERFACE, "Unexpected hr %#lx.\n", hr);
12328 hr = ISupportErrorInfo_QueryInterface(info2, &IID_IXMLDOMNode, &dummy);
12329 ok(hr == E_NOINTERFACE, "Unexpected hr %#lx.\n", hr);
12330
12331 ISupportErrorInfo_Release(info2);
12332
12333 iid = iids;
12334 while (*iid)
12335 {
12336 hr = IXMLDOMDocument_QueryInterface(doc, *iid, (void**)&unk);
12337 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12338 if (hr == S_OK)
12339 {
12340 hr = ISupportErrorInfo_InterfaceSupportsErrorInfo(errorinfo, *iid);
12341 ok(hr == S_OK, "Unexpected hr %#lx. for %s\n", hr, wine_dbgstr_guid(*iid));
12342 IUnknown_Release(unk);
12343 }
12344
12345 iid++;
12346 }
12347
12348 ISupportErrorInfo_Release(errorinfo);
12349
12350 while (ptr->type != NODE_INVALID)
12351 {
12353 VARIANT type;
12354
12355 V_VT(&type) = VT_I1;
12356 V_I1(&type) = ptr->type;
12357
12358 hr = IXMLDOMDocument_createNode(doc, type, _bstr_(ptr->name), NULL, &node);
12359 ok(hr == S_OK, "%d: Unexpected hr %#lx.\n", ptr->type, hr);
12360
12361 EXPECT_REF(node, 1);
12362 hr = IXMLDOMNode_QueryInterface(node, &IID_ISupportErrorInfo, (void**)&errorinfo);
12363 ok(hr == S_OK, "%d: Unexpected hr %#lx.\n", ptr->type, hr);
12364 EXPECT_REF(node, 1);
12365
12366 hr = ISupportErrorInfo_QueryInterface(errorinfo, &IID_IXMLDOMNode, &dummy);
12367 ok(hr == E_NOINTERFACE, "%d: Unexpected hr %#lx.\n", ptr->type, hr);
12368
12369 iid = ptr->iids;
12370
12371 while (*iid)
12372 {
12373 hr = IXMLDOMNode_QueryInterface(node, *iid, (void**)&unk);
12374 if (hr == S_OK)
12375 {
12376 hr = ISupportErrorInfo_InterfaceSupportsErrorInfo(errorinfo, *iid);
12377 ok(hr == S_OK, "%d: unexpected hr %#lx for %s\n", ptr->type, hr, wine_dbgstr_guid(*iid));
12378 IUnknown_Release(unk);
12379 }
12380
12381 iid++;
12382 }
12383
12384 ISupportErrorInfo_Release(errorinfo);
12385 IXMLDOMNode_Release(node);
12386 ptr++;
12387 }
12388
12389 /* IXMLDOMNamedNodeMap */
12390 b = VARIANT_FALSE;
12391 hr = IXMLDOMDocument_loadXML(doc, _bstr_(complete4A), &b);
12392 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12393 ok(b == VARIANT_TRUE, "got %d\n", b);
12394
12395 hr = IXMLDOMDocument_get_documentElement(doc, &elem);
12396 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12397
12398 hr = IXMLDOMElement_get_attributes(elem, &map);
12399 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12400
12401 EXPECT_REF(map, 1);
12402 hr = IXMLDOMNamedNodeMap_QueryInterface(map, &IID_ISupportErrorInfo, (void**)&errorinfo);
12403 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12404 EXPECT_REF(map, 2);
12405
12406 hr = ISupportErrorInfo_InterfaceSupportsErrorInfo(errorinfo, &IID_IXMLDOMNamedNodeMap);
12407 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12408
12409 hr = ISupportErrorInfo_QueryInterface(errorinfo, &IID_IXMLDOMNamedNodeMap, (void**)&map2);
12410 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12411 ok(map == map2, "got %p\n", map2);
12412 IXMLDOMNamedNodeMap_Release(map2);
12413
12414 EXPECT_REF(errorinfo, 2);
12415 hr = ISupportErrorInfo_QueryInterface(errorinfo, &IID_IUnknown, (void**)&unk);
12416 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12417 EXPECT_REF(errorinfo, 3);
12418 EXPECT_REF(map, 3);
12419 IUnknown_Release(unk);
12420
12421 ISupportErrorInfo_Release(errorinfo);
12422 IXMLDOMNamedNodeMap_Release(map);
12423 IXMLDOMElement_Release(elem);
12424
12425 IXMLDOMDocument_Release(doc);
12426
12427 /* IXMLDOMSchemaCollection */
12428 hr = CoCreateInstance(&CLSID_XMLSchemaCache, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMSchemaCollection, (void**)&schemacache);
12429 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12430
12431 hr = IXMLDOMSchemaCollection_QueryInterface(schemacache, &IID_ISupportErrorInfo, (void**)&errorinfo);
12432 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12433
12434 hr = ISupportErrorInfo_InterfaceSupportsErrorInfo(errorinfo, &IID_IXMLDOMSchemaCollection);
12435 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12436
12437 ISupportErrorInfo_Release(errorinfo);
12438 IXMLDOMSchemaCollection_Release(schemacache);
12439
12440 free_bstrs();
12441}
12442
12443typedef struct {
12445 const char *name;
12446 const char *put_content;
12450} node_value_t;
12451
12453 { NODE_ELEMENT, "element", "", E_FAIL, VT_NULL, S_FALSE },
12454 { NODE_ATTRIBUTE, "attr", "value", S_OK, VT_BSTR, S_OK },
12455 { NODE_TEXT, "text", "textdata", S_OK, VT_BSTR, S_OK },
12456 { NODE_CDATA_SECTION , "cdata", "cdata data", S_OK, VT_BSTR, S_OK },
12457 { NODE_ENTITY_REFERENCE, "entityref", "ref", E_FAIL, VT_NULL, S_FALSE },
12458 { NODE_PROCESSING_INSTRUCTION, "pi", "instr", S_OK, VT_BSTR, S_OK },
12459 { NODE_COMMENT, "comment", "comment data", S_OK, VT_BSTR, S_OK },
12460 { NODE_DOCUMENT_FRAGMENT, "docfrag", "", E_FAIL, VT_NULL, S_FALSE },
12461 { NODE_INVALID }
12462};
12463
12464static void test_nodeValue(void)
12465{
12467 IXMLDOMDocument *doc;
12468 HRESULT hr;
12469
12470 doc = create_document(&IID_IXMLDOMDocument);
12471
12472 while (ptr->type != NODE_INVALID)
12473 {
12475 VARIANT v;
12476
12477 V_VT(&v) = VT_I2;
12478 V_I2(&v) = ptr->type;
12479
12480 hr = IXMLDOMDocument_createNode(doc, v, _bstr_(ptr->name), NULL, &node);
12481 ok(hr == S_OK, "failed to create node type %d\n", ptr->type);
12482
12483 hr = IXMLDOMNode_get_nodeValue(node, NULL);
12484 ok(hr == E_INVALIDARG, "%d: unexpected hr %#lx\n", ptr->type, hr);
12485
12486 V_VT(&v) = VT_BSTR;
12487 V_BSTR(&v) = _bstr_(ptr->put_content);
12488 hr = IXMLDOMNode_put_nodeValue(node, v);
12489 ok(hr == ptr->put_hr, "%d: unexpected hr %#lx\n", ptr->type, hr);
12490
12491 V_VT(&v) = VT_EMPTY;
12492 hr = IXMLDOMNode_get_nodeValue(node, &v);
12493 ok(hr == ptr->get_hr, "%d: unexpected hr %#lx, expected %#lx.\n", ptr->type, hr, ptr->get_hr);
12494 ok(V_VT(&v) == ptr->get_vt, "%d: got %d, expected %d\n", ptr->type, V_VT(&v), ptr->get_vt);
12495 if (hr == S_OK)
12496 ok(!lstrcmpW(V_BSTR(&v), _bstr_(ptr->put_content)), "%d: got %s\n", ptr->type,
12498 VariantClear(&v);
12499
12500 IXMLDOMNode_Release(node);
12501
12502 ptr++;
12503 }
12504
12505 IXMLDOMDocument_Release(doc);
12506}
12507
12508static void test_xmlns_attribute(void)
12509{
12510 BSTR str;
12511 IXMLDOMDocument *doc;
12513 IXMLDOMAttribute *pAttribute;
12515 HRESULT hr;
12516 VARIANT v;
12517
12518 doc = create_document(&IID_IXMLDOMDocument);
12519
12520 hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing"), &root);
12521 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12522
12523 hr = IXMLDOMDocument_appendChild(doc, (IXMLDOMNode*)root, NULL);
12524 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12525
12526 hr = IXMLDOMDocument_createAttribute(doc, _bstr_("xmlns:dt"), &pAttribute);
12527 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
12528
12529 V_VT(&v) = VT_BSTR;
12530 V_BSTR(&v) = _bstr_("urn:schemas-microsoft-com:datatypes");
12531 hr = IXMLDOMAttribute_put_nodeValue(pAttribute, v);
12532 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
12533
12534 hr = IXMLDOMElement_setAttributeNode(root, pAttribute, NULL);
12535 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
12536
12537 hr = IXMLDOMNode_put_dataType((IXMLDOMNode*)root, _bstr_("bin.base64"));
12538 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
12539
12540 hr = IXMLDOMDocument_get_documentElement(doc, &elem);
12541 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12542
12543 str = NULL;
12544 hr = IXMLDOMElement_get_xml(elem, &str);
12545 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
12546 todo_wine ok(lstrcmpW(str, L"<Testing xmlns:dt=\"urn:schemas-microsoft-com:datatypes\" dt:dt=\"bin.base64\"/>") == 0,
12547 "got %s\n", wine_dbgstr_w(str));
12549
12550 IXMLDOMElement_Release(elem);
12551 IXMLDOMAttribute_Release( pAttribute);
12552
12553 IXMLDOMDocument_Release(doc);
12554
12555 free_bstrs();
12556}
12557
12558static const char namespacesA[] =
12559"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"
12560" <ns1:elem1 xmlns:ns1=\"http://blah.org\" b='1' >"
12561" <ns2:elem2 xmlns:ns2=\"http://blah.org\"/>"
12562" <ns1:elem3/>"
12563" <ns1:elem4/>"
12564" <elem5 xmlns=\"http://blahblah.org\"/>"
12565" <ns1:elem6>true</ns1:elem6>"
12566" </ns1:elem1>";
12567
12568static const char xsd_schema1_uri[] = "x-schema:test1.xsd";
12569static const char xsd_schema1_xml[] =
12570"<?xml version='1.0'?>"
12571"<schema xmlns='http://www.w3.org/2001/XMLSchema'"
12572" targetNamespace='x-schema:test1.xsd'>"
12573" <element name='root'>"
12574" <complexType>"
12575" <sequence maxOccurs='unbounded'>"
12576" <any/>"
12577" </sequence>"
12578" </complexType>"
12579" </element>"
12580"</schema>";
12581
12582static void test_get_namespaces(void)
12583{
12584 IXMLDOMSchemaCollection *collection, *collection2;
12585 IXMLDOMDocument2 *doc, *doc2;
12586 IEnumVARIANT *enumv, *enum2;
12587 IUnknown *unk1, *unk2;
12590 ULONG fetched;
12591 VARIANT v[2];
12592 HRESULT hr;
12593 LONG len;
12594 BSTR s;
12595
12596 if (!is_clsid_supported(&CLSID_DOMDocument2, &IID_IXMLDOMDocument2)) return;
12597 doc = create_document(&IID_IXMLDOMDocument2);
12598
12599 /* null pointer */
12600 hr = IXMLDOMDocument2_get_namespaces(doc, NULL);
12601 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
12602
12603 /* no document loaded */
12604 collection = (void*)0xdeadbeef;
12605 hr = IXMLDOMDocument2_get_namespaces(doc, &collection);
12606 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12607 if (hr != S_OK)
12608 {
12609 IXMLDOMDocument2_Release(doc);
12610 return;
12611 }
12613
12614 collection2 = (void*)0xdeadbeef;
12615 hr = IXMLDOMDocument2_get_namespaces(doc, &collection2);
12616 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12617 ok(collection == collection2, "got %p\n", collection2);
12619 IXMLDOMSchemaCollection_Release(collection);
12620
12621 len = -1;
12622 hr = IXMLDOMSchemaCollection_get_length(collection, &len);
12623 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12624 ok(len == 0, "got %ld\n", len);
12625 IXMLDOMSchemaCollection_Release(collection);
12626
12627 /* now with document */
12628 hr = IXMLDOMDocument2_loadXML(doc, _bstr_(namespacesA), &b);
12629 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12630
12631 hr = IXMLDOMDocument2_get_namespaces(doc, &collection);
12632 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12633
12634 len = -1;
12635 hr = IXMLDOMSchemaCollection_get_length(collection, &len);
12636 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12637 ok(len == 2, "got %ld\n", len);
12638
12639 /* try to lookup some uris */
12640 node = (void*)0xdeadbeef;
12641 hr = IXMLDOMSchemaCollection_get(collection, _bstr_("http://blah.org"), &node);
12642 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12643 ok(node == NULL, "got %p\n", node);
12644
12645 node = (void*)0xdeadbeef;
12646 hr = IXMLDOMSchemaCollection_get(collection, _bstr_("http://blah1.org"), &node);
12647 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12648 ok(node == NULL, "got %p\n", node);
12649
12650 /* load schema and try to add it */
12651 doc2 = create_document(&IID_IXMLDOMDocument2);
12652 hr = IXMLDOMDocument2_loadXML(doc2, _bstr_(xsd_schema1_xml), &b);
12653 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12654
12655 V_VT(&v[0]) = VT_DISPATCH;
12656 V_DISPATCH(&v[0]) = (IDispatch*)doc2;
12657 hr = IXMLDOMSchemaCollection_add(collection, _bstr_(xsd_schema1_uri), v[0]);
12658 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
12659
12660 hr = IXMLDOMSchemaCollection_get_namespaceURI(collection, 0, &s);
12661 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12662 ok(!lstrcmpW(s, L"http://blah.org"), "got %s\n", wine_dbgstr_w(s));
12664
12665 hr = IXMLDOMSchemaCollection_get_namespaceURI(collection, 1, &s);
12666 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12667 ok(!lstrcmpW(s, L"http://blahblah.org"), "got %s\n", wine_dbgstr_w(s));
12669
12670 s = (void*)0xdeadbeef;
12671 hr = IXMLDOMSchemaCollection_get_namespaceURI(collection, 2, &s);
12672 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
12673 ok(s == (void*)0xdeadbeef, "got %p\n", s);
12674
12675 /* enumerate */
12676 enumv = (void*)0xdeadbeef;
12678 hr = IXMLDOMSchemaCollection_get__newEnum(collection, (IUnknown**)&enumv);
12679 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12681 ok(enumv != NULL, "got %p\n", enumv);
12682
12683 hr = IXMLDOMSchemaCollection_QueryInterface(collection, &IID_IUnknown, (void**)&unk1);
12684 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12685 hr = IEnumVARIANT_QueryInterface(enumv, &IID_IUnknown, (void**)&unk2);
12686 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12687 ok(unk1 != unk2, "got %p, %p\n", unk1, unk2);
12688 IUnknown_Release(unk1);
12689 IUnknown_Release(unk2);
12690
12691 hr = IXMLDOMSchemaCollection_QueryInterface(collection, &IID_IEnumVARIANT, (void**)&enum2);
12692 ok(hr == E_NOINTERFACE, "Unexpected hr %#lx.\n", hr);
12693
12694 V_VT(&v[0]) = VT_EMPTY;
12695 hr = IEnumVARIANT_Next(enumv, 1, &v[0], NULL);
12696 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12697 ok(V_VT(&v[0]) == VT_BSTR, "got %d\n", V_VT(&v[0]));
12698 ok(!lstrcmpW(V_BSTR(&v[0]), L"http://blah.org"), "got %s\n", wine_dbgstr_w(V_BSTR(&v[0])));
12699 VariantClear(&v[0]);
12700
12701 V_VT(&v[0]) = VT_EMPTY;
12702 hr = IEnumVARIANT_Next(enumv, 1, &v[0], &fetched);
12703 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12704 ok(fetched == 1, "got %ld, expected 1\n", fetched);
12705 ok(V_VT(&v[0]) == VT_BSTR, "got %d\n", V_VT(&v[0]));
12706 ok(!lstrcmpW(V_BSTR(&v[0]), L"http://blahblah.org"), "got %s\n", wine_dbgstr_w(V_BSTR(&v[0])));
12707 VariantClear(&v[0]);
12708
12709 V_VT(&v[0]) = VT_NULL;
12710 hr = IEnumVARIANT_Next(enumv, 1, &v[0], &fetched);
12711 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
12712 ok(fetched == 0, "got %ld, expected 0\n", fetched);
12713 ok(V_VT(&v[0]) == VT_EMPTY, "got %d\n", V_VT(&v[0]));
12714
12715 hr = IEnumVARIANT_Reset(enumv);
12716 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12717
12718#ifdef __REACTOS__
12719 memset(v, 0, sizeof(v));
12720#endif
12721 V_VT(&v[1]) = VT_EMPTY;
12722 V_VT(&v[0]) = VT_EMPTY;
12723 hr = IEnumVARIANT_Next(enumv, 2, v, &fetched);
12724 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12725 ok(fetched == 2, "got %ld, expected 2\n", fetched);
12726 ok(V_VT(&v[0]) == VT_BSTR, "got %d\n", V_VT(&v[0]));
12727 ok(V_VT(&v[1]) == VT_BSTR, "got %d\n", V_VT(&v[1]));
12728 ok(!lstrcmpW(V_BSTR(&v[0]), L"http://blah.org"), "got %s\n", wine_dbgstr_w(V_BSTR(&v[0])));
12729 ok(!lstrcmpW(V_BSTR(&v[1]), L"http://blahblah.org"), "got %s\n", wine_dbgstr_w(V_BSTR(&v[1])));
12730 VariantClear(&v[1]);
12731 VariantClear(&v[0]);
12732
12733 V_VT(&v[0]) = VT_NULL;
12734 hr = IEnumVARIANT_Next(enumv, 1, v, &fetched);
12735 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
12736 ok(fetched == 0, "got %ld, expected 0\n", fetched);
12737 ok(V_VT(&v[0]) == VT_EMPTY, "got %d\n", V_VT(&v[0]));
12738
12739 IEnumVARIANT_Release(enumv);
12740 IXMLDOMSchemaCollection_Release(collection);
12741 IXMLDOMDocument2_Release(doc);
12742
12743 /* now with CLSID_DOMDocument60 */
12744 if (!is_clsid_supported(&CLSID_DOMDocument60, &IID_IXMLDOMDocument2)) return;
12745 doc = create_document_version(60, &IID_IXMLDOMDocument2);
12746
12747 /* null pointer */
12748 hr = IXMLDOMDocument2_get_namespaces(doc, NULL);
12749 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
12750
12751 /* no document loaded */
12752 collection = (void*)0xdeadbeef;
12753 hr = IXMLDOMDocument2_get_namespaces(doc, &collection);
12754 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12755 if (hr != S_OK)
12756 {
12757 IXMLDOMDocument2_Release(doc);
12758 return;
12759 }
12761
12762 collection2 = (void*)0xdeadbeef;
12763 hr = IXMLDOMDocument2_get_namespaces(doc, &collection2);
12764 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12765 ok(collection == collection2, "got %p\n", collection2);
12767 IXMLDOMSchemaCollection_Release(collection);
12768
12769 len = -1;
12770 hr = IXMLDOMSchemaCollection_get_length(collection, &len);
12771 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12772 ok(len == 0, "got %ld\n", len);
12773 IXMLDOMSchemaCollection_Release(collection);
12774
12775 /* now with document */
12776 hr = IXMLDOMDocument2_loadXML(doc, _bstr_(namespacesA), &b);
12777 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12778
12779 hr = IXMLDOMDocument2_get_namespaces(doc, &collection);
12780 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12781
12782 len = -1;
12783 hr = IXMLDOMSchemaCollection_get_length(collection, &len);
12784 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12785 ok(len == 2, "got %ld\n", len);
12786
12787 /* try to lookup some uris */
12788 node = (void*)0xdeadbeef;
12789 hr = IXMLDOMSchemaCollection_get(collection, _bstr_("http://blah.org"), &node);
12790 ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr);
12791 ok(broken(node == (void*)0xdeadbeef) || (node == NULL), "got %p\n", node);
12792
12793 /* load schema and try to add it */
12794 doc2 = create_document(&IID_IXMLDOMDocument2);
12795 hr = IXMLDOMDocument2_loadXML(doc2, _bstr_(xsd_schema1_xml), &b);
12796 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12797
12798 V_VT(&v[0]) = VT_DISPATCH;
12799 V_DISPATCH(&v[0]) = (IDispatch*)doc2;
12800 hr = IXMLDOMSchemaCollection_add(collection, _bstr_(xsd_schema1_uri), v[0]);
12801 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
12802 IXMLDOMDocument2_Release(doc2);
12803
12804 hr = IXMLDOMSchemaCollection_get_namespaceURI(collection, 0, &s);
12805 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12806 ok(!lstrcmpW(s, L"http://blah.org"), "got %s\n", wine_dbgstr_w(s));
12808
12809 hr = IXMLDOMSchemaCollection_get_namespaceURI(collection, 1, &s);
12810 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12811 ok(!lstrcmpW(s, L"http://blahblah.org"), "got %s\n", wine_dbgstr_w(s));
12813
12814 s = (void*)0xdeadbeef;
12815 hr = IXMLDOMSchemaCollection_get_namespaceURI(collection, 2, &s);
12816 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
12817 ok(broken(s == (void*)0xdeadbeef) || (s == NULL), "got %p\n", s);
12818
12819 /* enumerate */
12820 enumv = (void*)0xdeadbeef;
12821 hr = IXMLDOMSchemaCollection_get__newEnum(collection, (IUnknown**)&enumv);
12822 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12823 ok(enumv != NULL, "got %p\n", enumv);
12824
12825 V_VT(&v[0]) = VT_EMPTY;
12826 hr = IEnumVARIANT_Next(enumv, 1, &v[0], NULL);
12827 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12828 ok(V_VT(&v[0]) == VT_BSTR, "got %d\n", V_VT(&v[0]));
12829 ok(!lstrcmpW(V_BSTR(&v[0]), L"http://blah.org"), "got %s\n", wine_dbgstr_w(V_BSTR(&v[0])));
12830 VariantClear(&v[0]);
12831
12832 V_VT(&v[0]) = VT_EMPTY;
12833 hr = IEnumVARIANT_Next(enumv, 1, &v[0], NULL);
12834 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12835 ok(V_VT(&v[0]) == VT_BSTR, "got %d\n", V_VT(&v[0]));
12836 ok(!lstrcmpW(V_BSTR(&v[0]), L"http://blahblah.org"), "got %s\n", wine_dbgstr_w(V_BSTR(&v[0])));
12837 VariantClear(&v[0]);
12838
12839 V_VT(&v[0]) = VT_NULL;
12840 hr = IEnumVARIANT_Next(enumv, 1, &v[0], NULL);
12841 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
12842 ok(V_VT(&v[0]) == VT_EMPTY, "got %d\n", V_VT(&v[0]));
12843
12844 hr = IEnumVARIANT_Reset(enumv);
12845 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12846
12847 V_VT(&v[1]) = VT_EMPTY;
12848 V_VT(&v[0]) = VT_EMPTY;
12849 hr = IEnumVARIANT_Next(enumv, 2, v, &fetched);
12850 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12851 ok(fetched == 2, "got %ld, expected 2\n", fetched);
12852 ok(V_VT(&v[0]) == VT_BSTR, "got %d\n", V_VT(&v[0]));
12853 ok(V_VT(&v[1]) == VT_BSTR, "got %d\n", V_VT(&v[1]));
12854 ok(!lstrcmpW(V_BSTR(&v[0]), L"http://blah.org"), "got %s\n", wine_dbgstr_w(V_BSTR(&v[0])));
12855 ok(!lstrcmpW(V_BSTR(&v[1]), L"http://blahblah.org"), "got %s\n", wine_dbgstr_w(V_BSTR(&v[0])));
12856 VariantClear(&v[1]);
12857 VariantClear(&v[0]);
12858
12859 V_VT(&v[0]) = VT_NULL;
12860 hr = IEnumVARIANT_Next(enumv, 1, v, &fetched);
12861 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
12862 ok(fetched == 0, "got %ld, expected 0\n", fetched);
12863 ok(V_VT(&v[0]) == VT_EMPTY, "got %d\n", V_VT(&v[0]));
12864
12865 IEnumVARIANT_Release(enumv);
12866 IXMLDOMSchemaCollection_Release(collection);
12867 IXMLDOMDocument2_Release(doc);
12868 free_bstrs();
12869}
12870
12871static const DOMNodeType put_data_types[] = {
12872 NODE_TEXT,
12877};
12878
12879static void test_put_data(void)
12880{
12881 WCHAR buff[100], *data;
12882 IXMLDOMDocument *doc;
12883 const DOMNodeType *type;
12886 VARIANT v;
12887 BSTR get_data;
12888 HRESULT hr;
12889
12890 doc = create_document(&IID_IXMLDOMDocument);
12891
12892 memcpy(&buff[2], L"test node data", 15 * sizeof(WCHAR));
12893 /* just a big length */
12894 *(DWORD*)buff = 0xf0f0;
12895 data = &buff[2];
12896
12898 while (*type != NODE_INVALID)
12899 {
12900 V_VT(&v) = VT_I2;
12901 V_I2(&v) = *type;
12902
12903 hr = IXMLDOMDocument_createNode(doc, v, _bstr_("name"), NULL, &node);
12904 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12905
12906 /* put_data() is interface-specific */
12907 switch (*type)
12908 {
12909 case NODE_TEXT:
12910 {
12911 hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMText, (void**)&text);
12912 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12913 hr = IXMLDOMText_put_data(text, data);
12914 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12915
12916 hr = IXMLDOMText_get_data(text, &get_data);
12917 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12918
12919 IXMLDOMText_Release(text);
12920 break;
12921 }
12922 case NODE_CDATA_SECTION:
12923 {
12924 IXMLDOMCDATASection *cdata;
12925
12926 hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMCDATASection, (void**)&cdata);
12927 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12928 hr = IXMLDOMCDATASection_put_data(cdata, data);
12929 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12930
12931 hr = IXMLDOMCDATASection_get_data(cdata, &get_data);
12932 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12933
12934 IXMLDOMCDATASection_Release(cdata);
12935 break;
12936 }
12938 {
12940
12941 hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMProcessingInstruction, (void**)&pi);
12942 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12943 hr = IXMLDOMProcessingInstruction_put_data(pi, data);
12944 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12945
12946 hr = IXMLDOMProcessingInstruction_get_data(pi, &get_data);
12947 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12948
12949 IXMLDOMProcessingInstruction_Release(pi);
12950 break;
12951 }
12952 case NODE_COMMENT:
12953 {
12955
12956 hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMComment, (void**)&comment);
12957 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12958 hr = IXMLDOMComment_put_data(comment, data);
12959 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12960
12961 hr = IXMLDOMComment_get_data(comment, &get_data);
12962 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12963
12964 IXMLDOMComment_Release(comment);
12965 break;
12966 }
12967 default:
12968 get_data = NULL;
12969 break;
12970 }
12971
12972 /* compare */
12973 ok(!lstrcmpW(data, get_data), "%d: got wrong data %s, expected %s\n", *type, wine_dbgstr_w(get_data),
12975 SysFreeString(get_data);
12976
12977 IXMLDOMNode_Release(node);
12978 type++;
12979 }
12980
12981 IXMLDOMDocument_Release(doc);
12982 free_bstrs();
12983}
12984
12986{
12988 IXMLDOMDocument *doc;
12991 VARIANT v;
12993 BSTR s;
12994 HRESULT hr;
12995 LONG length;
12996
12997 V_VT(&v) = VT_I2;
12998 V_I2(&v) = NODE_TEXT;
12999
13000 while (table->clsid)
13001 {
13002 if (!is_clsid_supported(table->clsid, &IID_IXMLDOMDocument))
13003 {
13004 table++;
13005 continue;
13006 }
13007
13008 hr = CoCreateInstance(table->clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (void**)&doc);
13009 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13010
13011 hr = IXMLDOMDocument_createNode(doc, v, _bstr_("name"), NULL, &node);
13012 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13013
13014 IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMText, (void**)&text);
13015
13016 /* \r\n is normalized to \n and back to \r\n */
13017
13018 hr = IXMLDOMText_put_data(text, _bstr_("\r\n"));
13019 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13020
13021 hr = IXMLDOMText_get_data(text, &s);
13022 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13023 ok(!lstrcmpW(s, L"\n"), "got %s\n", wine_dbgstr_w(s));
13025
13026 hr = IXMLDOMText_get_length(text, &length);
13027 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13028 ok(length == 1, "got %ld, expected 1\n", length);
13029
13030 hr = IXMLDOMText_get_xml(text, &s);
13031 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13032 ok(!lstrcmpW(s, L"\r\n"), "got %s\n", wine_dbgstr_w(s));
13034
13035 /* \r\r\n is normalized to \n\n and back to \r\n\r\n */
13036
13037 hr = IXMLDOMText_put_data(text, _bstr_("\r\r\n"));
13038 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13039
13040 hr = IXMLDOMText_get_data(text, &s);
13041 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13042 ok(!lstrcmpW(s, L"\n\n"), "got %s\n", wine_dbgstr_w(s));
13044
13045 hr = IXMLDOMText_get_length(text, &length);
13046 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13047 ok(length == 2, "got %ld, expected 2\n", length);
13048
13049 hr = IXMLDOMText_get_xml(text, &s);
13050 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13051 ok(!lstrcmpW(s, L"\r\n\r\n"), "got %s\n", wine_dbgstr_w(s));
13053
13054 /* the same normalizations are applied when loading a document as a whole */
13055
13056 hr = IXMLDOMDocument_loadXML(doc, _bstr_("<?xml version=\"1.0\"?><root>foo\n\r\n\r\r\nbar</root>"), &b);
13057 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13058
13059 hr = IXMLDOMDocument_get_text(doc, &s);
13060 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13061 ok(!lstrcmpW(s, L"foo\n\n\n\nbar"), "got %s\n", wine_dbgstr_w(s));
13063
13064 hr = IXMLDOMDocument_get_xml(doc, &s);
13065 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13066 ok(!lstrcmpW(s, L"<?xml version=\"1.0\"?>\r\n<root>foo\r\n\r\n\r\n\r\nbar</root>\r\n"),
13067 "got %s\n", wine_dbgstr_w(s));
13069
13070 /* even if xml:space="preserve" */
13071
13072 hr = IXMLDOMDocument_loadXML(doc, _bstr_("<?xml version=\"1.0\"?>"
13073 "<root xml:space=\"preserve\">foo\n\r\n\r\r\nbar</root>"), &b);
13074 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13075
13076 hr = IXMLDOMDocument_get_text(doc, &s);
13077 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13078 ok(!lstrcmpW(s, L"foo\n\n\n\nbar"), "got %s\n", wine_dbgstr_w(s));
13080
13081 hr = IXMLDOMDocument_get_xml(doc, &s);
13082 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13083 ok(!lstrcmpW(s, _bstr_("<?xml version=\"1.0\"?>\r\n"
13084 "<root xml:space=\"preserve\">foo\r\n\r\n\r\n\r\nbar</root>\r\n")),
13085 "got %s\n", wine_dbgstr_w(s));
13087
13088 /* or preserveWhiteSpace is set */
13089
13090 hr = IXMLDOMDocument_put_preserveWhiteSpace(doc, VARIANT_TRUE);
13091 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13092
13093 hr = IXMLDOMDocument_loadXML(doc, _bstr_("<?xml version=\"1.0\"?><root>foo\n\r\n\r\r\nbar</root>"), &b);
13094 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13095
13096 hr = IXMLDOMDocument_get_text(doc, &s);
13097 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13098 ok(!lstrcmpW(s, L"foo\n\n\n\nbar"), "got %s\n", wine_dbgstr_w(s));
13100
13101 hr = IXMLDOMDocument_get_xml(doc, &s);
13102 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13103 if (IsEqualGUID(table->clsid, &CLSID_DOMDocument60))
13104 {
13105 /* DOMDocument60 does the newline normalization but does not insert line breaks around the root node */
13106 todo_wine
13107 ok(!lstrcmpW(s, L"<?xml version=\"1.0\"?><root>foo\r\n\r\n\r\n\r\nbar</root>"),
13108 "got %s\n", wine_dbgstr_w(s));
13109 }
13110 else
13111 {
13112 ok(!lstrcmpW(s, L"<?xml version=\"1.0\"?>\r\n<root>foo\r\n\r\n\r\n\r\nbar</root>\r\n"),
13113 "got %s\n", wine_dbgstr_w(s));
13114 }
13116
13117 IXMLDOMText_Release(text);
13118 IXMLDOMNode_Release(node);
13119 IXMLDOMDocument_Release(doc);
13120 free_bstrs();
13121 table++;
13122 }
13123}
13124
13125static void test_putref_schemas(void)
13126{
13127 IXMLDOMSchemaCollection *cache;
13128 IXMLDOMDocument2 *doc;
13130 HRESULT hr;
13131
13132 if (!is_clsid_supported(&CLSID_DOMDocument2, &IID_IXMLDOMDocument2)) return;
13133 if (!is_clsid_supported(&CLSID_XMLSchemaCache, &IID_IXMLDOMSchemaCollection)) return;
13134
13135 doc = create_document(&IID_IXMLDOMDocument2);
13136 cache = create_cache(&IID_IXMLDOMSchemaCollection);
13137
13138 /* set to NULL iface when no schema is set */
13141 hr = IXMLDOMDocument2_putref_schemas(doc, schema);
13142 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13143
13145 V_UNKNOWN(&schema) = NULL;
13146 hr = IXMLDOMDocument2_putref_schemas(doc, schema);
13147 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13148
13149 /* set as VT_DISPATCH, reset with it */
13152 hr = IXMLDOMDocument2_putref_schemas(doc, schema);
13153 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13154
13156 hr = IXMLDOMDocument2_get_schemas(doc, &schema);
13157 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13158 ok(V_DISPATCH(&schema) == (IDispatch*)cache, "got %p\n", V_DISPATCH(&schema));
13159
13162 hr = IXMLDOMDocument2_putref_schemas(doc, schema);
13163 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13164
13165 V_DISPATCH(&schema) = (IDispatch*)0xdeadbeef;
13166 V_VT(&schema) = VT_I2;
13167 hr = IXMLDOMDocument2_get_schemas(doc, &schema);
13168 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
13169 ok(V_DISPATCH(&schema) == NULL, "got %p\n", V_DISPATCH(&schema));
13170 ok(V_VT(&schema) == VT_NULL, "got %d\n", V_VT(&schema));
13171
13172 /* set as VT_UNKNOWN, reset with it */
13175 hr = IXMLDOMDocument2_putref_schemas(doc, schema);
13176 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13177
13179 hr = IXMLDOMDocument2_get_schemas(doc, &schema);
13180 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13181 ok(V_DISPATCH(&schema) == (IDispatch*)cache, "got %p\n", V_DISPATCH(&schema));
13182
13184 V_UNKNOWN(&schema) = NULL;
13185 hr = IXMLDOMDocument2_putref_schemas(doc, schema);
13186 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13187
13188 V_DISPATCH(&schema) = (IDispatch*)0xdeadbeef;
13189 V_VT(&schema) = VT_I2;
13190 hr = IXMLDOMDocument2_get_schemas(doc, &schema);
13191 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
13192 ok(V_DISPATCH(&schema) == NULL, "got %p\n", V_DISPATCH(&schema));
13193 ok(V_VT(&schema) == VT_NULL, "got %d\n", V_VT(&schema));
13194
13195 IXMLDOMSchemaCollection_Release(cache);
13196 IXMLDOMDocument2_Release(doc);
13197}
13198
13199static void test_namedmap_newenum(void)
13200{
13201 IEnumVARIANT *enum1, *enum2, *enum3;
13203 IUnknown *unk1, *unk2;
13204 IXMLDOMDocument *doc;
13208 ULONG fetched;
13209 VARIANT v[3];
13210 HRESULT hr;
13211 BSTR str;
13212
13213 doc = create_document(&IID_IXMLDOMDocument);
13214
13215 hr = IXMLDOMDocument_loadXML(doc, _bstr_(attributes_map), &b);
13216 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13217
13218 hr = IXMLDOMDocument_get_documentElement(doc, &elem);
13219 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13220
13221 hr = IXMLDOMElement_get_attributes(elem, &map);
13222 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13223 IXMLDOMElement_Release(elem);
13224
13225 enum1 = NULL;
13226 EXPECT_REF(map, 1);
13227 hr = IXMLDOMNamedNodeMap_QueryInterface(map, &IID_IEnumVARIANT, (void**)&enum1);
13228 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13229 ok(enum1 != NULL, "got %p\n", enum1);
13230 EXPECT_REF(map, 1);
13231 EXPECT_REF(enum1, 2);
13232
13233 enum2 = NULL;
13234 hr = IXMLDOMNamedNodeMap_QueryInterface(map, &IID_IEnumVARIANT, (void**)&enum2);
13235 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13236 ok(enum2 == enum1, "got %p\n", enum2);
13237
13238 IEnumVARIANT_Release(enum2);
13239
13240 EXPECT_REF(map, 1);
13241 hr = IXMLDOMNamedNodeMap__newEnum(map, (IUnknown**)&enum2);
13242 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13243 EXPECT_REF(map, 2);
13244 EXPECT_REF(enum2, 1);
13245 ok(enum2 != enum1, "got %p, %p\n", enum2, enum1);
13246
13247 IEnumVARIANT_Release(enum1);
13248
13249 /* enumerator created with _newEnum() doesn't share IUnknown* with main object */
13250 hr = IXMLDOMNamedNodeMap_QueryInterface(map, &IID_IUnknown, (void**)&unk1);
13251 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13252 hr = IEnumVARIANT_QueryInterface(enum2, &IID_IUnknown, (void**)&unk2);
13253 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13254 EXPECT_REF(map, 3);
13255 EXPECT_REF(enum2, 2);
13256 ok(unk1 != unk2, "got %p, %p\n", unk1, unk2);
13257 IUnknown_Release(unk1);
13258 IUnknown_Release(unk2);
13259
13260 hr = IXMLDOMNamedNodeMap__newEnum(map, (IUnknown**)&enum3);
13261 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13262 ok(enum2 != enum3, "got %p, %p\n", enum2, enum3);
13263 IEnumVARIANT_Release(enum3);
13264
13265 /* iteration tests */
13266 hr = IXMLDOMNamedNodeMap_get_item(map, 0, &node);
13267 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13268 hr = IXMLDOMNode_get_nodeName(node, &str);
13269 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13270 ok(!lstrcmpW(str, L"attr1"), "got %s\n", wine_dbgstr_w(str));
13272 IXMLDOMNode_Release(node);
13273
13274 hr = IXMLDOMNamedNodeMap_nextNode(map, &node);
13275 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13276 hr = IXMLDOMNode_get_nodeName(node, &str);
13277 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13278 ok(!lstrcmpW(str, L"attr1"), "got %s\n", wine_dbgstr_w(str));
13280 IXMLDOMNode_Release(node);
13281
13282 V_VT(&v[0]) = VT_EMPTY;
13283 hr = IEnumVARIANT_Next(enum2, 1, &v[0], NULL);
13284 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13285 ok(V_VT(&v[0]) == VT_DISPATCH, "got var type %d\n", V_VT(&v[0]));
13286 hr = IDispatch_QueryInterface(V_DISPATCH(&v[0]), &IID_IXMLDOMNode, (void**)&node);
13287 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13288 hr = IXMLDOMNode_get_nodeName(node, &str);
13289 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13290 ok(!lstrcmpW(str, L"attr1"), "got node name %s\n", wine_dbgstr_w(str));
13292 IXMLDOMNode_Release(node);
13293 VariantClear(&v[0]);
13294
13295 hr = IXMLDOMNamedNodeMap_nextNode(map, &node);
13296 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13297 hr = IXMLDOMNode_get_nodeName(node, &str);
13298 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13299 ok(!lstrcmpW(str, L"attr2"), "got %s\n", wine_dbgstr_w(str));
13301 IXMLDOMNode_Release(node);
13302
13303 hr = IEnumVARIANT_Reset(enum2);
13304 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13305
13306 V_VT(&v[1]) = VT_EMPTY;
13307 V_VT(&v[0]) = VT_EMPTY;
13308 hr = IEnumVARIANT_Next(enum2, 2, v, &fetched);
13309 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13310 ok(fetched == 2, "got %ld, expected 2\n", fetched);
13311 ok(V_VT(&v[0]) == VT_DISPATCH, "got var type %d\n", V_VT(&v[0]));
13312 ok(V_VT(&v[1]) == VT_DISPATCH, "got var type %d\n", V_VT(&v[1]));
13313 hr = IDispatch_QueryInterface(V_DISPATCH(&v[0]), &IID_IXMLDOMNode, (void**)&node);
13314 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13315 hr = IXMLDOMNode_get_nodeName(node, &str);
13316 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13317 ok(!lstrcmpW(str, L"attr1"), "got node name %s\n", wine_dbgstr_w(str));
13319 IXMLDOMNode_Release(node);
13320 hr = IDispatch_QueryInterface(V_DISPATCH(&v[1]), &IID_IXMLDOMNode, (void**)&node);
13321 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13322 hr = IXMLDOMNode_get_nodeName(node, &str);
13323 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13324 ok(!lstrcmpW(str, L"attr2"), "got node name %s\n", wine_dbgstr_w(str));
13326 IXMLDOMNode_Release(node);
13327 VariantClear(&v[1]);
13328 VariantClear(&v[0]);
13329
13330 V_VT(&v[2]) = VT_NULL;
13331 V_VT(&v[1]) = VT_EMPTY;
13332 V_VT(&v[0]) = VT_EMPTY;
13333 hr = IEnumVARIANT_Next(enum2, 3, v, &fetched);
13334 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
13335 ok(fetched == 2, "got %ld, expected 2\n", fetched);
13336 ok(V_VT(&v[0]) == VT_DISPATCH, "got var type %d\n", V_VT(&v[0]));
13337 ok(V_VT(&v[1]) == VT_DISPATCH, "got var type %d\n", V_VT(&v[1]));
13338 ok(V_VT(&v[2]) == VT_EMPTY, "got var type %d\n", V_VT(&v[2]));
13339 hr = IDispatch_QueryInterface(V_DISPATCH(&v[0]), &IID_IXMLDOMNode, (void**)&node);
13340 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13341 hr = IXMLDOMNode_get_nodeName(node, &str);
13342 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13343 ok(!lstrcmpW(str, L"attr3"), "got node name %s\n", wine_dbgstr_w(str));
13345 IXMLDOMNode_Release(node);
13346#ifdef __REACTOS__
13347 if (!is_reactos()) {
13348#endif
13349 hr = IDispatch_QueryInterface(V_DISPATCH(&v[1]), &IID_IXMLDOMNode, (void**)&node);
13350 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13351 hr = IXMLDOMNode_get_nodeName(node, &str);
13352 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13353 ok(!lstrcmpW(str, L"attr4"), "got node name %s\n", wine_dbgstr_w(str));
13355 IXMLDOMNode_Release(node);
13356#ifdef __REACTOS__
13357 }
13358#endif
13359 VariantClear(&v[1]);
13360 VariantClear(&v[0]);
13361 IEnumVARIANT_Release(enum2);
13362
13363 IXMLDOMNamedNodeMap_Release(map);
13364 IXMLDOMDocument_Release(doc);
13365}
13366
13367static const char xsltext_xsl[] =
13368"<?xml version=\"1.0\"?>"
13369"<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" >"
13370"<xsl:output method=\"html\" encoding=\"us-ascii\"/>"
13371"<xsl:template match=\"/\">"
13372" <xsl:choose>"
13373" <xsl:when test=\"testkey\">"
13374" <xsl:text>testdata</xsl:text>"
13375" </xsl:when>"
13376" </xsl:choose>"
13377"</xsl:template>"
13378"</xsl:stylesheet>";
13379
13380static const char omitxmldecl_xsl[] =
13381"<?xml version=\"1.0\"?>"
13382"<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" >"
13383"<xsl:output method=\"xml\" omit-xml-declaration=\"yes\"/>"
13384"<xsl:template match=\"/\">"
13385" <xsl:for-each select=\"/a/item\">"
13386" <xsl:element name=\"node\">"
13387" <xsl:value-of select=\"@name\"/>"
13388" </xsl:element>"
13389" </xsl:for-each>"
13390"</xsl:template>"
13391"</xsl:stylesheet>";
13392
13393static const char omitxmldecl_doc[] =
13394"<?xml version=\"1.0\"?>"
13395"<a>"
13396" <item name=\"item1\"/>"
13397" <item name=\"item2\"/>"
13398"</a>";
13399
13400static void test_xsltext(void)
13401{
13402 IXMLDOMDocument *doc, *doc2;
13404 HRESULT hr;
13405 BSTR ret;
13406
13407 doc = create_document(&IID_IXMLDOMDocument);
13408 doc2 = create_document(&IID_IXMLDOMDocument);
13409
13410 hr = IXMLDOMDocument_loadXML(doc, _bstr_(xsltext_xsl), &b);
13411 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13412
13413 hr = IXMLDOMDocument_loadXML(doc2, _bstr_("<testkey/>"), &b);
13414 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13415
13416 hr = IXMLDOMDocument_transformNode(doc2, (IXMLDOMNode*)doc, &ret);
13417 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13418 ok(!lstrcmpW(ret, L"testdata"), "transform result %s\n", wine_dbgstr_w(ret));
13420
13421 /* omit-xml-declaration */
13422 hr = IXMLDOMDocument_loadXML(doc, _bstr_(omitxmldecl_xsl), &b);
13423 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13424 hr = IXMLDOMDocument_loadXML(doc2, _bstr_(omitxmldecl_doc), &b);
13425 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13426
13427 hr = IXMLDOMDocument_transformNode(doc2, (IXMLDOMNode*)doc, &ret);
13428 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13429 ok(!lstrcmpW(ret, L"<node>item1</node><node>item2</node>"), "transform result %s\n", wine_dbgstr_w(ret));
13431
13432 IXMLDOMDocument_Release(doc2);
13433 IXMLDOMDocument_Release(doc);
13434 free_bstrs();
13435}
13436
13438 const char *name;
13439 const char *uri;
13440 const char *prefix;
13441 const char *href;
13442};
13443
13444static struct attrtest_t attrtests[] = {
13445 { "xmlns", "http://www.w3.org/2000/xmlns/", "xmlns", "xmlns" },
13446 { "xmlns", "nondefaulturi", "xmlns", "xmlns" },
13447 { "c", "http://www.w3.org/2000/xmlns/", NULL, "http://www.w3.org/2000/xmlns/" },
13448 { "c", "nsref1", NULL, "nsref1" },
13449 { "ns:c", "nsref1", "ns", "nsref1" },
13450 { "xmlns:c", "http://www.w3.org/2000/xmlns/", "xmlns", "" },
13451 { "xmlns:c", "nondefaulturi", "xmlns", "" },
13452 { 0 }
13453};
13454
13455/* see dlls/msxml[46]/tests/domdoc.c */
13456static void test_create_attribute(void)
13457{
13458 struct attrtest_t *ptr = attrtests;
13459 IXMLDOMElement *el;
13460 IXMLDOMDocument *doc;
13461 IXMLDOMNode *node, *node2;
13462 VARIANT var;
13463 HRESULT hr;
13464 int i = 0;
13465 BSTR str;
13466
13467 doc = create_document(&IID_IXMLDOMDocument);
13468
13469 while (ptr->name)
13470 {
13471 V_VT(&var) = VT_I1;
13473 hr = IXMLDOMDocument_createNode(doc, var, _bstr_(ptr->name), _bstr_(ptr->uri), &node);
13474 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13475
13476 str = NULL;
13477 hr = IXMLDOMNode_get_prefix(node, &str);
13478 if (ptr->prefix)
13479 {
13480 ok(hr == S_OK, "%d: unexpected hr %#lx\n", i, hr);
13481 ok(!lstrcmpW(str, _bstr_(ptr->prefix)), "%d: got prefix %s, expected %s\n", i, wine_dbgstr_w(str), ptr->prefix);
13482 }
13483 else
13484 {
13485 ok(hr == S_FALSE, "%d: unexpected hr %#lx\n", i, hr);
13486 ok(str == NULL, "%d: got prefix %s\n", i, wine_dbgstr_w(str));
13487 }
13489
13490 str = NULL;
13491 hr = IXMLDOMNode_get_namespaceURI(node, &str);
13492 ok(hr == S_OK, "%d: unexpected hr %#lx\n", i, hr);
13493 ok(!lstrcmpW(str, _bstr_(ptr->href)), "%d: got uri %s, expected %s\n", i, wine_dbgstr_w(str), ptr->href);
13495
13496 IXMLDOMNode_Release(node);
13497 free_bstrs();
13498
13499 i++;
13500 ptr++;
13501 }
13502
13503 V_VT(&var) = VT_I1;
13504 V_I1(&var) = NODE_ELEMENT;
13505 hr = IXMLDOMDocument_createNode(doc, var, _bstr_("e"), NULL, &node2);
13506 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13507
13508 hr = IXMLDOMNode_QueryInterface(node2, &IID_IXMLDOMElement, (void**)&el);
13509 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13510 IXMLDOMNode_Release(node2);
13511
13512 V_VT(&var) = VT_I1;
13514 hr = IXMLDOMDocument_createNode(doc, var, _bstr_("xmlns:a"), _bstr_("http://www.w3.org/2000/xmlns/"), &node);
13515 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13516
13517 hr = IXMLDOMElement_setAttributeNode(el, (IXMLDOMAttribute*)node, NULL);
13518 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13519
13520 /* for some reason default namespace uri is not reported */
13521 hr = IXMLDOMNode_get_namespaceURI(node, &str);
13522 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13523 ok(!lstrcmpW(str, L""), "got uri %s\n", wine_dbgstr_w(str));
13525
13526 IXMLDOMNode_Release(node);
13527 IXMLDOMElement_Release(el);
13528 IXMLDOMDocument_Release(doc);
13529 free_bstrs();
13530}
13531
13532static void test_url(void)
13533{
13534 IXMLDOMDocument *doc;
13535 HRESULT hr;
13536 BSTR s;
13537
13538 doc = create_document(&IID_IXMLDOMDocument);
13539
13540 hr = IXMLDOMDocument_get_url(doc, NULL);
13541 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
13542
13543 s = (void *)0xdeadbeef;
13544 hr = IXMLDOMDocument_get_url(doc, &s);
13545 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
13546 ok(s == NULL, "got %s\n", wine_dbgstr_w(s));
13547
13548 IXMLDOMDocument_Release(doc);
13549}
13550
13551static void test_merging_text(void)
13552{
13553 IXMLDOMText *nodetext;
13554 IXMLDOMText *newtext;
13556 IXMLDOMDocument *doc;
13558 HRESULT hr;
13559 VARIANT v;
13560 BSTR str;
13561 int i;
13562
13563 doc = create_document(&IID_IXMLDOMDocument);
13564
13565 hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing"), &root);
13566 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13567
13568 hr = IXMLDOMDocument_appendChild(doc, (IXMLDOMNode*)root, NULL);
13569 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13570
13571 /* test xmlAddChild */
13572 for (i = 0; i < 10; i++)
13573 {
13574 str = SysAllocString(L"str1");
13575 hr = IXMLDOMDocument_createTextNode(doc, str, &nodetext);
13577 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13578
13579 newtext = NULL;
13580 hr = IXMLDOMElement_appendChild(root, (IXMLDOMNode*)nodetext, (IXMLDOMNode**)&newtext);
13581 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13582 ok(nodetext == newtext, "expected %p, got %p\n", nodetext, newtext);
13583
13584 IXMLDOMText_Release(newtext);
13585 IXMLDOMText_Release(nodetext);
13586 }
13587
13588 /* test xmlAddPrevSibling */
13589 hr = IXMLDOMElement_get_firstChild(root, &first);
13590 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13591 V_VT(&v) = VT_UNKNOWN;
13592 V_UNKNOWN(&v) = (IUnknown*)first;
13593 for (i = 0; i < 10; i++)
13594 {
13595 str = SysAllocString(L"str2");
13596 hr = IXMLDOMDocument_createTextNode(doc, str, &nodetext);
13598 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13599
13600 newtext = NULL;
13601 hr = IXMLDOMElement_insertBefore(root, (IXMLDOMNode*)nodetext, v, (IXMLDOMNode**)&newtext);
13602 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13603 ok(nodetext == newtext, "expected %p, got %p\n", nodetext, newtext);
13604
13605 IXMLDOMText_Release(newtext);
13606 IXMLDOMText_Release(nodetext);
13607 }
13608
13609 IXMLDOMNode_Release(first);
13610 IXMLDOMElement_Release(root);
13611 IXMLDOMDocument_Release(doc);
13612
13613 free_bstrs();
13614}
13615
13617{
13618 BOOL known_iid = IsEqualIID(riid, &IID_IHTMLObjectElement) ||
13619 IsEqualIID(riid, &IID_transformdest_unknown) ||
13620 IsEqualIID(riid, &IID_IServiceProvider) ||
13621 IsEqualIID(riid, &IID_IStream) ||
13622 IsEqualIID(riid, &IID_ISequentialStream) ||
13623 IsEqualIID(riid, &IID_IResponse);
13624
13625 todo_wine_if(IsEqualIID(riid, &IID_IXMLDOMDocument))
13626 ok(known_iid, "Unexpected riid %s\n", wine_dbgstr_guid(riid));
13627
13628 return E_NOINTERFACE;
13629}
13630
13632{
13633 return 2;
13634}
13635
13637{
13638 return 1;
13639}
13640
13641static const IUnknownVtbl transformdestvtbl =
13642{
13646};
13647
13649{
13650 IUnknown transformdest = { &transformdestvtbl };
13651 IXMLDOMDocument *doc, *doc2, *doc3;
13652 ISequentialStream *sstream;
13653 LARGE_INTEGER off;
13654 WCHAR buffer[256];
13657 ULONG nread;
13658 HRESULT hr;
13659 VARIANT v;
13660
13661 doc = create_document(&IID_IXMLDOMDocument);
13662 doc2 = create_document(&IID_IXMLDOMDocument);
13663 doc3 = create_document(&IID_IXMLDOMDocument);
13664
13665 hr = IXMLDOMDocument_loadXML(doc, _bstr_(szTransformXML), &b);
13666 ok(hr == S_OK, "Failed to load document, hr %#lx.\n", hr);
13667 hr = IXMLDOMDocument_loadXML(doc2, _bstr_(szTransformSSXML), &b);
13668 ok(hr == S_OK, "Failed to load document, hr %#lx.\n", hr);
13669
13670 V_VT(&v) = VT_UNKNOWN;
13671 V_UNKNOWN(&v) = &transformdest;
13672 hr = IXMLDOMDocument_transformNodeToObject(doc, (IXMLDOMNode *)doc2, v);
13673 ok(hr == E_INVALIDARG, "Failed to transform node, hr %#lx.\n", hr);
13674
13675 V_VT(&v) = VT_UNKNOWN;
13676 V_UNKNOWN(&v) = NULL;
13677 hr = IXMLDOMDocument_transformNodeToObject(doc, (IXMLDOMNode *)doc2, v);
13678 ok(hr == E_INVALIDARG, "Failed to transform node, hr %#lx.\n", hr);
13679
13680 V_VT(&v) = VT_DISPATCH;
13681 V_DISPATCH(&v) = NULL;
13682 hr = IXMLDOMDocument_transformNodeToObject(doc, (IXMLDOMNode *)doc2, v);
13683 ok(hr == E_INVALIDARG, "Failed to transform node, hr %#lx.\n", hr);
13684
13685 V_VT(&v) = VT_DISPATCH;
13686 V_DISPATCH(&v) = (IDispatch *)doc3;
13687 hr = IXMLDOMDocument_transformNodeToObject(doc, (IXMLDOMNode *)doc2, v);
13688 ok(hr == S_OK, "Failed to transform node, hr %#lx.\n", hr);
13689
13690 /* IStream */
13692 V_VT(&v) = VT_UNKNOWN;
13693 V_UNKNOWN(&v) = (IUnknown *)istream;
13694 hr = IXMLDOMDocument_transformNodeToObject(doc, (IXMLDOMNode *)doc2, v);
13695 ok(hr == S_OK, "Failed to transform node, hr %#lx.\n", hr);
13696
13697 off.QuadPart = 0;
13698 hr = IStream_Seek(istream, off, STREAM_SEEK_SET, NULL);
13699 ok(hr == S_OK, "Failed to seek, hr %#lx.\n", hr);
13700
13701 nread = 0;
13702 memset(buffer, 0xcc, sizeof(buffer));
13703 hr = IStream_Read(istream, buffer, sizeof(buffer), &nread);
13704 ok(hr == S_OK, "Failed to read, hr %#lx.\n", hr);
13705 buffer[nread/2] = 0;
13706 ok(buffer[0] == 0xfeff, "got %x\n", buffer[0]);
13708 IStream_Release(istream);
13709
13710 /* ISequentialStream */
13712 sstream = NULL;
13713 hr = IStream_QueryInterface(istream, &IID_ISequentialStream, (void**)&sstream);
13714#ifdef __REACTOS__
13716 {
13717 ok(hr == E_NOINTERFACE, "Unexpected hr %#lx.\n", hr);
13718 }
13719 else
13720 {
13721#endif
13722 ok(hr == S_OK, "Failed to QI, hr %#lx.\n", hr);
13723
13724 V_VT(&v) = VT_UNKNOWN;
13725 V_UNKNOWN(&v) = (IUnknown *)sstream;
13726 hr = IXMLDOMDocument_transformNodeToObject(doc, (IXMLDOMNode *)doc2, v);
13727 ok(hr == S_OK, "Failed to transform node, hr %#lx.\n", hr);
13728
13729 off.QuadPart = 0;
13730 hr = IStream_Seek(istream, off, STREAM_SEEK_SET, NULL);
13731 ok(hr == S_OK, "Failed to seek, hr %#lx.\n", hr);
13732
13733 nread = 0;
13734 memset(buffer, 0xcc, sizeof(buffer));
13735 hr = ISequentialStream_Read(sstream, buffer, sizeof(buffer), &nread);
13736 ok(hr == S_OK, "Failed to read, hr %#lx.\n", hr);
13737 buffer[nread/2] = 0;
13738 ok(buffer[0] == 0xfeff, "got %x\n", buffer[0]);
13740 ISequentialStream_Release(sstream);
13741 IStream_Release(istream);
13742#ifdef __REACTOS__
13743 }
13744#endif
13745
13746 IXMLDOMDocument_Release(doc3);
13747 IXMLDOMDocument_Release(doc2);
13748 IXMLDOMDocument_Release(doc);
13749 free_bstrs();
13750}
13751
13753{
13754 IXMLDOMDocument2 *doc;
13755 VARIANT var;
13756 HRESULT hr;
13757
13758 if (!is_clsid_supported(&CLSID_DOMDocument60, &IID_IXMLDOMDocument2))
13759 {
13760 win_skip("NormalizeAttributeValues is not supported.\n");
13761 return;
13762 }
13763
13764 doc = create_document_version(60, &IID_IXMLDOMDocument2);
13765
13766 V_VT(&var) = VT_I2;
13767 V_I2(&var) = 10;
13768 hr = IXMLDOMDocument2_getProperty(doc, _bstr_("NormalizeAttributeValues"), &var);
13769todo_wine {
13770 ok(hr == S_OK, "Failed to get property value, hr %#lx.\n", hr);
13771 ok(V_VT(&var) == VT_BOOL, "Unexpected property value type, vt %d.\n", V_VT(&var));
13772 ok(V_BOOL(&var) == VARIANT_FALSE, "Unexpected property value.\n");
13773}
13774 V_VT(&var) = VT_BOOL;
13775 V_BOOL(&var) = VARIANT_TRUE;
13776 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("NormalizeAttributeValues"), var);
13777 ok(hr == S_OK, "Failed to set property, hr %#lx.\n", hr);
13778
13779 V_VT(&var) = VT_I2;
13780 V_I2(&var) = 10;
13781 hr = IXMLDOMDocument2_getProperty(doc, _bstr_("NormalizeAttributeValues"), &var);
13782todo_wine {
13783 ok(hr == S_OK, "Failed to get property value, hr %#lx.\n", hr);
13784 ok(V_VT(&var) == VT_BOOL, "Unexpected property value type, vt %d.\n", V_VT(&var));
13785 ok(V_BOOL(&var) == VARIANT_TRUE, "Unexpected property value.\n");
13786}
13787 IXMLDOMDocument2_Release(doc);
13788}
13789
13791{
13792 IXMLDOMDocument2 *doc;
13793 VARIANT var;
13794 HRESULT hr;
13795
13796 doc = create_document_version(60, &IID_IXMLDOMDocument2);
13797
13798 /* The default max element depth value should be 256. */
13799 V_VT(&var) = VT_UI4;
13800 V_UI4(&var) = 0xdeadbeef;
13801 hr = IXMLDOMDocument2_getProperty(doc, _bstr_("MaxElementDepth"), &var);
13802todo_wine {
13803 ok(hr == S_OK, "Failed to get property value, hr %#lx.\n", hr);
13804 ok(V_VT(&var) == VT_I4, "Unexpected property value type, vt %d.\n", V_VT(&var));
13805 ok(V_I4(&var) == 256, "Unexpected property value.\n");
13806}
13807
13808 /* Changes to the depth value should be observable when subsequently retrieved. */
13809 V_VT(&var) = VT_I4;
13810 V_I4(&var) = 32;
13811 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("MaxElementDepth"), var);
13812 ok(hr == S_OK, "Failed to set property, hr %#lx.\n", hr);
13813
13814 V_VT(&var) = VT_UI4;
13815 V_UI4(&var) = 0xdeadbeef;
13816 hr = IXMLDOMDocument2_getProperty(doc, _bstr_("MaxElementDepth"), &var);
13817todo_wine {
13818 ok(hr == S_OK, "Failed to get property value, hr %#lx.\n", hr);
13819 ok(V_VT(&var) == VT_I4, "Unexpected property value type, vt %d.\n", V_VT(&var));
13820 ok(V_I4(&var) == 32, "Unexpected property value.\n");
13821}
13822
13823 IXMLDOMDocument2_Release(doc);
13824}
13825
13827 const GUID *guid;
13828 const char *clsid;
13830
13832 { &CLSID_DOMDocument, "CLSID_DOMDocument" },
13833 { &CLSID_DOMDocument2, "CLSID_DOMDocument2" },
13834 { &CLSID_DOMDocument26, "CLSID_DOMDocument26" },
13835 { &CLSID_DOMDocument30, "CLSID_DOMDocument30" },
13836 { 0 }
13837};
13838
13839/* see dlls/msxml[46]/tests/domdoc.c */
13841{
13843 struct test {
13844 const char *xml;
13845 int explen;
13846 const char *names[3];
13847 const char *prefixes[3];
13848 const char *basenames[3];
13849 const char *uris[3];
13850 const char *texts[3];
13851 const char *xmls[3];
13852 };
13853 static const struct test tests[] = {
13854 {
13855 "<a ns:b=\"b attr\" d=\"d attr\" xmlns:ns=\"nshref\" />", 3,
13856 { "ns:b", "d", "xmlns:ns" }, /* nodeName */
13857 { "ns", NULL, "xmlns" }, /* prefix */
13858 { "b", "d", "ns" }, /* baseName */
13859 { "nshref", NULL, "" }, /* namespaceURI */
13860 { "b attr", "d attr", "nshref" }, /* text */
13861 { "ns:b=\"b attr\"", "d=\"d attr\"", "xmlns:ns=\"nshref\"" }, /* xml */
13862 },
13863 /* property only */
13864 {
13865 "<a d=\"d attr\" />", 1,
13866 { "d" }, /* nodeName */
13867 { NULL }, /* prefix */
13868 { "d" }, /* baseName */
13869 { NULL }, /* namespaceURI */
13870 { "d attr" }, /* text */
13871 { "d=\"d attr\"" }, /* xml */
13872 },
13873 /* namespace only */
13874 {
13875 "<a xmlns:ns=\"nshref\" />", 1,
13876 { "xmlns:ns" }, /* nodeName */
13877 { "xmlns" }, /* prefix */
13878 { "ns" }, /* baseName */
13879 { "" }, /* namespaceURI */
13880 { "nshref" }, /* text */
13881 { "xmlns:ns=\"nshref\"" }, /* xml */
13882 },
13883 /* default namespace */
13884 {
13885 "<a xmlns=\"nshref\" />", 1,
13886 { "xmlns" }, /* nodeName */
13887 { "xmlns" }, /* prefix */
13888 { "" }, /* baseName */
13889 { "" }, /* namespaceURI */
13890 { "nshref" }, /* text */
13891 { "xmlns=\"nshref\"" }, /* xml */
13892 },
13893 /* no properties or namespaces */
13894 {
13895 "<a />", 0,
13896 },
13897
13898 { NULL }
13899 };
13900 const struct test *test;
13903 IXMLDOMDocument *doc;
13905 LONG len, i;
13906 HRESULT hr;
13907 BSTR str;
13908
13909 while (entry->guid)
13910 {
13911 if (!is_clsid_supported(entry->guid, &IID_IXMLDOMDocument2))
13912 {
13913 entry++;
13914 continue;
13915 }
13916
13917 test = tests;
13918 while (test->xml) {
13919 hr = CoCreateInstance(entry->guid, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (void **)&doc);
13920 ok(hr == S_OK, "Unexpected hr %#lx for %s.\n", hr, wine_dbgstr_guid(entry->guid));
13921
13922 hr = IXMLDOMDocument_loadXML(doc, _bstr_(test->xml), &b);
13923 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13924
13925 node = NULL;
13926 hr = IXMLDOMDocument_selectSingleNode(doc, _bstr_("a"), &node);
13927 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13928
13929 hr = IXMLDOMNode_get_attributes(node, &map);
13930 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13931
13932 len = -1;
13933 hr = IXMLDOMNamedNodeMap_get_length(map, &len);
13934 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13935 ok(len == test->explen, "got %ld\n", len);
13936
13937 item = NULL;
13938 hr = IXMLDOMNamedNodeMap_get_item(map, test->explen+1, &item);
13939 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
13940 ok(!item, "Item should be NULL\n");
13941
13942 for (i = 0; i < len; i++)
13943 {
13944 item = NULL;
13945 hr = IXMLDOMNamedNodeMap_get_item(map, i, &item);
13946 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13947#ifdef __REACTOS__
13948 if (item == NULL)
13949 {
13950 ok(0, "item is NULL at index %ld\n", i);
13951 continue;
13952 }
13953#endif
13954 str = NULL;
13955 hr = IXMLDOMNode_get_nodeName(item, &str);
13956 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13957 ok(!lstrcmpW(str, _bstr_(test->names[i])), "got %s\n", wine_dbgstr_w(str));
13959
13960 str = NULL;
13961 hr = IXMLDOMNode_get_prefix(item, &str);
13962 if (test->prefixes[i])
13963 {
13964 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13965 ok(!lstrcmpW(str, _bstr_(test->prefixes[i])), "got %s\n", wine_dbgstr_w(str));
13967 }
13968 else
13969 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
13970
13971 str = NULL;
13972 hr = IXMLDOMNode_get_baseName(item, &str);
13973 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13974 ok(!lstrcmpW(str, _bstr_(test->basenames[i])), "got %s\n", wine_dbgstr_w(str));
13976
13977 str = NULL;
13978 hr = IXMLDOMNode_get_namespaceURI(item, &str);
13979 if (test->uris[i])
13980 {
13981 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13982 if (test->prefixes[i] && !strcmp(test->prefixes[i], "xmlns"))
13983 ok(!SysStringLen(str), "got %s\n", wine_dbgstr_w(str));
13984 else
13985 ok(!lstrcmpW(str, _bstr_(test->uris[i])), "got %s\n", wine_dbgstr_w(str));
13987 }
13988 else
13989 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
13990
13991 str = NULL;
13992 hr = IXMLDOMNode_get_text(item, &str);
13993 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13994 ok(!lstrcmpW(str, _bstr_(test->texts[i])), "got %s\n", wine_dbgstr_w(str));
13996
13997 str = NULL;
13998 hr = IXMLDOMNode_get_xml(item, &str);
13999 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
14000 ok(!lstrcmpW(str, _bstr_(test->xmls[i])), "got %s\n", wine_dbgstr_w(str));
14002
14003 IXMLDOMNode_Release(item);
14004 }
14005
14006 IXMLDOMNamedNodeMap_Release(map);
14007 IXMLDOMNode_Release(node);
14008 IXMLDOMDocument_Release(doc);
14009
14010 test++;
14011 }
14012
14013 entry++;
14014 }
14015 free_bstrs();
14016}
14017
14018static const IID *qi_list[32];
14019static int qi_count;
14020
14022{
14023 int i;
14024
14025 for (i = 0; i < qi_count; i++)
14026 {
14027 if (IsEqualGUID(qi_list[i], iid))
14028 return TRUE;
14029 }
14030
14031 return FALSE;
14032}
14033
14035{
14036 int i;
14037
14038 for (i = 0; i < qi_count; i++)
14039 {
14040 if (IsEqualGUID(qi_list[i], service) && IsEqualGUID(qi_list[i + 1], iid))
14041 return TRUE;
14042 }
14043
14044 return FALSE;
14045}
14046
14048{
14050 qi_list[qi_count++] = iid;
14051 else
14052 ok(0, "qi_list overflow: %d\n", qi_count);
14053
14054 if (IsEqualGUID(iid, &IID_IUnknown) ||
14055 IsEqualGUID(iid, &IID_IServiceProvider))
14056 {
14057 *ppv = iface;
14058 return S_OK;
14059 }
14060
14061 *ppv = NULL;
14062 return E_NOINTERFACE;
14063}
14064
14066{
14067 return 2;
14068}
14069
14071{
14072 return 1;
14073}
14074
14076 REFIID iid, void **ppv)
14077{
14078 if (IsEqualGUID(service, &SID_SContainerDispatch) ||
14079 IsEqualGUID(service, &SID_SInternetHostSecurityManager))
14080 {
14081 if (qi_count + 1 < ARRAY_SIZE(qi_list))
14082 {
14083 qi_list[qi_count++] = service;
14084 qi_list[qi_count++] = iid;
14085 }
14086 else
14087 ok(0, "qi_list overflow: %d\n", qi_count);
14088 }
14089
14090 *ppv = NULL;
14091 return E_NOINTERFACE;
14092}
14093
14094static const IServiceProviderVtbl sp_vtbl =
14095{
14097 sp_AddRef,
14098 sp_Release,
14100};
14101
14103
14104static void test_load_with_site(void)
14105{
14106 char path[MAX_PATH];
14107 IXMLDOMDocument2 *doc;
14109 VARIANT var;
14111 HRESULT hr;
14112
14114 strcat(path, "winetest.xml");
14116
14117 doc = create_document(&IID_IXMLDOMDocument2);
14118
14119 hr = IXMLDOMDocument2_QueryInterface(doc, &IID_IObjectWithSite, (void **)&site);
14120 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
14121
14122 qi_count = 0;
14123 hr = IObjectWithSite_SetSite(site, (IUnknown *)&sp);
14124 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
14125 ok(qi_count != 0, "got %d QI calls\n", qi_count);
14126 todo_wine
14127 ok(qi_list_contains(&IID_IXMLDOMDocument), "QI(IID_IXMLDOMDocument) was not called\n");
14128 ok(qi_list_contains(&IID_IHTMLDocument2), "QI(IID_IHTMLDocument2) was not called\n");
14129 ok(qi_list_contains(&IID_IServiceProvider), "QI(IID_IServiceProvider) was not called\n");
14130 todo_wine
14131 ok(qi_list_contains(&IID_IOleClientSite), "QI(IID_IOleClientSite) was not called\n");
14132 ok(qi_list_contains_service(&SID_SContainerDispatch, &IID_IHTMLDocument2),
14133 "QI(SID_SContainerDispatch, IID_IHTMLDocument2) was not called\n");
14134 todo_wine
14135 ok(qi_list_contains_service(&SID_SInternetHostSecurityManager, &IID_IXMLDOMDocument),
14136 "QI(SID_SInternetHostSecurityManager, IID_IXMLDOMDocument) was not called\n");
14137
14138 qi_count = 0;
14139 V_VT(&var) = VT_BSTR;
14140 V_BSTR(&var) = _bstr_(path);
14141 hr = IXMLDOMDocument2_load(doc, var, &b);
14142 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
14143 ok(b == VARIANT_TRUE, "got %d\n", b);
14144 ok(qi_count == 0, "got %d QI calls\n", qi_count);
14145
14146 IXMLDOMDocument2_Release(doc);
14147
14149 free_bstrs();
14150}
14151
14153{
14154 const GUID *guid;
14155 const char *clsid;
14158
14160{
14161 { &CLSID_DOMDocument, "CLSID_DOMDocument" , E_FAIL },
14162 { &CLSID_DOMDocument2, "CLSID_DOMDocument2", E_FAIL },
14163 { &CLSID_DOMDocument26, "CLSID_DOMDocument26", E_FAIL },
14164 { &CLSID_DOMDocument30, "CLSID_DOMDocument30", E_FAIL },
14165 { &CLSID_DOMDocument40, "CLSID_DOMDocument40", S_OK },
14166 { &CLSID_DOMDocument60, "CLSID_DOMDocument60", S_OK },
14167 { 0 }
14168};
14169
14171{
14173 int i = 0;
14174
14175 while (entry->guid)
14176 {
14177 IXMLDOMDocument2 *doc, *doc_clone;
14178 IXMLDOMNode *node_clone;
14179 VARIANT var, var_clone;
14181 HRESULT hr;
14182
14183 i++;
14184 if (!is_clsid_supported(entry->guid, &IID_IXMLDOMDocument2))
14185 {
14186 entry++;
14187 continue;
14188 }
14189
14190 hr = CoCreateInstance(entry->guid, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (void **)&doc);
14191 ok(hr == S_OK, "%d: got %#lx.\n", i, hr);
14192
14193 V_VT(&var) = VT_I2;
14194 V_I2(&var) = 0;
14195 hr = IXMLDOMDocument2_getProperty(doc, _bstr_("ValidateOnParse"), &var);
14196 ok(hr == entry->hr || broken(hr == E_FAIL) /* win8 */, "%d: got hr %#lx.\n", i, hr);
14197 if (SUCCEEDED(hr))
14198 {
14199 ok(V_VT(&var) == VT_BOOL, "%d: got property value type %d.\n", i, V_VT(&var));
14200 ok(V_BOOL(&var) == VARIANT_TRUE, "%d: got property value %d.\n", i, V_BOOL(&var));
14201 }
14202 else
14203 {
14204 ok(V_VT(&var) == VT_I2, "%d: got property value type %d.\n", i, V_VT(&var));
14205 ok(V_I2(&var) == 0, "%d: got property value %d.\n", i, V_I2(&var));
14206 if (IsEqualCLSID(entry->guid, &CLSID_DOMDocument40))
14207 {
14208 win_skip("Skip tests for CLSID_DOMDocument40 on Windows 8.\n");
14209 IXMLDOMDocument2_Release(doc);
14210 entry++;
14211 continue;
14212 }
14213 }
14214
14215 b = VARIANT_FALSE;
14216 hr = IXMLDOMDocument2_get_validateOnParse(doc, &b);
14217 ok(hr == S_OK, "%d: got hr %#lx.\n", i, hr);
14218 ok(b == VARIANT_TRUE, "%d: got property value %d.\n", i, b);
14219
14220 V_VT(&var) = VT_I2;
14221 V_I2(&var) = 0;
14222 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("ValidateOnParse"), var);
14223 ok(hr == entry->hr, "%d: got hr %#lx.\n", i, hr);
14224 V_VT(&var) = VT_I2;
14225 V_I2(&var) = 10;
14226 hr = IXMLDOMDocument2_getProperty(doc, _bstr_("ValidateOnParse"), &var);
14227 ok(hr == entry->hr, "%d: got hr %#lx.\n", i, hr);
14228 if (SUCCEEDED(hr))
14229 {
14230 ok(V_VT(&var) == VT_BOOL, "%d: got property value type %d.\n", i, V_VT(&var));
14231 ok(V_BOOL(&var) == VARIANT_FALSE, "%d: got property value %d.\n", i, V_BOOL(&var));
14232 }
14233
14234 V_VT(&var) = VT_BOOL;
14235 V_BOOL(&var) = VARIANT_TRUE;
14236 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("ValidateOnParse"), var);
14237 ok(hr == entry->hr, "%d: got hr %#lx.\n", i, hr);
14238 b = VARIANT_FALSE;
14239 hr = IXMLDOMDocument2_get_validateOnParse(doc, &b);
14240 ok(hr == S_OK, "%d: got hr %#lx.\n", i, hr);
14241 ok(b == VARIANT_TRUE, "%d: got property value %d.\n", i, b);
14242
14243 V_VT(&var) = VT_I2;
14244 V_I2(&var) = 0;
14245 hr = IXMLDOMDocument2_getProperty(doc, _bstr_("ValidateOnParse"), &var);
14246 ok(hr == entry->hr, "%d: got hr %#lx.\n", i, hr);
14247 if (SUCCEEDED(hr))
14248 {
14249 ok(V_VT(&var) == VT_BOOL, "%d: got property value type %d.\n", i, V_VT(&var));
14250 ok(V_BOOL(&var) == VARIANT_TRUE, "%d: got property value %d.\n", i, V_BOOL(&var));
14251 }
14252
14253 b = VARIANT_FALSE;
14254 hr = IXMLDOMDocument2_put_validateOnParse(doc, b);
14255 ok(hr == S_OK, "%d: got hr %#lx.\n", i, hr);
14256 V_VT(&var) = VT_I2;
14257 V_I2(&var) = 10;
14258 hr = IXMLDOMDocument2_getProperty(doc, _bstr_("ValidateOnParse"), &var);
14259 ok(hr == entry->hr, "%d: got hr %#lx.\n", i, hr);
14260 if (SUCCEEDED(hr))
14261 {
14262 ok(V_VT(&var) == VT_BOOL, "%d: got property value type %d.\n", i, V_VT(&var));
14263 ok(V_BOOL(&var) == VARIANT_FALSE, "%d: got property value %d.\n", i, V_BOOL(&var));
14264 }
14265
14266 /* Cloned document inherits the property. */
14267 hr = IXMLDOMDocument2_cloneNode(doc, VARIANT_TRUE, &node_clone);
14268 ok(hr == S_OK, "%d: got hr %#lx.\n", i, hr);
14269 ok(node_clone != NULL, "%d: got node %p.\n", i, node_clone);
14270 hr = IXMLDOMNode_QueryInterface(node_clone, &IID_IXMLDOMDocument2, (void **)&doc_clone);
14271 ok(hr == S_OK, "%d: got hr %#lx.\n", i, hr);
14272 V_VT(&var) = VT_I2;
14273 V_I2(&var) = 10;
14274 hr = IXMLDOMDocument2_getProperty(doc, _bstr_("ValidateOnParse"), &var);
14275 ok(hr == entry->hr, "%d: got hr %#lx.\n", i, hr);
14276 if (SUCCEEDED(hr))
14277 {
14278 ok(V_VT(&var) == VT_BOOL, "%d: got property value type %d.\n", i, V_VT(&var));
14279 ok(V_BOOL(&var) == VARIANT_FALSE, "%d: got property value %d.\n", i, V_BOOL(&var));
14280 }
14281 V_VT(&var_clone) = VT_I2;
14282 V_I2(&var_clone) = 10;
14283 hr = IXMLDOMDocument2_getProperty(doc_clone, _bstr_("ValidateOnParse"), &var_clone);
14284 ok(hr == entry->hr, "%d: got hr %#lx.\n", i, hr);
14285 if (SUCCEEDED(hr))
14286 {
14287 ok(V_VT(&var_clone) == V_VT(&var), "%d: got property value type %d.\n", i, V_VT(&var_clone));
14288 ok(V_BOOL(&var_clone) == V_BOOL(&var), "%d: got property value %d.\n", i, V_BOOL(&var_clone));
14289 }
14290 b = VARIANT_TRUE;
14291 hr = IXMLDOMDocument2_get_validateOnParse(doc_clone, &b);
14292 ok(hr == S_OK, "%d: got hr %#lx.\n", i, hr);
14293 ok(b == VARIANT_FALSE, "%d: got property value %d.\n", i, b);
14294 IXMLDOMNode_Release(node_clone);
14295 IXMLDOMDocument2_Release(doc_clone);
14296
14297 IXMLDOMDocument2_Release(doc);
14298 entry++;
14299 }
14300}
14301
14302static void test_indent(void)
14303{
14304 HRESULT hr;
14305 VARIANT_BOOL b = VARIANT_FALSE;
14306 BSTR data, str;
14307 const WCHAR *data_expected;
14308 IXMLDOMDocument *doc;
14310
14311 str = SysAllocString(L"<?xml version='1.0' encoding='Windows-1252'?>\n"
14312 "<root>\n"
14313 "<a>\n"
14314 "<b/>\n"
14315 "</a>\n"
14316 "</root>\n");
14317 hr = CoCreateInstance(&CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (void **)&doc);
14318 ok(hr == S_OK, "Unable to create instance hr %#lx.\n", hr);
14319 hr = IXMLDOMDocument_loadXML(doc, str, &b);
14320 ok(hr == S_OK, "Unable to load XML hr %#lx.\n", hr);
14321 hr = IXMLDOMDocument_get_documentElement(doc, &element);
14322 ok(hr == S_OK, "Unable to get element hr %#lx.\n", hr);
14323 hr = IXMLDOMElement_get_xml(element, &data);
14324 ok(hr == S_OK, "Unable to get XML hr %#lx.\n", hr);
14325
14326 data_expected = L"<root>\r\n"
14327 "\t<a>\r\n"
14328 "\t\t<b/>\r\n"
14329 "\t</a>\r\n"
14330 "</root>";
14331 ok(!lstrcmpW(data, data_expected), "incorrect element string, got '%s'\n", wine_dbgstr_w(data));
14332
14334}
14335
14337{
14339 ok(hr == S_OK, "failed to init com\n");
14340 if (hr != S_OK) return 1;
14341
14342 test_indent();
14343
14345 return 0;
14346}
14347
14349{
14350 HRESULT hr;
14351 HANDLE thread;
14352
14353 hr = CoInitialize( NULL );
14354 ok( hr == S_OK, "failed to init com\n");
14355 if (hr != S_OK) return;
14356
14358 if (!is_clsid_supported(&CLSID_DOMDocument2, &IID_IXMLDOMDocument))
14359 {
14360 win_skip("DOMDocument2 is not supported. Skipping all tests.\n");
14362 return;
14363 }
14364
14367 test_domdoc();
14369 test_domnode();
14370 test_refs();
14371 test_create();
14373 test_get_text();
14382 test_XPath();
14385 test_xmlTypes();
14386 test_save();
14406 test_events();
14408 test_get_xml();
14417 test_load();
14418 test_dispex();
14425 test_put_data();
14430 test_url();
14437 test_xsltext();
14439
14440 if (is_clsid_supported(&CLSID_MXNamespaceManager40, &IID_IMXNamespaceManager))
14441 {
14444 }
14445
14446 /* We need to test test_indent in a seperate thread. This is to prevent regressions in multi-threaded
14447 applications where the default indentation is set (e.g. by setting xmlTreeIndentString) in the first
14448 thread but not for new threads, leading to the wrong indentation in subsequent threads. */
14452
14454}
basic_istream< char, char_traits< char > > istream
Definition: _iosfwd.h:120
#define isspace(c)
Definition: acclib.h:69
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
#define read
Definition: acwin.h:96
static unsigned char bytes[4]
Definition: adnsresfilter.c:74
#define GetNTVersion()
Definition: apitest.h:17
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define ok(value,...)
Definition: atltest.h:57
#define broken(x)
Definition: atltest.h:178
#define START_TEST(x)
Definition: atltest.h:75
#define ok_(x1, x2)
Definition: atltest.h:61
static const WCHAR nameW[]
Definition: main.c:49
#define index(s, c)
Definition: various.h:29
#define ARRAY_SIZE(A)
Definition: main.h:20
static HANDLE thread
Definition: service.c:33
const GUID IID_IUnknown
struct _root root
Definition: list.h:37
Definition: _map.h:48
Definition: _set.h:50
int selection
Definition: ctm.c:92
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define CloseHandle
Definition: compat.h:739
double DATE
Definition: compat.h:2253
#define CP_ACP
Definition: compat.h:109
#define OPEN_EXISTING
Definition: compat.h:775
#define ReadFile(a, b, c, d, e)
Definition: compat.h:742
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define CreateFileA(a, b, c, d, e, f, g)
Definition: compat.h:740
OLECHAR * BSTR
Definition: compat.h:2293
#define GENERIC_READ
Definition: compat.h:135
#define MAX_PATH
Definition: compat.h:34
unsigned short VARTYPE
Definition: compat.h:2254
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
#define lstrcpyW
Definition: compat.h:749
short VARIANT_BOOL
Definition: compat.h:2290
#define MultiByteToWideChar
Definition: compat.h:110
@ VT_BSTR
Definition: compat.h:2303
@ VT_R4
Definition: compat.h:2299
@ VT_NULL
Definition: compat.h:2296
@ VT_UNKNOWN
Definition: compat.h:2308
@ VT_BYREF
Definition: compat.h:2342
@ VT_UI2
Definition: compat.h:2312
@ VT_ARRAY
Definition: compat.h:2341
@ VT_R8
Definition: compat.h:2300
@ VT_CY
Definition: compat.h:2301
@ VT_I1
Definition: compat.h:2310
@ VT_I4
Definition: compat.h:2298
@ VT_DATE
Definition: compat.h:2302
@ VT_BOOL
Definition: compat.h:2306
@ VT_I2
Definition: compat.h:2297
@ VT_UI4
Definition: compat.h:2313
@ VT_EMPTY
Definition: compat.h:2295
@ VT_DISPATCH
Definition: compat.h:2304
@ VT_UI1
Definition: compat.h:2311
#define lstrlenW
Definition: compat.h:750
BOOL WINAPI DeleteFileA(IN LPCSTR lpFileName)
Definition: delete.c:24
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
DWORD WINAPI GetTempPathA(IN DWORD nBufferLength, OUT LPSTR lpBuffer)
Definition: path.c:2054
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
Definition: thread.c:137
int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4246
LCID lcid
Definition: locale.c:5656
const WCHAR * text
Definition: package.c:1794
@ XML_E_XMLDECLSYNTAX
Definition: xmlparser.idl:109
@ XML_E_MISSINGROOT
Definition: xmlparser.idl:146
@ XML_E_MISSINGQUOTE
Definition: xmlparser.idl:104
@ XML_E_BADCHARINSTRING
Definition: xmlparser.idl:108
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:1964
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:2067
HRESULT WINAPI GetHGlobalFromStream(IStream *pstm, HGLOBAL *phglobal)
HRESULT WINAPI CreateStreamOnHGlobal(HGLOBAL hGlobal, BOOL fDeleteOnRelease, LPSTREAM *ppstm)
HRESULT WINAPI SafeArrayGetUBound(SAFEARRAY *psa, UINT nDim, LONG *plUbound)
Definition: safearray.c:1033
HRESULT WINAPI SafeArrayAccessData(SAFEARRAY *psa, void **ppvData)
Definition: safearray.c:1137
HRESULT WINAPI SafeArrayUnlock(SAFEARRAY *psa)
Definition: safearray.c:831
HRESULT WINAPI SafeArrayUnaccessData(SAFEARRAY *psa)
Definition: safearray.c:1168
UINT WINAPI SafeArrayGetDim(SAFEARRAY *psa)
Definition: safearray.c:1094
SAFEARRAY *WINAPI SafeArrayCreateVector(VARTYPE vt, LONG lLbound, ULONG cElements)
Definition: safearray.c:677
HRESULT WINAPI SafeArrayGetLBound(SAFEARRAY *psa, UINT nDim, LONG *plLbound)
Definition: safearray.c:1066
HRESULT WINAPI SafeArrayDestroyData(SAFEARRAY *psa)
Definition: safearray.c:1256
#define assert(x)
Definition: debug.h:53
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
#define INFINITE
Definition: serial.h:102
@ NODE_INVALID
Definition: shared.h:244
POINTL point
Definition: edittest.c:50
int global
Definition: ehframes.cpp:22
static unsigned char buff[32768]
Definition: fatten.c:17
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
FxChildList * pList
const GLdouble * v
Definition: gl.h:2040
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLdouble s
Definition: gl.h:2039
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
struct _cl_event * event
Definition: glext.h:7739
GLenum GLenum GLsizei const GLuint GLboolean enabled
Definition: glext.h:7750
GLdouble n
Definition: glext.h:7729
GLuint res
Definition: glext.h:9613
GLenum src
Definition: glext.h:6340
GLuint GLuint * names
Definition: glext.h:11545
GLuint buffer
Definition: glext.h:5915
GLsizeiptr size
Definition: glext.h:5919
GLintptr offset
Definition: glext.h:5920
GLuint index
Definition: glext.h:6031
GLenum GLint GLuint mask
Definition: glext.h:6028
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLenum const GLfloat * params
Definition: glext.h:5645
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLbitfield flags
Definition: glext.h:7161
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
const GLint * first
Definition: glext.h:5794
GLuint64EXT * result
Definition: glext.h:11304
GLfloat GLfloat p
Definition: glext.h:8902
GLuint GLsizei const GLvoid GLenum preserve
Definition: glext.h:9550
GLuint GLuint num
Definition: glext.h:9618
GLenum GLsizei len
Definition: glext.h:6722
GLenum GLenum GLenum input
Definition: glext.h:9031
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean flag
Definition: glfuncs.h:52
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
BOOL NTAPI GlobalUnlock(HGLOBAL hMem)
Definition: heapmem.c:1190
static int prefixes
Definition: i386-dis.c:276
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
const char * filename
Definition: ioapi.h:137
voidpf uLong int origin
Definition: ioapi.h:144
static ERESOURCE GlobalLock
Definition: sys_arch.c:8
uint32_t entry
Definition: isohybrid.c:63
#define b
Definition: ke_i.h:79
#define debugstr_w
Definition: kernel32.h:32
#define wine_dbgstr_w
Definition: kernel32.h:34
#define GUID_NULL
Definition: ks.h:106
LPSTR WINAPI lstrcpyA(LPSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:100
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:274
int WINAPI lstrlenA(LPCSTR lpString)
Definition: lstring.c:145
const WCHAR * schema
#define win_skip
Definition: minitest.h:67
#define todo_wine_if(is_todo)
Definition: minitest.h:81
#define todo_wine
Definition: minitest.h:80
#define error(str)
Definition: mkdosfs.c:1605
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define CREATE_ALWAYS
Definition: disk.h:72
static PVOID ptr
Definition: dispmode.c:27
static struct test_info tests[]
#define sprintf
Definition: sprintf.c:45
#define comment(fmt, arg1)
Definition: rebar.c:847
const IID IID_IObjectWithSite
static const WCHAR url[]
Definition: encode.c:1384
BOOL expected
Definition: store.c:2000
const char * var
Definition: shader.c:5666
static IActiveScriptSite * site
Definition: script.c:149
static size_t elem
Definition: string.c:71
static void get_str_for_type(DOMNodeType type, char *buf)
Definition: domdoc.c:1268
static const IID * qi_list[32]
Definition: domdoc.c:14018
static void test_put_data(void)
Definition: domdoc.c:12879
static HRESULT WINAPI istream_Commit(IStream *iface, DWORD flags)
Definition: domdoc.c:318
static void test_xmlns_attribute(void)
Definition: domdoc.c:12508
static void test_get_xml(void)
Definition: domdoc.c:9235
static void test_put_nodeValue(void)
Definition: domdoc.c:7414
static int g_expectedcall
Definition: domdoc.c:71
#define create_cache(iid)
Definition: domdoc.c:1218
static const char namespacesA[]
Definition: domdoc.c:12558
static HRESULT WINAPI response_AppendToLog(IResponse *iface, BSTR bstrLogEntry)
Definition: domdoc.c:504
static VARIANT _variantbstr_(const char *str)
Definition: domdoc.c:1247
static const char nocontent[]
Definition: domdoc.c:812
static const CHAR szTypeValueXML[]
Definition: domdoc.c:912
static BSTR _bstr_(const char *str)
Definition: domdoc.c:1232
static HRESULT WINAPI response_get_CacheControl(IResponse *iface, BSTR *pbstrCacheControl)
Definition: domdoc.c:594
#define check_set_props(doc)
Definition: domdoc.c:8164
static HRESULT WINAPI response_get_Status(IResponse *iface, BSTR *pbstrStatusRet)
Definition: domdoc.c:480
static void test_getQualifiedItem(void)
Definition: domdoc.c:7976
static const CHAR szTransformXML[]
Definition: domdoc.c:884
static IResponse testresponse
Definition: domdoc.c:672
static void test_whitespace(void)
Definition: domdoc.c:4800
static const char win936xml[]
Definition: domdoc.c:797
static HRESULT WINAPI sp_QueryService(IServiceProvider *iface, REFGUID service, REFIID iid, void **ppv)
Definition: domdoc.c:14075
static const char szExampleXML[]
Definition: domdoc.c:814
static void test_get_lastChild(void)
Definition: domdoc.c:3815
static void test_get_prefix(void)
Definition: domdoc.c:8603
static void test_get_childNodes(void)
Definition: domdoc.c:3583
static HRESULT WINAPI response_get_CharSet(IResponse *iface, BSTR *pbstrCharSetRet)
Definition: domdoc.c:576
static const ns_item_t qualified_item_tests[]
Definition: domdoc.c:7956
static const CHAR szEmailXML_15[]
Definition: domdoc.c:1087
static int g_unexpectedcall
Definition: domdoc.c:71
#define XML_E_UNEXPECTED_ATTRIBUTE
Definition: domdoc.c:48
static HRESULT WINAPI istream_Seek(IStream *iface, LARGE_INTEGER move, DWORD origin, ULARGE_INTEGER *new_pos)
Definition: domdoc.c:299
static void test_get_doctype(void)
Definition: domdoc.c:10015
#define expect_node(node, expstr)
Definition: domdoc.c:1395
static void test_appendChild(void)
Definition: domdoc.c:9970
static void test_removeNamedItem(void)
Definition: domdoc.c:4065
static BSTR alloced_bstrs[256]
Definition: domdoc.c:1229
static ULONG WINAPI sp_AddRef(IServiceProvider *iface)
Definition: domdoc.c:14065
static void test_getAttribute(void)
Definition: domdoc.c:12226
static const CHAR szEmailXML_0D[]
Definition: domdoc.c:1014
static const node_value_t nodevalue_test[]
Definition: domdoc.c:12452
#define helper_expect_list_and_release(list, expstr)
Definition: domdoc.c:4652
static HRESULT WINAPI istream_CopyTo(IStream *iface, IStream *stream, ULARGE_INTEGER len, ULARGE_INTEGER *pread, ULARGE_INTEGER *written)
Definition: domdoc.c:311
static void test_get_dataType(void)
Definition: domdoc.c:10114
static const IResponseVtbl testresponsevtbl
Definition: domdoc.c:630
static void test_save(void)
Definition: domdoc.c:6597
static void _test_IObjectSafety_set(unsigned line, IObjectSafety *safety, HRESULT result, HRESULT result2, DWORD set, DWORD mask, DWORD expected, DWORD expected2)
Definition: domdoc.c:4195
static const property_test_t properties_test_data[]
Definition: domdoc.c:7535
static HRESULT WINAPI response_Clear(IResponse *iface)
Definition: domdoc.c:534
static ULONG WINAPI istream_Release(IStream *iface)
Definition: domdoc.c:282
static HRESULT WINAPI response_put_Status(IResponse *iface, BSTR bstrStatus)
Definition: domdoc.c:486
static void test_get_namespaces(void)
Definition: domdoc.c:12582
static const CHAR szNodeTypesXML[]
Definition: domdoc.c:860
static const char * leading_spaces_xmldata[]
Definition: domdoc.c:1419
static dispevent * impl_from_IDispatch(IDispatch *iface)
Definition: domdoc.c:161
struct _namespace_as_attribute_t namespace_as_attribute_t
static const IServiceProviderVtbl sp_vtbl
Definition: domdoc.c:14094
static const refcount_test_t refcount_test[]
Definition: domdoc.c:2633
static void write_to_file(const char *name, const char *data)
Definition: domdoc.c:10854
static HRESULT WINAPI response_put_CodePage(IResponse *iface, LONG codepage)
Definition: domdoc.c:612
static void test_get_ownerDocument(void)
Definition: domdoc.c:8234
static void test_setAttributeNode(void)
Definition: domdoc.c:8369
static void test_refs(void)
Definition: domdoc.c:2645
static const struct namespaces_change_t namespaces_change_test_data[]
Definition: domdoc.c:6819
static HRESULT WINAPI sp_QueryInterface(IServiceProvider *iface, REFIID iid, void **ppv)
Definition: domdoc.c:14047
#define helper_ole_check_ver(expr)
Definition: domdoc.c:4647
static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOOL supported)
Definition: domdoc.c:57
#define EXPECT_CHILDREN(node)
Definition: domdoc.c:674
static const xslpattern_test_t xslpattern_test_no_ns[]
Definition: domdoc.c:7645
static HRESULT WINAPI dispevent_GetTypeInfo(IDispatch *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
Definition: domdoc.c:207
static DWORD WINAPI new_thread(void *arg)
Definition: domdoc.c:14336
#define create_document_version(v, iid)
Definition: domdoc.c:1217
static void test_validate_on_parse_values(void)
Definition: domdoc.c:14170
static ULONG WINAPI sp_Release(IServiceProvider *iface)
Definition: domdoc.c:14070
static char * list_to_string(IXMLDOMNodeList *list)
Definition: domdoc.c:1365
static void get_class_support_data(struct msxmlsupported_data_t *table)
Definition: domdoc.c:116
static void test_get_text(void)
Definition: domdoc.c:3491
static const char win1252decl[]
Definition: domdoc.c:808
static void _expect_parse_error(IXMLDOMDocument *doc, HRESULT hr_exp, BOOL hr_todo, int line)
Definition: domdoc.c:720
static HRESULT WINAPI response_IsClientConnected(IResponse *iface, VARIANT_BOOL *pfIsClientConnected)
Definition: domdoc.c:570
static const CHAR szTransformSSXML[]
Definition: domdoc.c:890
static void node_to_string(IXMLDOMNode *node, char *buf)
Definition: domdoc.c:1314
static void test_domobj_dispex(IUnknown *obj)
Definition: domdoc.c:11174
static int get_node_position(IXMLDOMNode *node)
Definition: domdoc.c:1295
static void test_nodeValue(void)
Definition: domdoc.c:12464
static const CHAR szEmailXML_11[]
Definition: domdoc.c:1045
static BSTR alloc_str_from_narrow(const char *str)
Definition: domdoc.c:1221
static void test_selectSingleNode(void)
Definition: domdoc.c:8716
#define DECL_GBK
Definition: domdoc.c:780
static void test_put_dataType(void)
Definition: domdoc.c:6505
#define set_props(doc, cache)
Definition: domdoc.c:8192
static const CHAR szEmailXML_20[]
Definition: domdoc.c:1148
static void test_transformNodeToObject(void)
Definition: domdoc.c:13648
static const namespace_as_attribute_t namespace_as_attribute_test_data[]
Definition: domdoc.c:13831
static const ns_item_t named_item_tests[]
Definition: domdoc.c:7967
static void test_mxnamespacemanager(void)
Definition: domdoc.c:11226
static HRESULT WINAPI dispevent_Invoke(IDispatch *iface, DISPID member, REFIID riid, LCID lcid, WORD flags, DISPPARAMS *params, VARIANT *result, EXCEPINFO *excepInfo, UINT *argErr)
Definition: domdoc.c:221
static void test_get_attributes(void)
Definition: domdoc.c:10226
static void test_testTransforms(void)
Definition: domdoc.c:6775
static const validate_on_parse_test_t validate_on_parse_tests[]
Definition: domdoc.c:14159
#define helper_expect_bstr_and_release(bstr, str)
Definition: domdoc.c:4658
static void test_create(void)
Definition: domdoc.c:2943
static HRESULT WINAPI response_WriteBlock(IResponse *iface, short iBlockNumber)
Definition: domdoc.c:564
static struct msxmlsupported_data_t domdoc_support_data[]
Definition: domdoc.c:81
static void test_domdoc(void)
Definition: domdoc.c:1430
static void test_max_element_depth_values(void)
Definition: domdoc.c:13790
static void test_domnode(void)
Definition: domdoc.c:2213
static void test_nodeTypedValue(void)
Definition: domdoc.c:7081
static const char xsltext_xsl[]
Definition: domdoc.c:13367
#define EXPECT_REF(node, ref)
Definition: domdoc.c:698
static HRESULT WINAPI response_GetTypeInfo(IResponse *iface, UINT ti, LCID lcid, ITypeInfo **tinfo)
Definition: domdoc.c:406
static HRESULT WINAPI response_get_Buffer(IResponse *iface, VARIANT_BOOL *fIsBuffering)
Definition: domdoc.c:426
static void _set_props(int line, IXMLDOMDocument2 *doc, IXMLDOMSchemaCollection *cache)
Definition: domdoc.c:8193
static void test_get_firstChild(void)
Definition: domdoc.c:3786
static HRESULT WINAPI response_get_CodePage(IResponse *iface, LONG *plvar)
Definition: domdoc.c:606
static void _expect_ref(IUnknown *obj, ULONG ref, int line)
Definition: domdoc.c:699
static void test_getAttributeNode(void)
Definition: domdoc.c:12173
static struct attrtest_t attrtests[]
Definition: domdoc.c:13444
static const struct whitespace_t whitespace_test_data[]
Definition: domdoc.c:4790
static void _unset_props(int line, IXMLDOMDocument2 *doc)
Definition: domdoc.c:8216
static put_datatype_t put_datatype_data[]
Definition: domdoc.c:6464
static void test_normalize_attribute_values(void)
Definition: domdoc.c:13752
static void test_namespaces_change(void)
Definition: domdoc.c:6829
static HRESULT WINAPI response_Write(IResponse *iface, VARIANT varText)
Definition: domdoc.c:558
static const char charrefsxml[]
Definition: domdoc.c:853
static HRESULT WINAPI response_put_ContentType(IResponse *iface, BSTR bstrContentType)
Definition: domdoc.c:444
static void test_getElementsByTagName(void)
Definition: domdoc.c:3405
static int alloced_bstrs_count
Definition: domdoc.c:1230
static HRESULT WINAPI response_QI(IResponse *iface, REFIID riid, void **obj)
Definition: domdoc.c:375
static const CHAR szEmailXML[]
Definition: domdoc.c:999
static ULONG WINAPI transformdest_Release(IUnknown *iface)
Definition: domdoc.c:13636
static void test_IObjectSafety(void)
Definition: domdoc.c:7502
static void test_namespaces_as_attributes(void)
Definition: domdoc.c:13840
static HRESULT WINAPI response_get_LCID(IResponse *iface, LONG *lcid)
Definition: domdoc.c:618
static ULONG WINAPI dispevent_AddRef(IDispatch *iface)
Definition: domdoc.c:183
struct _validate_on_parse_test_t validate_on_parse_test_t
static HRESULT WINAPI response_put_Buffer(IResponse *iface, VARIANT_BOOL fIsBuffering)
Definition: domdoc.c:432
static const CHAR szEmailXML_18[]
Definition: domdoc.c:1132
static void _check_ws_ignored(int line, const char *ver, IXMLDOMDocument2 *doc, char const *str)
Definition: domdoc.c:4665
static HRESULT WINAPI dispevent_QueryInterface(IDispatch *iface, REFIID riid, void **ppvObject)
Definition: domdoc.c:166
static void free_bstrs(void)
Definition: domdoc.c:1239
struct _property_test_t property_test_t
static const nodetypedvalue_t get_nodetypedvalue[]
Definition: domdoc.c:7030
static const DOMNodeType put_data_types[]
Definition: domdoc.c:12871
static void _test_doc_load_from_path(IXMLDOMDocument *doc, const char *path, HRESULT expected_hr, VARIANT_BOOL expected_ret, int line)
Definition: domdoc.c:10871
static HRESULT WINAPI response_AddHeader(IResponse *iface, BSTR bstrHeaderName, BSTR bstrHeaderValue)
Definition: domdoc.c:498
static void test_cloneNode(void)
Definition: domdoc.c:5378
static void test_insertBefore(void)
Definition: domdoc.c:9578
static const get_attributes_t get_attributes[]
Definition: domdoc.c:10215
static void test_supporterrorinfo(void)
Definition: domdoc.c:12293
static void test_newline_normalization(void)
Definition: domdoc.c:12985
static ULONG WINAPI transformdest_AddRef(IUnknown *iface)
Definition: domdoc.c:13631
static void test_persiststream(void)
Definition: domdoc.c:2157
static HRESULT WINAPI response_put_Expires(IResponse *iface, LONG lExpiresMinutes)
Definition: domdoc.c:456
#define DECL_WIN_936
Definition: domdoc.c:794
static HRESULT WINAPI response_Flush(IResponse *iface)
Definition: domdoc.c:546
#define EXPECT_LIST_LEN(list, len)
Definition: domdoc.c:707
static HRESULT WINAPI istream_LockRegion(IStream *iface, ULARGE_INTEGER offset, ULARGE_INTEGER len, DWORD locktype)
Definition: domdoc.c:330
static const char win1252xml[]
Definition: domdoc.c:804
static const CHAR szEmailXML_0E[]
Definition: domdoc.c:1030
static HRESULT WINAPI dispevent_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo)
Definition: domdoc.c:200
static HRESULT WINAPI istream_Revert(IStream *iface)
Definition: domdoc.c:324
static void _test_IObjectSafety_common(unsigned line, IObjectSafety *safety)
Definition: domdoc.c:4231
static void _expect_no_children(IXMLDOMNode *node, int line)
Definition: domdoc.c:687
static void test_preserve_charref(IXMLDOMDocument2 *doc, VARIANT_BOOL preserve)
Definition: domdoc.c:4741
static void test_parseerror(void)
Definition: domdoc.c:12137
static HRESULT WINAPI response_put_ExpiresAbsolute(IResponse *iface, DATE dtExpires)
Definition: domdoc.c:468
static const DOMNodeType nodetypes_test[]
Definition: domdoc.c:11720
static HRESULT WINAPI response_GetTypeInfoCount(IResponse *iface, UINT *count)
Definition: domdoc.c:400
#define unset_props(doc)
Definition: domdoc.c:8215
static void test_createNode(void)
Definition: domdoc.c:8515
static HRESULT WINAPI response_Invoke(IResponse *iface, DISPID dispid, REFIID riid, LCID lcid, WORD flags, DISPPARAMS *params, VARIANT *result, EXCEPINFO *ei, UINT *argerr)
Definition: domdoc.c:419
static void test_createProcessingInstruction(void)
Definition: domdoc.c:8849
static const WCHAR nonexistent_fileW[]
Definition: domdoc.c:1183
#define expect_eq(expr, value, type, format)
Definition: domdoc.c:1194
#define EXPECT_PARSE_ERROR(doc, hr_exp, hr_todo)
Definition: domdoc.c:719
static int qi_count
Definition: domdoc.c:14019
static IDispatch * create_dispevent(void)
Definition: domdoc.c:253
static void test_replaceChild(void)
Definition: domdoc.c:3953
static void test_url(void)
Definition: domdoc.c:13532
static const xslpattern_test_t xslpattern_test[]
Definition: domdoc.c:7581
static const WCHAR szComplete5[]
Definition: domdoc.c:767
static HRESULT WINAPI response_put_CharSet(IResponse *iface, BSTR bstrCharSet)
Definition: domdoc.c:582
#define expect_list_and_release(list, expstr)
Definition: domdoc.c:1396
static const xslpattern_test_t xslpattern_test_func[]
Definition: domdoc.c:7654
static void * _create_object(const GUID *clsid, const char *name, const IID *iid, int line)
Definition: domdoc.c:1203
static void test_xmlTypes(void)
Definition: domdoc.c:5526
static const CHAR szEmailXML_17[]
Definition: domdoc.c:1117
#define check_default_props(doc)
Definition: domdoc.c:8138
static HRESULT WINAPI dispevent_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
Definition: domdoc.c:214
static void _expect_children(IXMLDOMNode *node, int line)
Definition: domdoc.c:675
#define DECL_ISO8859_1
Definition: domdoc.c:787
static HRESULT WINAPI istream_SetSize(IStream *iface, ULARGE_INTEGER size)
Definition: domdoc.c:305
static ULONG WINAPI response_Release(IResponse *iface)
Definition: domdoc.c:395
static ULONG WINAPI dispevent_Release(IDispatch *iface)
Definition: domdoc.c:189
static void test_removeChild(void)
Definition: domdoc.c:3854
static HRESULT WINAPI response_Pics(IResponse *iface, BSTR bstrHeaderValue)
Definition: domdoc.c:588
static HRESULT WINAPI response_get_ContentType(IResponse *iface, BSTR *pbstrContentTypeRet)
Definition: domdoc.c:438
static void test_XPath(void)
Definition: domdoc.c:5019
static const WCHAR szStrangeChars[]
Definition: domdoc.c:1185
static ULONG WINAPI istream_AddRef(IStream *iface)
Definition: domdoc.c:277
static void test_xsltext(void)
Definition: domdoc.c:13400
static const node_type_t get_datatype[]
Definition: domdoc.c:10102
static const char omitxmldecl_xsl[]
Definition: domdoc.c:13380
static HRESULT WINAPI response_put_CacheControl(IResponse *iface, BSTR bstrCacheControl)
Definition: domdoc.c:600
static void test_putref_schemas(void)
Definition: domdoc.c:13125
struct _get_attributes_t get_attributes_t
static const CHAR szBasicTransformSSXMLPart1[]
Definition: domdoc.c:947
static BOOL qi_list_contains_service(REFIID service, REFIID iid)
Definition: domdoc.c:14034
static const char default_ns_doc[]
Definition: domdoc.c:1172
static const CHAR szEmailXML_14[]
Definition: domdoc.c:1074
static put_datatype_notype_t put_dt_notype[]
Definition: domdoc.c:6496
static HRESULT WINAPI response_get_ExpiresAbsolute(IResponse *iface, VARIANT *pvarExpiresRet)
Definition: domdoc.c:462
static void test_mxnamespacemanager_override(void)
Definition: domdoc.c:11614
#define TEST_DOC_LOAD_FROM_PATH(doc, path, expected_hr, expected_ret)
Definition: domdoc.c:10869
static void test_indent(void)
Definition: domdoc.c:14302
#define create_document(iid)
Definition: domdoc.c:1216
static void test_namedmap_newenum(void)
Definition: domdoc.c:13199
static HRESULT WINAPI response_GetIDsOfNames(IResponse *iface, REFIID riid, LPOLESTR *names, UINT cnames, LCID lcid, DISPID *rgDispId)
Definition: domdoc.c:412
static void test_xsltemplate(void)
Definition: domdoc.c:9351
static const char xpath_simple_list[]
Definition: domdoc.c:1163
static ULONG WINAPI response_AddRef(IResponse *iface)
Definition: domdoc.c:390
static void test_merging_text(void)
Definition: domdoc.c:13551
static void test_load(void)
Definition: domdoc.c:10937
static HRESULT WINAPI response_put_LCID(IResponse *iface, LONG lcid)
Definition: domdoc.c:624
#define test_IObjectSafety_set(p, r, r2, s, m, e, e2)
Definition: domdoc.c:4194
static HRESULT WINAPI response_Add(IResponse *iface, BSTR bstrHeaderValue, BSTR bstrHeaderName)
Definition: domdoc.c:492
#define check_ws_ignored(ver, doc, str)
Definition: domdoc.c:4664
#define SZ_EMAIL_DTD
Definition: domdoc.c:978
static void test_load_with_site(void)
Definition: domdoc.c:14104
static void test_default_properties(void)
Definition: domdoc.c:7544
static const CHAR szEmailXML_13[]
Definition: domdoc.c:1059
static const char xsd_schema1_uri[]
Definition: domdoc.c:12568
static HRESULT WINAPI istream_QueryInterface(IStream *iface, REFIID riid, void **ppvObject)
Definition: domdoc.c:264
struct _nodetypedvalue_t nodetypedvalue_t
#define EXPECT_NO_CHILDREN(node)
Definition: domdoc.c:686
static void test_create_attribute(void)
Definition: domdoc.c:13456
#define DECL_WIN_1252
Definition: domdoc.c:801
static const IStreamVtbl StreamVtbl
Definition: domdoc.c:356
static HRESULT WINAPI istream_Read(IStream *iface, void *ptr, ULONG len, ULONG *pread)
Definition: domdoc.c:287
static const selection_ns_t selection_ns_data[]
Definition: domdoc.c:4950
static HRESULT WINAPI response_get_Cookies(IResponse *iface, IRequestDictionary **ppCookies)
Definition: domdoc.c:474
static HRESULT WINAPI istream_Clone(IStream *iface, IStream **stream)
Definition: domdoc.c:350
static void test_get_nodeTypeString(void)
Definition: domdoc.c:10169
static void _check_default_props(int line, IXMLDOMDocument2 *doc)
Definition: domdoc.c:8139
static void test_IXMLDOMDocument2(void)
Definition: domdoc.c:4327
static void test_events(void)
Definition: domdoc.c:8780
static IStream savestream
Definition: domdoc.c:373
#define check_interface(a, b, c)
Definition: domdoc.c:56
static HRESULT WINAPI istream_Stat(IStream *iface, STATSTG *pstatstg, DWORD flag)
Definition: domdoc.c:344
static const get_node_typestring_t get_node_typestring[]
Definition: domdoc.c:10157
static void test_put_nodeTypedValue(void)
Definition: domdoc.c:9023
static void _expect_list_len(IXMLDOMNodeList *list, LONG len, int line)
Definition: domdoc.c:708
static BOOL qi_list_contains(REFIID iid)
Definition: domdoc.c:14021
static const supporterror_t supporterror_test[]
Definition: domdoc.c:12282
static HRESULT WINAPI istream_Write(IStream *iface, const void *ptr, ULONG len, ULONG *written)
Definition: domdoc.c:293
static void _check_set_props(int line, IXMLDOMDocument2 *doc)
Definition: domdoc.c:8165
static BOOL is_clsid_supported(const GUID *clsid, REFIID riid)
Definition: domdoc.c:137
static HRESULT WINAPI response_BinaryWrite(IResponse *iface, VARIANT input)
Definition: domdoc.c:510
static const struct leading_spaces_t leading_spaces_classdata[]
Definition: domdoc.c:1409
static const char attributes_map[]
Definition: domdoc.c:1178
static IServiceProvider sp
Definition: domdoc.c:14102
static const IUnknownVtbl transformdestvtbl
Definition: domdoc.c:13641
static const struct queryresult_t elementsbytagname[]
Definition: domdoc.c:3396
static void test_removeQualifiedItem(void)
Definition: domdoc.c:8077
static const CHAR szEmailXML_16[]
Definition: domdoc.c:1102
static const char get_prefix_doc[]
Definition: domdoc.c:8599
static void test_selection(void)
Definition: domdoc.c:10519
static const char iso8859_1_xml[]
Definition: domdoc.c:790
static void test_get_tagName(void)
Definition: domdoc.c:10059
static const char omitxmldecl_doc[]
Definition: domdoc.c:13393
static const char * strip_spaces(const char *str)
Definition: domdoc.c:7063
static void url_forward_slash(char *url)
Definition: domdoc.c:10925
static HRESULT WINAPI response_Redirect(IResponse *iface, BSTR bstrURL)
Definition: domdoc.c:552
static const char xsd_schema1_xml[]
Definition: domdoc.c:12569
static void test_FormattingXML(void)
Definition: domdoc.c:6987
static const char complete7[]
Definition: domdoc.c:771
static const CHAR szBasicTransformXML[]
Definition: domdoc.c:972
static void test_namespaces_basic(void)
Definition: domdoc.c:6894
static void _check_ws_preserved(int line, const char *ver, IXMLDOMDocument2 *doc, char const *str)
Definition: domdoc.c:4703
#define check_ws_preserved(ver, doc, str)
Definition: domdoc.c:4702
static void test_splitText(void)
Definition: domdoc.c:7832
struct _get_node_typestring_t get_node_typestring_t
static const WCHAR szComplete1[]
Definition: domdoc.c:749
#define create_xsltemplate(iid)
Definition: domdoc.c:1219
static HRESULT WINAPI istream_UnlockRegion(IStream *iface, ULARGE_INTEGER offset, ULARGE_INTEGER len, DWORD locktype)
Definition: domdoc.c:337
#define expect_bstr_eq_and_free(bstr, expect)
Definition: domdoc.c:1187
static HRESULT WINAPI response_get_Expires(IResponse *iface, VARIANT *pvarExpiresMinutesRet)
Definition: domdoc.c:450
static BOOL compareIgnoreReturns(BSTR sLeft, BSTR sRight)
Definition: domdoc.c:1255
static HRESULT WINAPI transformdest_QueryInterface(IUnknown *iface, REFIID riid, void **obj)
Definition: domdoc.c:13616
static void test_dispex(void)
Definition: domdoc.c:11733
static const CHAR szBasicTransformSSXMLPart2[]
Definition: domdoc.c:955
static const CHAR szTransformOutput[]
Definition: domdoc.c:907
static const char gbkxml[]
Definition: domdoc.c:783
static const char * debugstr_msxml_guid(REFIID riid)
Definition: domdoc.c:95
static const xpath_test_t xpath_test[]
Definition: domdoc.c:4984
#define test_IObjectSafety_common(s)
Definition: domdoc.c:4230
static void test_XSLPattern(void)
Definition: domdoc.c:7680
static const char complete4A[]
Definition: domdoc.c:750
static const CHAR szBasicTransformOutput[]
Definition: domdoc.c:975
static HRESULT WINAPI response_End(IResponse *iface)
Definition: domdoc.c:540
static void test_TransformWithLoadingLocalFile(void)
Definition: domdoc.c:7327
static const IDispatchVtbl dispeventVtbl
Definition: domdoc.c:242
#define XML_E_INVALIDATROOTLEVEL
Definition: xmldoc.c:33
static char * dest
Definition: rtl.c:135
static LPOLESTR
Definition: stg_prop.c:27
static ICollection collection
Definition: typelib.c:184
static refpint_t pi[]
Definition: server.c:112
static VARIANTARG static DISPID
Definition: ordinal.c:49
static const WCHAR url2[]
Definition: misc.c:302
static DWORD unk1
Definition: cursoricon.c:1638
static HWND child
Definition: cursoricon.c:298
ssize_t pread(int fd, void *buf, size_t count, off_t offset)
static const WCHAR path2[]
Definition: path.c:29
const CLSID * clsid
Definition: msctf.cpp:50
#define DISPID_XMLDOM_NODELIST_RESET
Definition: msxml2did.h:153
#define DISPID_DOM_COLLECTION_BASE
Definition: msxml2did.h:70
#define DISPID_DOM_NODELIST_LENGTH
Definition: msxml2did.h:150
const struct _GUID CLSID_DOMDocument
const struct _GUID CLSID_XMLHTTPRequest
unsigned int UINT
Definition: ndis.h:50
_In_ LPWSTR _In_ DWORD _In_ LPCVOID pvData
Definition: netsh.h:116
#define GENERIC_WRITE
Definition: nt_native.h:90
#define LOCALE_SYSTEM_DEFAULT
#define SORT_DEFAULT
#define MAKELCID(lgid, srtid)
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:238
UINT WINAPI SysStringLen(BSTR str)
Definition: oleaut.c:196
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271
BSTR WINAPI DECLSPEC_HOTPATCH SysAllocStringByteLen(LPCSTR str, UINT len)
Definition: oleaut.c:428
BSTR WINAPI SysAllocStringLen(const OLECHAR *str, unsigned int len)
Definition: oleaut.c:339
#define V_BOOL(A)
Definition: oleauto.h:224
#define V_ARRAY(A)
Definition: oleauto.h:222
#define V_BSTRREF(A)
Definition: oleauto.h:227
#define V_UNKNOWN(A)
Definition: oleauto.h:281
#define VARIANT_NOUSEROVERRIDE
Definition: oleauto.h:312
#define V_I1(A)
Definition: oleauto.h:243
#define DISPATCH_METHOD
Definition: oleauto.h:1006
#define V_VT(A)
Definition: oleauto.h:211
#define V_BSTR(A)
Definition: oleauto.h:226
#define V_I4(A)
Definition: oleauto.h:247
#define V_R4(A)
Definition: oleauto.h:260
#define V_UI4(A)
Definition: oleauto.h:270
#define V_DISPATCH(A)
Definition: oleauto.h:239
#define DISPATCH_PROPERTYGET
Definition: oleauto.h:1007
#define V_I2(A)
Definition: oleauto.h:245
const GUID IID_IConnectionPointContainer
const GUID IID_IPropertyNotifySink
const GUID IID_IOleClientSite
const GUID IID_IDispatch
const GUID IID_IPersistStreamInit
long LONG
Definition: pedump.c:60
const GUID IID_IPersist
Definition: proxy.cpp:14
const GUID IID_IPersistStream
Definition: proxy.cpp:13
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)
Definition: guiddef.h:68
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REFIID
Definition: guiddef.h:118
#define IID_NULL
Definition: guiddef.h:98
#define IsEqualCLSID(rclsid1, rclsid2)
Definition: guiddef.h:96
static unsigned __int64 next
Definition: rand_nt.c:6
#define err(...)
IStream *WINAPI SHCreateMemStream(const BYTE *lpbData, UINT dwDataLen)
Definition: regstream.c:652
#define list
Definition: rosglue.h:35
#define test
Definition: rosglue.h:37
const WCHAR * str
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
#define MAKELANGID(p, s)
Definition: nls.h:15
#define LANG_ENGLISH
Definition: nls.h:52
#define SUBLANG_DEFAULT
Definition: nls.h:168
DWORD LCID
Definition: nls.h:13
#define error2(s, a, b)
Definition: debug.h:126
strcat
Definition: string.h:92
strcpy
Definition: string.h:131
const char int int int static __inline const char * wine_dbgstr_a(const char *s)
Definition: debug.h:187
static __inline const char * wine_dbgstr_guid(const GUID *id)
Definition: debug.h:197
#define is_reactos()
Definition: test.h:1041
#define memset(x, y, z)
Definition: compat.h:39
#define _WIN32_WINNT_VISTA
Definition: sdkddkver.h:25
HRESULT hr
Definition: shlfolder.c:183
Definition: scsiwmi.h:51
DOMNodeType type
Definition: domdoc.c:10211
const char * string
Definition: domdoc.c:10154
DOMNodeType type
Definition: domdoc.c:10153
const char * value
Definition: domdoc.c:7026
const char * name
Definition: domdoc.c:7024
VARTYPE type
Definition: domdoc.c:7025
const GUID * guid
Definition: domdoc.c:7529
const char * value
Definition: domdoc.c:7532
const char * clsid
Definition: domdoc.c:7530
const char * property
Definition: domdoc.c:7531
Definition: cookie.c:202
const char * href
Definition: domdoc.c:13441
const char * uri
Definition: domdoc.c:13439
const char * name
Definition: domdoc.c:13438
const char * prefix
Definition: domdoc.c:13440
Definition: cache.c:49
Definition: inflate.c:139
LONG ref
Definition: domdoc.c:158
IDispatch IDispatch_iface
Definition: domdoc.c:157
HRESULT hr
Definition: domdoc.c:1400
VARIANT_BOOL b
Definition: domdoc.c:1399
Definition: fci.c:127
const CLSID * clsid
Definition: domdoc.c:1404
struct docload_ret_t ret[2]
Definition: domdoc.c:1406
const char * name
Definition: domdoc.c:1405
Definition: parser.c:49
BOOL supported[3]
Definition: domdoc.c:78
const IID * ifaces[3]
Definition: domdoc.c:77
const char * name
Definition: domdoc.c:76
const GUID * clsid
Definition: domdoc.c:75
Definition: name.c:39
const CLSID * clsid
Definition: domdoc.c:6815
const char * name
Definition: domdoc.c:6816
HRESULT hr
Definition: domdoc.c:10099
DOMNodeType type
Definition: domdoc.c:10096
VARTYPE vt
Definition: domdoc.c:10098
const char * name
Definition: domdoc.c:10097
HRESULT get_hr
Definition: domdoc.c:12449
const char * put_content
Definition: domdoc.c:12446
const char * name
Definition: domdoc.c:12445
HRESULT put_hr
Definition: domdoc.c:12447
VARTYPE get_vt
Definition: domdoc.c:12448
DOMNodeType type
Definition: domdoc.c:12444
const char * uri
Definition: domdoc.c:7951
const char * name
Definition: domdoc.c:7950
HRESULT hr
Definition: domdoc.c:7952
DOMNodeType type
Definition: domdoc.c:6492
const char * name
Definition: domdoc.c:6457
HRESULT hr
Definition: domdoc.c:6459
const char * type
Definition: domdoc.c:6458
const char * result
Definition: domdoc.c:3392
const char * query
Definition: domdoc.c:3391
Definition: send.c:48
DOMNodeType type
Definition: domdoc.c:2629
REFIID iid
Definition: domdoc.c:2630
HRESULT hr
Definition: domdoc.c:4946
const char * name
Definition: domdoc.c:4944
const GUID * clsid
Definition: domdoc.c:4943
const char * ns
Definition: domdoc.c:4945
Definition: parse.h:23
DOMNodeType type
Definition: domdoc.c:12277
const char * name
Definition: domdoc.c:12278
const WCHAR * name
Definition: ecma_167.h:138
const CLSID * clsid
Definition: domdoc.c:4786
const char * name
Definition: domdoc.c:4787
const char * list
Definition: domdoc.c:4981
const char * query
Definition: domdoc.c:4980
const char * query
Definition: domdoc.c:7576
const char * list
Definition: domdoc.c:7577
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
Character const *const prefix
Definition: tempnam.cpp:195
int32_t INT
Definition: typedefs.h:58
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
LONGLONG QuadPart
Definition: typedefs.h:114
Definition: dlist.c:348
Definition: pdh_main.c:96
HRESULT WINAPI VariantChangeTypeEx(VARIANTARG *pvargDest, VARIANTARG *pvargSrc, LCID lcid, USHORT wFlags, VARTYPE vt)
Definition: variant.c:988
HRESULT WINAPI DECLSPEC_HOTPATCH VariantChangeType(VARIANTARG *pvargDest, VARIANTARG *pvargSrc, USHORT wFlags, VARTYPE vt)
Definition: variant.c:962
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:648
void WINAPI VariantInit(VARIANTARG *pVarg)
Definition: variant.c:568
static const WCHAR props[]
Definition: wbemdisp.c:288
int codepage
Definition: win_iconv.c:156
#define success(from, fromstr, to, tostr)
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
WINBASEAPI _In_ DWORD nLength
Definition: wincon.h:682
_In_ ULONG _In_ ULONG_PTR ident
Definition: winddi.h:3994
void * arg
Definition: msvc.h:10
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:3451
#define E_NOINTERFACE
Definition: winerror.h:3479
#define DISP_E_BADPARAMCOUNT
Definition: winerror.h:3626
#define DISP_E_MEMBERNOTFOUND
Definition: winerror.h:3615
#define E_POINTER
Definition: winerror.h:3480
#define DISP_E_TYPEMISMATCH
Definition: winerror.h:3617
#define DISP_E_UNKNOWNNAME
Definition: winerror.h:3618
int WINAPIV wsprintfA(_Out_ LPSTR, _In_ _Printf_format_string_ LPCSTR,...)
enum tagDOMNodeType DOMNodeType
@ NODE_ENTITY_REFERENCE
Definition: xmldom.idl:57
@ NODE_TEXT
Definition: xmldom.idl:55
@ NODE_PROCESSING_INSTRUCTION
Definition: xmldom.idl:59
@ NODE_DOCUMENT_TYPE
Definition: xmldom.idl:62
@ NODE_ENTITY
Definition: xmldom.idl:58
@ NODE_ATTRIBUTE
Definition: xmldom.idl:54
@ NODE_DOCUMENT
Definition: xmldom.idl:61
@ NODE_DOCUMENT_FRAGMENT
Definition: xmldom.idl:63
@ NODE_COMMENT
Definition: xmldom.idl:60
@ NODE_ELEMENT
Definition: xmldom.idl:53
@ NODE_CDATA_SECTION
Definition: xmldom.idl:56
@ NODE_NOTATION
Definition: xmldom.idl:64
__wchar_t WCHAR
Definition: xmlstorage.h:180
char CHAR
Definition: xmlstorage.h:175
unsigned char BYTE
Definition: xxhash.c:193