ReactOS 0.4.16-dev-2206-gc56950d
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 IXMLDOMNode_Release( removed_node );
4171
4172 removed_node = NULL;
4173 hr = IXMLDOMNamedNodeMap_removeNamedItem( map, _bstr_("xml:lang"), &removed_node );
4174 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4175 IXMLDOMNode_Release( removed_node );
4176
4177 len = -1;
4178 hr = IXMLDOMNamedNodeMap_get_length( map, &len );
4179 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4180 ok( len == 2, "length %ld\n", len );
4181
4182 IXMLDOMNamedNodeMap_Release( map );
4183 IXMLDOMElement_Release( element );
4184 IXMLDOMDocument_Release( doc );
4185 free_bstrs();
4186}
4187
4188#define test_IObjectSafety_set(p, r, r2, s, m, e, e2) _test_IObjectSafety_set(__LINE__,p, r, r2, s, m, e, e2)
4191 DWORD expected2)
4192{
4193 DWORD enabled, supported;
4194 HRESULT hr;
4195
4196 hr = IObjectSafety_SetInterfaceSafetyOptions(safety, NULL, set, mask);
4197 if (result == result2)
4198 ok_(__FILE__,line)(hr == result, "SetInterfaceSafetyOptions: expected %#lx, returned %#lx\n", result, hr );
4199 else
4200 ok_(__FILE__,line)(broken(hr == result) || hr == result2,
4201 "SetInterfaceSafetyOptions: expected %#lx, got %#lx\n", result2, hr );
4202
4203 supported = enabled = 0xCAFECAFE;
4204 hr = IObjectSafety_GetInterfaceSafetyOptions(safety, NULL, &supported, &enabled);
4205 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
4206 if (expected == expected2)
4207 ok_(__FILE__,line)(enabled == expected, "Expected %#lx, got %#lx\n", expected, enabled);
4208 else
4209 ok_(__FILE__,line)(broken(enabled == expected) || enabled == expected2,
4210 "Expected %#lx, got %#lx\n", expected2, enabled);
4211
4212 /* reset the safety options */
4213
4214 hr = IObjectSafety_SetInterfaceSafetyOptions(safety, NULL,
4215 INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_SECURITY_MANAGER,
4216 0);
4217 ok_(__FILE__,line)(hr == S_OK, "Unexpected hr %#lx.\n", hr );
4218
4219 hr = IObjectSafety_GetInterfaceSafetyOptions(safety, NULL, &supported, &enabled);
4220 ok_(__FILE__,line)(hr == S_OK, "Unexpected hr %#lx.\n", hr );
4221 ok_(__FILE__,line)(enabled == 0, "Expected 0, got %#lx\n", enabled);
4222}
4223
4224#define test_IObjectSafety_common(s) _test_IObjectSafety_common(__LINE__,s)
4225static void _test_IObjectSafety_common(unsigned line, IObjectSafety *safety)
4226{
4227 DWORD enabled = 0, supported = 0;
4228 HRESULT hr;
4229
4230 /* get */
4231 hr = IObjectSafety_GetInterfaceSafetyOptions(safety, NULL, NULL, &enabled);
4232 ok_(__FILE__,line)(hr == E_POINTER, "Unexpected hr %#lx.\n", hr );
4233 hr = IObjectSafety_GetInterfaceSafetyOptions(safety, NULL, &supported, NULL);
4234 ok_(__FILE__,line)(hr == E_POINTER, "Unexpected hr %#lx.\n", hr );
4235
4236 hr = IObjectSafety_GetInterfaceSafetyOptions(safety, NULL, &supported, &enabled);
4237 ok_(__FILE__,line)(hr == S_OK, "Unexpected hr %#lx.\n", hr );
4238 ok_(__FILE__,line)(broken(supported == (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA)) ||
4239 supported == (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACE_USES_SECURITY_MANAGER) /* msxml3 SP8+ */,
4240 "Expected (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACE_USES_SECURITY_MANAGER), "
4241 "got %#lx\n", supported);
4242 ok_(__FILE__,line)(enabled == 0, "Expected 0, got %#lx\n", enabled);
4243
4244 /* set -- individual flags */
4245
4247 INTERFACESAFE_FOR_UNTRUSTED_CALLER, INTERFACESAFE_FOR_UNTRUSTED_CALLER,
4248 INTERFACESAFE_FOR_UNTRUSTED_CALLER, INTERFACESAFE_FOR_UNTRUSTED_CALLER);
4249
4251 INTERFACESAFE_FOR_UNTRUSTED_DATA, INTERFACESAFE_FOR_UNTRUSTED_DATA,
4252 INTERFACESAFE_FOR_UNTRUSTED_DATA, INTERFACESAFE_FOR_UNTRUSTED_DATA);
4253
4255 INTERFACE_USES_SECURITY_MANAGER, INTERFACE_USES_SECURITY_MANAGER,
4256 0, INTERFACE_USES_SECURITY_MANAGER /* msxml3 SP8+ */);
4257
4258 /* set INTERFACE_USES_DISPEX */
4259
4260 test_IObjectSafety_set(safety, S_OK, E_FAIL /* msxml3 SP8+ */,
4261 INTERFACE_USES_DISPEX, INTERFACE_USES_DISPEX,
4262 0, 0);
4263
4264 test_IObjectSafety_set(safety, S_OK, E_FAIL /* msxml3 SP8+ */,
4265 INTERFACE_USES_DISPEX, 0,
4266 0, 0);
4267
4268 test_IObjectSafety_set(safety, S_OK, S_OK /* msxml3 SP8+ */,
4269 0, INTERFACE_USES_DISPEX,
4270 0, 0);
4271
4272 /* set option masking */
4273
4275 INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA,
4276 INTERFACESAFE_FOR_UNTRUSTED_CALLER,
4277 INTERFACESAFE_FOR_UNTRUSTED_CALLER,
4278 INTERFACESAFE_FOR_UNTRUSTED_CALLER);
4279
4281 INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA,
4282 INTERFACESAFE_FOR_UNTRUSTED_DATA,
4283 INTERFACESAFE_FOR_UNTRUSTED_DATA,
4284 INTERFACESAFE_FOR_UNTRUSTED_DATA);
4285
4287 INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA,
4288 INTERFACE_USES_SECURITY_MANAGER,
4289 0,
4290 0);
4291
4292 /* set -- inheriting previous settings */
4293
4294 hr = IObjectSafety_SetInterfaceSafetyOptions(safety, NULL,
4295 INTERFACESAFE_FOR_UNTRUSTED_CALLER,
4296 INTERFACESAFE_FOR_UNTRUSTED_CALLER);
4297 ok_(__FILE__,line)(hr == S_OK, "Unexpected hr %#lx.\n", hr );
4298 hr = IObjectSafety_GetInterfaceSafetyOptions(safety, NULL, &supported, &enabled);
4299 ok_(__FILE__,line)(hr == S_OK, "Unexpected hr %#lx.\n", hr );
4300 ok_(__FILE__,line)(enabled == INTERFACESAFE_FOR_UNTRUSTED_CALLER, "Expected INTERFACESAFE_FOR_UNTRUSTED_CALLER got %#lx\n", enabled);
4301 ok_(__FILE__,line)(broken(supported == (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA)) ||
4302 supported == (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACE_USES_SECURITY_MANAGER) /* msxml3 SP8+ */,
4303 "Expected (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACE_USES_SECURITY_MANAGER), "
4304 "got %#lx.\n", supported);
4305
4306 hr = IObjectSafety_SetInterfaceSafetyOptions(safety, NULL,
4307 INTERFACESAFE_FOR_UNTRUSTED_DATA,
4308 INTERFACESAFE_FOR_UNTRUSTED_DATA);
4309 ok_(__FILE__,line)(hr == S_OK, "Unexpected hr %#lx.\n", hr );
4310 hr = IObjectSafety_GetInterfaceSafetyOptions(safety, NULL, &supported, &enabled);
4311 ok_(__FILE__,line)(hr == S_OK, "Unexpected hr %#lx.\n", hr );
4312 ok_(__FILE__,line)(broken(enabled == INTERFACESAFE_FOR_UNTRUSTED_DATA) ||
4313 enabled == (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA),
4314 "Expected (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA) got %#lx\n", enabled);
4315 ok_(__FILE__,line)(broken(supported == (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA)) ||
4316 supported == (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACE_USES_SECURITY_MANAGER) /* msxml3 SP8+ */,
4317 "Expected (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACE_USES_SECURITY_MANAGER), "
4318 "got %#lx\n", supported);
4319}
4320
4321static void test_IXMLDOMDocument2(void)
4322{
4323 IXMLDOMDocument2 *doc2, *dtddoc2;
4324 IXMLDOMDocument *doc;
4326 IDispatchEx *dispex;
4328 VARIANT var;
4329 HRESULT hr;
4330 LONG res;
4331
4332 if (!is_clsid_supported(&CLSID_DOMDocument2, &IID_IXMLDOMDocument2)) return;
4333
4334 doc = create_document(&IID_IXMLDOMDocument);
4335 dtddoc2 = create_document(&IID_IXMLDOMDocument2);
4336
4337 hr = IXMLDOMDocument_QueryInterface( doc, &IID_IXMLDOMDocument2, (void**)&doc2 );
4338 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4339 ok( doc == (IXMLDOMDocument*)doc2, "interfaces differ\n");
4340
4341 hr = IXMLDOMDocument2_get_readyState(doc2, NULL);
4342 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
4343 hr = IXMLDOMDocument2_get_readyState(doc2, &res);
4344 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4345 ok(res == READYSTATE_COMPLETE, "expected READYSTATE_COMPLETE (4), got %ld\n", res);
4346
4347 err = NULL;
4348 hr = IXMLDOMDocument2_validate(doc2, NULL);
4349 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
4350 hr = IXMLDOMDocument2_validate(doc2, &err);
4351 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
4352 ok(err != NULL, "expected a pointer\n");
4353 if (err)
4354 {
4355 res = 0;
4356 hr = IXMLDOMParseError_get_errorCode(err, &res);
4357 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4358 /* XML_E_NOTWF */
4359 ok(res == E_XML_NOTWF, "Unexpected code %#lx.\n", res);
4360 IXMLDOMParseError_Release(err);
4361 }
4362
4363 hr = IXMLDOMDocument2_loadXML( doc2, _bstr_(complete4A), &b );
4364 ok(hr == S_OK, "loadXML failed\n");
4365 ok( b == VARIANT_TRUE, "failed to load XML string\n");
4366
4367 hr = IXMLDOMDocument_get_readyState(doc, &res);
4368 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4369 ok(res == READYSTATE_COMPLETE, "expected READYSTATE_COMPLETE (4), got %ld\n", res);
4370
4371 err = NULL;
4372 hr = IXMLDOMDocument2_validate(doc2, &err);
4373 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
4374 ok(err != NULL, "expected a pointer\n");
4375 if (err)
4376 {
4377 res = 0;
4378 hr = IXMLDOMParseError_get_errorCode(err, &res);
4379 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4380 /* XML_E_NODTD */
4381 ok(res == E_XML_NODTD, "Unexpected code %#lx.\n", res);
4382 IXMLDOMParseError_Release(err);
4383 }
4384
4385 hr = IXMLDOMDocument_QueryInterface( doc, &IID_IDispatchEx, (void**)&dispex );
4386 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4387 if(hr == S_OK)
4388 IDispatchEx_Release(dispex);
4389
4390 /* we will check if the variant got cleared */
4391 IXMLDOMDocument2_AddRef(doc2);
4392 EXPECT_REF(doc2, 3); /* doc, doc2, AddRef*/
4393
4394 V_VT(&var) = VT_UNKNOWN;
4395 V_UNKNOWN(&var) = (IUnknown *)doc2;
4396
4397 /* invalid calls */
4398 hr = IXMLDOMDocument2_getProperty(doc2, _bstr_("askldhfaklsdf"), &var);
4399 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
4400 expect_eq(V_VT(&var), VT_UNKNOWN, int, "%x");
4401 hr = IXMLDOMDocument2_getProperty(doc2, _bstr_("SelectionLanguage"), NULL);
4402 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
4403
4404 /* valid call */
4405 hr = IXMLDOMDocument2_getProperty(doc2, _bstr_("SelectionLanguage"), &var);
4406 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4407 expect_eq(V_VT(&var), VT_BSTR, int, "%x");
4408 expect_bstr_eq_and_free(V_BSTR(&var), "XSLPattern");
4409 V_VT(&var) = VT_R4;
4410
4411 /* the variant didn't get cleared*/
4412 expect_eq(IXMLDOMDocument2_Release(doc2), 2, int, "%d");
4413
4414 /* setProperty tests */
4415 hr = IXMLDOMDocument2_setProperty(doc2, _bstr_("askldhfaklsdf"), var);
4416 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
4417 hr = IXMLDOMDocument2_setProperty(doc2, _bstr_("SelectionLanguage"), var);
4418 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
4419 hr = IXMLDOMDocument2_setProperty(doc2, _bstr_("SelectionLanguage"), _variantbstr_("alskjdh faklsjd hfk"));
4420 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
4421 hr = IXMLDOMDocument2_setProperty(doc2, _bstr_("SelectionLanguage"), _variantbstr_("XSLPattern"));
4422 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4423 hr = IXMLDOMDocument2_setProperty(doc2, _bstr_("SelectionLanguage"), _variantbstr_("XPath"));
4424 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4425 hr = IXMLDOMDocument2_setProperty(doc2, _bstr_("SelectionLanguage"), _variantbstr_("XSLPattern"));
4426 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4427
4428 V_VT(&var) = VT_BSTR;
4429 V_BSTR(&var) = SysAllocString(L"");
4430 hr = IXMLDOMDocument2_setProperty(doc2, _bstr_("SelectionNamespaces"), var);
4431 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4432 VariantClear(&var);
4433
4434 V_VT(&var) = VT_I2;
4435 V_I2(&var) = 0;
4436 hr = IXMLDOMDocument2_setProperty(doc2, _bstr_("SelectionNamespaces"), var);
4437 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
4438
4439 /* contrary to what MSDN claims you can switch back from XPath to XSLPattern */
4440 hr = IXMLDOMDocument2_getProperty(doc2, _bstr_("SelectionLanguage"), &var);
4441 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4442 expect_eq(V_VT(&var), VT_BSTR, int, "%x");
4443 expect_bstr_eq_and_free(V_BSTR(&var), "XSLPattern");
4444
4445 IXMLDOMDocument2_Release( doc2 );
4446 IXMLDOMDocument_Release( doc );
4447
4448 /* DTD validation */
4449 hr = IXMLDOMDocument2_put_validateOnParse(dtddoc2, VARIANT_FALSE);
4450 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4451 hr = IXMLDOMDocument2_loadXML(dtddoc2, _bstr_(szEmailXML), &b);
4452 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4453 ok( b == VARIANT_TRUE, "failed to load XML string\n");
4454 err = NULL;
4455 hr = IXMLDOMDocument2_validate(dtddoc2, &err);
4456 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4457 ok(err != NULL, "expected pointer\n");
4458 if (err)
4459 {
4460 res = 0;
4461 hr = IXMLDOMParseError_get_errorCode(err, &res);
4462 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
4463 ok(res == 0, "Unexpected code %#lx.\n", res);
4464 IXMLDOMParseError_Release(err);
4465 }
4466
4467 hr = IXMLDOMDocument2_loadXML(dtddoc2, _bstr_(szEmailXML_0D), &b);
4468 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4469 ok( b == VARIANT_TRUE, "failed to load XML string\n");
4470 err = NULL;
4471 hr = IXMLDOMDocument2_validate(dtddoc2, &err);
4472 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
4473 ok(err != NULL, "expected pointer\n");
4474 if (err)
4475 {
4476 res = 0;
4477 hr = IXMLDOMParseError_get_errorCode(err, &res);
4478 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4479 /* XML_ELEMENT_UNDECLARED */
4480 todo_wine ok(res == 0xC00CE00D, "Unexpected code %#lx.\n", res);
4481 IXMLDOMParseError_Release(err);
4482 }
4483
4484 hr = IXMLDOMDocument2_loadXML(dtddoc2, _bstr_(szEmailXML_0E), &b);
4485 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4486 ok( b == VARIANT_TRUE, "failed to load XML string\n");
4487 err = NULL;
4488 hr = IXMLDOMDocument2_validate(dtddoc2, &err);
4489 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
4490 ok(err != NULL, "expected pointer\n");
4491 if (err)
4492 {
4493 res = 0;
4494 hr = IXMLDOMParseError_get_errorCode(err, &res);
4495 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4496 /* XML_ELEMENT_ID_NOT_FOUND */
4497 todo_wine ok(res == 0xC00CE00E, "Unexpected code %#lx.\n", res);
4498 IXMLDOMParseError_Release(err);
4499 }
4500
4501 hr = IXMLDOMDocument2_loadXML(dtddoc2, _bstr_(szEmailXML_11), &b);
4502 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4503 ok( b == VARIANT_TRUE, "failed to load XML string\n");
4504 err = NULL;
4505 hr = IXMLDOMDocument2_validate(dtddoc2, &err);
4506 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
4507 ok(err != NULL, "expected pointer\n");
4508 if (err)
4509 {
4510 res = 0;
4511 hr = IXMLDOMParseError_get_errorCode(err, &res);
4512 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4513 /* XML_EMPTY_NOT_ALLOWED */
4514 todo_wine ok(res == 0xC00CE011, "Unexpected code %#lx.\n", res);
4515 IXMLDOMParseError_Release(err);
4516 }
4517
4518 hr = IXMLDOMDocument2_loadXML(dtddoc2, _bstr_(szEmailXML_13), &b);
4519 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4520 ok( b == VARIANT_TRUE, "failed to load XML string\n");
4521 err = NULL;
4522 hr = IXMLDOMDocument2_validate(dtddoc2, &err);
4523 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
4524 ok(err != NULL, "expected pointer\n");
4525 if (err)
4526 {
4527 res = 0;
4528 hr = IXMLDOMParseError_get_errorCode(err, &res);
4529 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4530 /* XML_ROOT_NAME_MISMATCH */
4531 todo_wine ok(res == 0xC00CE013, "Unexpected code %#lx.\n", res);
4532 IXMLDOMParseError_Release(err);
4533 }
4534
4535 hr = IXMLDOMDocument2_loadXML(dtddoc2, _bstr_(szEmailXML_14), &b);
4536 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4537 ok( b == VARIANT_TRUE, "failed to load XML string\n");
4538 err = NULL;
4539 hr = IXMLDOMDocument2_validate(dtddoc2, &err);
4540 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
4541 ok(err != NULL, "expected pointer\n");
4542 if (err)
4543 {
4544 res = 0;
4545 hr = IXMLDOMParseError_get_errorCode(err, &res);
4546 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4547 /* XML_INVALID_CONTENT */
4548 todo_wine ok(res == 0xC00CE014, "Unexpected code %#lx.\n", res);
4549 IXMLDOMParseError_Release(err);
4550 }
4551
4552 hr = IXMLDOMDocument2_loadXML(dtddoc2, _bstr_(szEmailXML_15), &b);
4553 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4554 ok( b == VARIANT_TRUE, "failed to load XML string\n");
4555 err = NULL;
4556 hr = IXMLDOMDocument2_validate(dtddoc2, &err);
4557 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
4558 ok(err != NULL, "expected pointer\n");
4559 if (err)
4560 {
4561 res = 0;
4562 hr = IXMLDOMParseError_get_errorCode(err, &res);
4563 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4564 /* XML_ATTRIBUTE_NOT_DEFINED */
4565 todo_wine ok(res == 0xC00CE015, "Unexpected code %#lx.\n", res);
4566 IXMLDOMParseError_Release(err);
4567 }
4568
4569 hr = IXMLDOMDocument2_loadXML(dtddoc2, _bstr_(szEmailXML_16), &b);
4570 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4571 ok( b == VARIANT_TRUE, "failed to load XML string\n");
4572 err = NULL;
4573 hr = IXMLDOMDocument2_validate(dtddoc2, &err);
4574 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
4575 ok(err != NULL, "expected pointer\n");
4576 if (err)
4577 {
4578 res = 0;
4579 hr = IXMLDOMParseError_get_errorCode(err, &res);
4580 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4581 /* XML_ATTRIBUTE_FIXED */
4582 todo_wine ok(res == 0xC00CE016, "Unexpected code %#lx.\n", res);
4583 IXMLDOMParseError_Release(err);
4584 }
4585
4586 hr = IXMLDOMDocument2_loadXML(dtddoc2, _bstr_(szEmailXML_17), &b);
4587 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4588 ok( b == VARIANT_TRUE, "failed to load XML string\n");
4589 err = NULL;
4590 hr = IXMLDOMDocument2_validate(dtddoc2, &err);
4591 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
4592 ok(err != NULL, "expected pointer\n");
4593 if (err)
4594 {
4595 res = 0;
4596 hr = IXMLDOMParseError_get_errorCode(err, &res);
4597 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4598 /* XML_ATTRIBUTE_VALUE */
4599 todo_wine ok(res == 0xC00CE017, "Unexpected code %#lx.\n", res);
4600 IXMLDOMParseError_Release(err);
4601 }
4602
4603 hr = IXMLDOMDocument2_loadXML(dtddoc2, _bstr_(szEmailXML_18), &b);
4604 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4605 ok( b == VARIANT_TRUE, "failed to load XML string\n");
4606 err = NULL;
4607 hr = IXMLDOMDocument2_validate(dtddoc2, &err);
4608 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
4609 ok(err != NULL, "expected pointer\n");
4610 if (err)
4611 {
4612 res = 0;
4613 hr = IXMLDOMParseError_get_errorCode(err, &res);
4614 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4615 /* XML_ILLEGAL_TEXT */
4616 todo_wine ok(res == 0xC00CE018, "Unexpected code %#lx.\n", res);
4617 IXMLDOMParseError_Release(err);
4618 }
4619
4620 hr = IXMLDOMDocument2_loadXML(dtddoc2, _bstr_(szEmailXML_20), &b);
4621 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4622 ok( b == VARIANT_TRUE, "failed to load XML string\n");
4623 err = NULL;
4624 hr = IXMLDOMDocument2_validate(dtddoc2, &err);
4625 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
4626 ok(err != NULL, "expected pointer\n");
4627 if (err)
4628 {
4629 res = 0;
4630 hr = IXMLDOMParseError_get_errorCode(err, &res);
4631 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4632 /* XML_REQUIRED_ATTRIBUTE_MISSING */
4633 todo_wine ok(res == 0xC00CE020, "Unexpected code %#lx.\n", res);
4634 IXMLDOMParseError_Release(err);
4635 }
4636
4637 IXMLDOMDocument2_Release( dtddoc2 );
4638 free_bstrs();
4639}
4640
4641#define helper_ole_check_ver(expr) { \
4642 HRESULT hr = expr; \
4643 ok_(__FILE__, line)(hr == S_OK, "-> %i (%s): " #expr " returned %#lx.\n", __LINE__, ver, hr); \
4644}
4645
4646#define helper_expect_list_and_release(list, expstr) { \
4647 char *str = list_to_string(list); \
4648 ok_(__FILE__, line)(strcmp(str, expstr)==0, "=> %i (%s): Invalid node list: %s, expected %s\n", __LINE__, ver, str, expstr); \
4649 if (list) IXMLDOMNodeList_Release(list); \
4650}
4651
4652#define helper_expect_bstr_and_release(bstr, str) { \
4653 ok_(__FILE__, line)(lstrcmpW(bstr, _bstr_(str)) == 0, \
4654 "=> %i (%s): got %s\n", __LINE__, ver, wine_dbgstr_w(bstr)); \
4655 SysFreeString(bstr); \
4656}
4657
4658#define check_ws_ignored(ver, doc, str) _check_ws_ignored(__LINE__, ver, doc, str)
4659static inline void _check_ws_ignored(int line, const char *ver, IXMLDOMDocument2* doc, char const* str)
4660{
4661 IXMLDOMNode *node1, *node2;
4663 BSTR bstr;
4664
4665 helper_ole_check_ver(IXMLDOMDocument2_selectNodes(doc, _bstr_("//*[local-name()='html']"), &list));
4666 helper_ole_check_ver(IXMLDOMNodeList_get_item(list, 0, &node1));
4667 helper_ole_check_ver(IXMLDOMNodeList_get_item(list, 1, &node2));
4668 helper_ole_check_ver(IXMLDOMNodeList_reset(list));
4669 helper_expect_list_and_release(list, "E1.E5.E1.E2.D1 E2.E5.E1.E2.D1");
4670
4671 helper_ole_check_ver(IXMLDOMNode_get_childNodes(node1, &list));
4673 "[4]1.E1.E5.E1.E2.D1 T2.E1.E5.E1.E2.D1 E3.E1.E5.E1.E2.D1 "
4674 "E4.E1.E5.E1.E2.D1 E5.E1.E5.E1.E2.D1 E6.E1.E5.E1.E2.D1");
4675 helper_ole_check_ver(IXMLDOMNode_get_text(node1, &bstr));
4676 if (str)
4677 {
4679 }
4680 else
4681 {
4682 helper_expect_bstr_and_release(bstr, " This is a description.");
4683 }
4684 IXMLDOMNode_Release(node1);
4685
4686 helper_ole_check_ver(IXMLDOMNode_get_childNodes(node2, &list));
4688 "T1.E2.E5.E1.E2.D1 E2.E2.E5.E1.E2.D1 T3.E2.E5.E1.E2.D1 "
4689 "E4.E2.E5.E1.E2.D1 T5.E2.E5.E1.E2.D1 E6.E2.E5.E1.E2.D1 T7.E2.E5.E1.E2.D1");
4690 helper_ole_check_ver(IXMLDOMNode_get_text(node2, &bstr));
4692 "\n This is a description with preserved whitespace. \n ");
4693 IXMLDOMNode_Release(node2);
4694}
4695
4696#define check_ws_preserved(ver, doc, str) _check_ws_preserved(__LINE__, ver, doc, str)
4697static inline void _check_ws_preserved(int line, const char *ver, IXMLDOMDocument2* doc, char const* str)
4698{
4699 IXMLDOMNode *node1, *node2;
4701 BSTR bstr;
4702
4703 helper_ole_check_ver(IXMLDOMDocument2_selectNodes(doc, _bstr_("//*[local-name()='html']"), &list));
4704 helper_ole_check_ver(IXMLDOMNodeList_get_item(list, 0, &node1));
4705 helper_ole_check_ver(IXMLDOMNodeList_get_item(list, 1, &node2));
4706 helper_ole_check_ver(IXMLDOMNodeList_reset(list));
4707 helper_expect_list_and_release(list, "E2.E10.E2.E2.D1 E4.E10.E2.E2.D1");
4708
4709 helper_ole_check_ver(IXMLDOMNode_get_childNodes(node1, &list));
4711 "T1.E2.E10.E2.E2.D1 [4]2.E2.E10.E2.E2.D1 T3.E2.E10.E2.E2.D1 "
4712 "E4.E2.E10.E2.E2.D1 T5.E2.E10.E2.E2.D1 E6.E2.E10.E2.E2.D1 "
4713 "E7.E2.E10.E2.E2.D1 E8.E2.E10.E2.E2.D1 T9.E2.E10.E2.E2.D1");
4714 helper_ole_check_ver(IXMLDOMNode_get_text(node1, &bstr));
4715 if (str)
4716 {
4718 }
4719 else
4720 {
4721 helper_expect_bstr_and_release(bstr, "\n This is a description. \n ");
4722 }
4723 IXMLDOMNode_Release(node1);
4724
4725 helper_ole_check_ver(IXMLDOMNode_get_childNodes(node2, &list));
4727 "T1.E4.E10.E2.E2.D1 E2.E4.E10.E2.E2.D1 T3.E4.E10.E2.E2.D1 "
4728 "E4.E4.E10.E2.E2.D1 T5.E4.E10.E2.E2.D1 E6.E4.E10.E2.E2.D1 T7.E4.E10.E2.E2.D1");
4729 helper_ole_check_ver(IXMLDOMNode_get_text(node2, &bstr));
4731 "\n This is a description with preserved whitespace. \n ");
4732 IXMLDOMNode_Release(node2);
4733}
4734
4736{
4740 const WCHAR *text;
4742 HRESULT hr;
4743 BSTR s;
4744
4745 hr = IXMLDOMDocument2_put_preserveWhiteSpace(doc, preserve);
4746 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4747
4748 hr = IXMLDOMDocument2_loadXML(doc, _bstr_(charrefsxml), &b);
4749 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4750
4751 hr = IXMLDOMDocument2_get_documentElement(doc, &root);
4752 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4753
4754 hr = IXMLDOMElement_get_childNodes(root, &list);
4755 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4756 IXMLDOMElement_Release(root);
4757
4758 text = preserve == VARIANT_TRUE ? L" Text A end " : L"Text A end";
4759 hr = IXMLDOMNodeList_get_item(list, 0, &node);
4760 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4761 hr = IXMLDOMNode_get_text(node, &s);
4762 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4763 ok(!lstrcmpW(s, text), "0x%x, got %s\n", preserve, wine_dbgstr_w(s));
4765 IXMLDOMNode_Release(node);
4766
4767 text = preserve == VARIANT_TRUE ? L"AB C " : L"AB C";
4768 hr = IXMLDOMNodeList_get_item(list, 1, &node);
4769 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4770 hr = IXMLDOMNode_get_text(node, &s);
4771 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4772 ok(!lstrcmpW(s, text), "0x%x, got %s\n", preserve, wine_dbgstr_w(s));
4774 IXMLDOMNode_Release(node);
4775
4776 IXMLDOMNodeList_Release(list);
4777}
4778
4780 const CLSID *clsid;
4781 const char *name;
4782};
4783
4784static const struct whitespace_t whitespace_test_data[] = {
4785 { &CLSID_DOMDocument, "CLSID_DOMDocument" },
4786 { &CLSID_DOMDocument2, "CLSID_DOMDocument2" },
4787 { &CLSID_DOMDocument26, "CLSID_DOMDocument26" },
4788 { &CLSID_DOMDocument30, "CLSID_DOMDocument30" },
4789 { &CLSID_DOMDocument40, "CLSID_DOMDocument40" },
4790 { &CLSID_DOMDocument60, "CLSID_DOMDocument60" },
4791 { 0 }
4792};
4793
4794static void test_whitespace(void)
4795{
4796 const struct whitespace_t *class_ptr = whitespace_test_data;
4797
4798 while (class_ptr->clsid)
4799 {
4800 IXMLDOMDocument2 *doc1, *doc2, *doc3, *doc4;
4804 HRESULT hr;
4805 LONG len;
4806
4807 if (!is_clsid_supported(class_ptr->clsid, &IID_IXMLDOMDocument2))
4808 {
4809 class_ptr++;
4810 continue;
4811 }
4812
4813 hr = CoCreateInstance(class_ptr->clsid, NULL, CLSCTX_INPROC_SERVER,
4814 &IID_IXMLDOMDocument2, (void**)&doc1);
4815 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4816
4817 hr = CoCreateInstance(class_ptr->clsid, NULL, CLSCTX_INPROC_SERVER,
4818 &IID_IXMLDOMDocument2, (void**)&doc2);
4819 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4820
4821 hr = IXMLDOMDocument2_put_preserveWhiteSpace(doc2, VARIANT_TRUE);
4822 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4823 hr = IXMLDOMDocument2_get_preserveWhiteSpace(doc1, &b);
4824 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4825 ok(b == VARIANT_FALSE, "expected false\n");
4826 hr = IXMLDOMDocument2_get_preserveWhiteSpace(doc2, &b);
4827 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4828 ok(b == VARIANT_TRUE, "expected true\n");
4829
4830 hr = IXMLDOMDocument2_loadXML(doc1, _bstr_(szExampleXML), &b);
4831 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4832 ok(b == VARIANT_TRUE, "failed to load XML string\n");
4833 hr = IXMLDOMDocument2_loadXML(doc2, _bstr_(szExampleXML), &b);
4834 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4835 ok(b == VARIANT_TRUE, "failed to load XML string\n");
4836
4837 /* switch to XPath */
4838 hr = IXMLDOMDocument2_setProperty(doc1, _bstr_("SelectionLanguage"), _variantbstr_("XPath"));
4839 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4840 hr = IXMLDOMDocument2_setProperty(doc2, _bstr_("SelectionLanguage"), _variantbstr_("XPath"));
4841 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4842
4843 check_ws_ignored(class_ptr->name, doc1, NULL);
4844 check_ws_preserved(class_ptr->name, doc2, NULL);
4845
4846 /* new instances copy the property */
4847 hr = IXMLDOMDocument2_QueryInterface(doc1, &IID_IXMLDOMDocument2, (void**) &doc3);
4848 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4849 hr = IXMLDOMDocument2_QueryInterface(doc2, &IID_IXMLDOMDocument2, (void**) &doc4);
4850 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4851
4852 hr = IXMLDOMDocument2_get_preserveWhiteSpace(doc3, &b);
4853 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4854 ok(b == VARIANT_FALSE, "expected false\n");
4855 hr = IXMLDOMDocument2_get_preserveWhiteSpace(doc4, &b);
4856 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4857 ok(b == VARIANT_TRUE, "expected true\n");
4858
4859 check_ws_ignored(class_ptr->name, doc3, NULL);
4860 check_ws_preserved(class_ptr->name, doc4, NULL);
4861
4862 /* setting after loading xml affects trimming of leading/trailing ws only */
4863 hr = IXMLDOMDocument2_put_preserveWhiteSpace(doc1, VARIANT_TRUE);
4864 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4865 hr = IXMLDOMDocument2_put_preserveWhiteSpace(doc2, VARIANT_FALSE);
4866 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4867
4868 /* the trailing "\n " isn't there, because it was ws-only node */
4869 check_ws_ignored(class_ptr->name, doc1, " This is a description. ");
4870 check_ws_preserved(class_ptr->name, doc2, " This is a description.");
4871
4872 /* it takes effect on reload */
4873 hr = IXMLDOMDocument2_get_preserveWhiteSpace(doc1, &b);
4874 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4875 ok(b == VARIANT_TRUE, "expected true\n");
4876 hr = IXMLDOMDocument2_get_preserveWhiteSpace(doc2, &b);
4877 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4878 ok(b == VARIANT_FALSE, "expected false\n");
4879
4880 hr = IXMLDOMDocument2_loadXML(doc1, _bstr_(szExampleXML), &b);
4881 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4882 ok(b == VARIANT_TRUE, "failed to load XML string\n");
4883 hr = IXMLDOMDocument2_loadXML(doc2, _bstr_(szExampleXML), &b);
4884 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4885 ok(b == VARIANT_TRUE, "failed to load XML string\n");
4886
4887 check_ws_preserved(class_ptr->name, doc1, NULL);
4888 check_ws_ignored(class_ptr->name, doc2, NULL);
4889
4890 /* other instances follow suit */
4891 hr = IXMLDOMDocument2_get_preserveWhiteSpace(doc3, &b);
4892 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4893 ok(b == VARIANT_TRUE, "expected true\n");
4894 hr = IXMLDOMDocument2_get_preserveWhiteSpace(doc4, &b);
4895 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4896 ok(b == VARIANT_FALSE, "expected false\n");
4897
4898 check_ws_preserved(class_ptr->name, doc3, NULL);
4899 check_ws_ignored(class_ptr->name, doc4, NULL);
4900
4901 IXMLDOMDocument2_Release(doc2);
4902 IXMLDOMDocument2_Release(doc3);
4903 IXMLDOMDocument2_Release(doc4);
4904
4905 /* text with char references */
4906 test_preserve_charref(doc1, VARIANT_TRUE);
4907 test_preserve_charref(doc1, VARIANT_FALSE);
4908
4909 /* formatting whitespaces */
4910 hr = IXMLDOMDocument2_put_preserveWhiteSpace(doc1, VARIANT_FALSE);
4911 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4912
4913 hr = IXMLDOMDocument2_loadXML(doc1, _bstr_(complete7), &b);
4914 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4915 ok(b == VARIANT_TRUE, "for %x\n", b);
4916
4917 hr = IXMLDOMDocument2_get_documentElement(doc1, &root);
4918 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4919 hr = IXMLDOMElement_get_childNodes(root, &list);
4920 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4921 len = 0;
4922 hr = IXMLDOMNodeList_get_length(list, &len);
4923 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
4924 ok(len == 3, "got %ld\n", len);
4925 IXMLDOMNodeList_Release(list);
4926 IXMLDOMElement_Release(root);
4927
4928 IXMLDOMDocument2_Release(doc1);
4929
4930 free_bstrs();
4931
4932 class_ptr++;
4933 }
4934}
4935
4936typedef struct {
4937 const GUID *clsid;
4938 const char *name;
4939 const char *ns;
4942
4943/* supposed to be tested with szExampleXML */
4945 { &CLSID_DOMDocument, "CLSID_DOMDocument", "\txmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'", S_OK },
4946 { &CLSID_DOMDocument, "CLSID_DOMDocument", "\n\rxmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'", S_OK },
4947 { &CLSID_DOMDocument, "CLSID_DOMDocument", " xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'", S_OK },
4948 { &CLSID_DOMDocument, "CLSID_DOMDocument", "xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29' ", S_OK },
4949
4950 { &CLSID_DOMDocument2, "CLSID_DOMDocument2", "\txmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'", S_OK },
4951 { &CLSID_DOMDocument2, "CLSID_DOMDocument2", "\n\rxmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'", S_OK },
4952 { &CLSID_DOMDocument2, "CLSID_DOMDocument2", " xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'", S_OK },
4953 { &CLSID_DOMDocument2, "CLSID_DOMDocument2", "xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29' ", S_OK },
4954
4955 { &CLSID_DOMDocument30, "CLSID_DOMDocument30", "\txmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'", S_OK },
4956 { &CLSID_DOMDocument30, "CLSID_DOMDocument30", "\n\rxmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'", S_OK },
4957 { &CLSID_DOMDocument30, "CLSID_DOMDocument30", " xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'", S_OK },
4958 { &CLSID_DOMDocument30, "CLSID_DOMDocument30", "xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29' ", S_OK },
4959
4960 { &CLSID_DOMDocument40, "CLSID_DOMDocument40", "\txmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'", S_OK },
4961 { &CLSID_DOMDocument40, "CLSID_DOMDocument40", "\n\rxmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'", S_OK },
4962 { &CLSID_DOMDocument40, "CLSID_DOMDocument40", " xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'", S_OK },
4963 { &CLSID_DOMDocument40, "CLSID_DOMDocument40", "xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29' ", S_OK },
4964
4965 { &CLSID_DOMDocument60, "CLSID_DOMDocument60", "\txmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'", S_OK },
4966 { &CLSID_DOMDocument60, "CLSID_DOMDocument60", "\n\rxmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'", S_OK },
4967 { &CLSID_DOMDocument60, "CLSID_DOMDocument60", " xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'", S_OK },
4968 { &CLSID_DOMDocument60, "CLSID_DOMDocument60", "xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29' ", S_OK },
4969
4970 { NULL }
4971};
4972
4973typedef struct {
4974 const char *query;
4975 const char *list;
4976} xpath_test_t;
4977
4978static const xpath_test_t xpath_test[] = {
4979 { "*/a", "E1.E1.E2.D1 E1.E2.E2.D1 E1.E4.E2.D1" },
4980 { "*/b", "E2.E1.E2.D1 E2.E2.E2.D1 E2.E4.E2.D1" },
4981 { "*/c", "E3.E1.E2.D1 E3.E2.E2.D1" },
4982 { "*/d", "E4.E1.E2.D1 E4.E2.E2.D1 E4.E4.E2.D1" },
4983 { "//a", "E1.E1.E2.D1 E1.E2.E2.D1 E1.E4.E2.D1" },
4984 { "//b", "E2.E1.E2.D1 E2.E2.E2.D1 E2.E4.E2.D1" },
4985 { "//c", "E3.E1.E2.D1 E3.E2.E2.D1" },
4986 { "//d", "E4.E1.E2.D1 E4.E2.E2.D1 E4.E4.E2.D1" },
4987 { "//c[@type]", "E3.E2.E2.D1" },
4988 { "//c[@type]/ancestor::node()[1]", "E2.E2.D1" },
4989 { "//c[@type]/ancestor-or-self::node()[1]", "E3.E2.E2.D1" },
4990 { "//c[@type]/attribute::node()[1]", "A'type'.E3.E2.E2.D1" },
4991 { "//c[@type]/child::node()[1]", "T1.E3.E2.E2.D1" },
4992 { "//c[@type]/descendant::node()[1]", "T1.E3.E2.E2.D1" },
4993 { "//c[@type]/descendant-or-self::node()[1]", "E3.E2.E2.D1" },
4994 { "//c[@type]/following::node()[1]", "E4.E2.E2.D1" },
4995 { "//c[@type]/following-sibling::node()[1]", "E4.E2.E2.D1" },
4996 { "//c[@type]/parent::node()[1]", "E2.E2.D1" },
4997 { "//c[@type]/preceding::node()[1]", "T1.E2.E2.E2.D1" },
4998 { "//c[@type]/self::node()[1]", "E3.E2.E2.D1" },
4999 { "child::*", "E1.E2.D1 E2.E2.D1 E3.E2.D1 E4.E2.D1" },
5000 { "child::node()", "E1.E2.D1 E2.E2.D1 E3.E2.D1 E4.E2.D1" },
5001 { "child::text()", "" },
5002 { "child::*/..", "E2.D1" },
5003 { "child::*//@*/..", "E2.E5.E1.E2.D1 E2.E2.D1 E3.E2.E2.D1" },
5004 { "self::node()", "E2.D1" },
5005 { "ancestor::node()", "D1" },
5006 { "elem[c][last()]/a", "E1.E2.E2.D1"},
5007 { "ancestor-or-self::node()[1]", "E2.D1" },
5008 { "((//a)[1])[last()]", "E1.E1.E2.D1" },
5009 { "//elem[@*]", "E2.E2.D1" },
5010 { NULL }
5011};
5012
5013static void test_XPath(void)
5014{
5016 const xpath_test_t *xptest = xpath_test;
5017 VARIANT var;
5019 IXMLDOMDocument2 *doc;
5020 IXMLDOMDocument *doc2;
5021 IXMLDOMNode *rootNode;
5022 IXMLDOMNode *elem1Node;
5028 HRESULT hr;
5029 LONG len;
5030 BSTR str;
5031
5032 if (!is_clsid_supported(&CLSID_DOMDocument2, &IID_IXMLDOMDocument2)) return;
5033 doc = create_document(&IID_IXMLDOMDocument2);
5034
5035 hr = IXMLDOMDocument2_loadXML(doc, _bstr_(szExampleXML), &b);
5036 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5037 ok(b == VARIANT_TRUE, "failed to load XML string\n");
5038
5039 /* switch to XPath */
5040 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionLanguage"), _variantbstr_("XPath"));
5041 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5042
5043 /* some simple queries*/
5044 EXPECT_REF(doc, 1);
5045 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("root"), &list);
5046 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5047 EXPECT_REF(doc, 1);
5049
5050 EXPECT_REF(list, 1);
5051 hr = IXMLDOMNodeList_get_item(list, 0, &rootNode);
5052 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5053 EXPECT_REF(list, 1);
5054 EXPECT_REF(rootNode, 1);
5055
5056 hr = IXMLDOMNodeList_reset(list);
5057 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5058 expect_list_and_release(list, "E2.D1");
5059
5060 /* perform xpath tests */
5061 for ( ; xptest->query ; xptest++ )
5062 {
5063 char *str;
5064
5065 hr = IXMLDOMNode_selectNodes(rootNode, _bstr_(xptest->query), &list);
5066 ok(hr == S_OK, "query evaluation failed for query=%s\n", xptest->query);
5067
5068 if (hr != S_OK)
5069 continue;
5070
5072
5073 ok(!strcmp(str, xptest->list), "query=%s, invalid node list: \"%s\", expected \"%s\"\n",
5074 xptest->query, str, xptest->list);
5075
5076 if (list)
5077 IXMLDOMNodeList_Release(list);
5078 }
5079
5080if (0)
5081{
5082 /* namespace:: axis test is disabled until namespace definitions
5083 are supported as attribute nodes, currently it's another node type */
5084 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("/root/namespace::*"), &list);
5085 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5086 len = -1;
5087 hr = IXMLDOMNodeList_get_length(list, &len);
5088 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5089 ok(len == 2, "got %ld\n", len);
5090
5091 hr = IXMLDOMNodeList_nextNode(list, &node);
5092 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5094 hr = IXMLDOMNode_get_nodeType(node, &type);
5095 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5096 ok(type == NODE_ATTRIBUTE, "got %d\n", type);
5097 IXMLDOMNode_Release(node);
5098
5099 IXMLDOMNodeList_Release(list);
5100}
5101
5102 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("root//c"), &list);
5103 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5104 expect_list_and_release(list, "E3.E1.E2.D1 E3.E2.E2.D1");
5105
5106 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("//c[@type]"), &list);
5107 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5108 expect_list_and_release(list, "E3.E2.E2.D1");
5109
5110 hr = IXMLDOMNode_selectNodes(rootNode, _bstr_("elem"), &list);
5111 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5112 /* using get_item for query results advances the position */
5113 hr = IXMLDOMNodeList_get_item(list, 1, &node);
5114 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5115 expect_node(node, "E2.E2.D1");
5116 IXMLDOMNode_Release(node);
5117 hr = IXMLDOMNodeList_nextNode(list, &node);
5118 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5119 expect_node(node, "E4.E2.D1");
5120 IXMLDOMNode_Release(node);
5121 hr = IXMLDOMNodeList_reset(list);
5122 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5123 expect_list_and_release(list, "E1.E2.D1 E2.E2.D1 E4.E2.D1");
5124
5125 hr = IXMLDOMNode_selectNodes(rootNode, _bstr_("."), &list);
5126 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5127 expect_list_and_release(list, "E2.D1");
5128
5129 hr = IXMLDOMNode_selectNodes(rootNode, _bstr_("elem[3]/preceding-sibling::*"), &list);
5130 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5131 hr = IXMLDOMNodeList_get_item(list, 0, &elem1Node);
5132 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5133 hr = IXMLDOMNodeList_reset(list);
5134 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5135 expect_list_and_release(list, "E1.E2.D1 E2.E2.D1 E3.E2.D1");
5136
5137 /* select an attribute */
5138 hr = IXMLDOMNode_selectNodes(rootNode, _bstr_(".//@type"), &list);
5139 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5140 expect_list_and_release(list, "A'type'.E3.E2.E2.D1");
5141
5142 /* would evaluate to a number */
5143 hr = IXMLDOMNode_selectNodes(rootNode, _bstr_("count(*)"), &list);
5144 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
5145 /* would evaluate to a boolean */
5146 hr = IXMLDOMNode_selectNodes(rootNode, _bstr_("position()>0"), &list);
5147 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
5148 /* would evaluate to a string */
5149 hr = IXMLDOMNode_selectNodes(rootNode, _bstr_("name()"), &list);
5150 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
5151
5152 /* no results */
5153 hr = IXMLDOMNode_selectNodes(rootNode, _bstr_("c"), &list);
5154 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5156 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("elem//c"), &list);
5157 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5159 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("//elem[4]"), &list);
5160 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5162 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("root//elem[0]"), &list);
5163 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5165
5166 /* foo undeclared in document node */
5167 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("root//foo:c"), &list);
5168 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
5169 /* undeclared in <root> node */
5170 hr = IXMLDOMNode_selectNodes(rootNode, _bstr_(".//foo:c"), &list);
5171 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
5172 /* undeclared in <elem> node */
5173 hr = IXMLDOMNode_selectNodes(elem1Node, _bstr_("//foo:c"), &list);
5174 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
5175 /* but this trick can be used */
5176 hr = IXMLDOMNode_selectNodes(elem1Node, _bstr_("//*[name()='foo:c']"), &list);
5177 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5178 expect_list_and_release(list, "E3.E4.E2.D1");
5179
5180 /* it has to be declared in SelectionNamespaces */
5181 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionNamespaces"),
5182 _variantbstr_("xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'"));
5183 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5184
5185 /* now the namespace can be used */
5186 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("root//test:c"), &list);
5187 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5188 expect_list_and_release(list, "E3.E3.E2.D1 E3.E4.E2.D1");
5189 hr = IXMLDOMNode_selectNodes(rootNode, _bstr_(".//test:c"), &list);
5190 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5191 expect_list_and_release(list, "E3.E3.E2.D1 E3.E4.E2.D1");
5192 hr = IXMLDOMNode_selectNodes(elem1Node, _bstr_("//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(elem1Node, _bstr_(".//test:x"), &list);
5196 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5197 expect_list_and_release(list, "E6.E1.E5.E1.E2.D1 E6.E2.E5.E1.E2.D1");
5198
5199 /* SelectionNamespaces syntax error - the namespaces doesn't work anymore but the value is stored */
5200 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionNamespaces"),
5201 _variantbstr_("xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29' xmlns:foo=###"));
5202 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
5203
5204 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("root//foo:c"), &list);
5205 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
5206
5207 VariantInit(&var);
5208 hr = IXMLDOMDocument2_getProperty(doc, _bstr_("SelectionNamespaces"), &var);
5209 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5210 expect_eq(V_VT(&var), VT_BSTR, int, "%x");
5211 if (V_VT(&var) == VT_BSTR)
5212 expect_bstr_eq_and_free(V_BSTR(&var), "xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29' xmlns:foo=###");
5213
5214 /* extra attributes - same thing*/
5215 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionNamespaces"),
5216 _variantbstr_("xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29' param='test'"));
5217 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
5218 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("root//foo:c"), &list);
5219 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
5220
5221 IXMLDOMNode_Release(rootNode);
5222 IXMLDOMNode_Release(elem1Node);
5223
5224 /* alter document with already built list */
5225 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("root"), &list);
5226 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5228
5229 hr = IXMLDOMDocument2_get_lastChild(doc, &rootNode);
5230 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5231 EXPECT_REF(rootNode, 1);
5232 EXPECT_REF(doc, 1);
5233
5234 hr = IXMLDOMDocument2_removeChild(doc, rootNode, NULL);
5235 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5236 IXMLDOMNode_Release(rootNode);
5237
5239
5240 hr = IXMLDOMNodeList_get_item(list, 0, &rootNode);
5241 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5242 EXPECT_REF(rootNode, 1);
5243
5244 IXMLDOMNodeList_Release(list);
5245
5246 hr = IXMLDOMNode_get_nodeName(rootNode, &str);
5247 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5248 ok(!lstrcmpW(str, L"root"), "got %s\n", wine_dbgstr_w(str));
5250 IXMLDOMNode_Release(rootNode);
5251
5252 /* alter node from list and get it another time */
5253 hr = IXMLDOMDocument2_loadXML(doc, _bstr_(szExampleXML), &b);
5254 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5255 ok(b == VARIANT_TRUE, "failed to load XML string\n");
5256
5257 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("root"), &list);
5258 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5260
5261 hr = IXMLDOMNodeList_get_item(list, 0, &rootNode);
5262 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5263
5264 hr = IXMLDOMNode_QueryInterface(rootNode, &IID_IXMLDOMElement, (void**)&elem);
5265 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5266
5267 V_VT(&var) = VT_I2;
5268 V_I2(&var) = 1;
5269 hr = IXMLDOMElement_setAttribute(elem, _bstr_("attrtest"), var);
5270 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5271 IXMLDOMElement_Release(elem);
5272 IXMLDOMNode_Release(rootNode);
5273
5274 /* now check attribute to be present */
5275 hr = IXMLDOMNodeList_get_item(list, 0, &rootNode);
5276 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5277
5278 hr = IXMLDOMNode_QueryInterface(rootNode, &IID_IXMLDOMElement, (void**)&elem);
5279 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5280
5281 hr = IXMLDOMElement_getAttributeNode(elem, _bstr_("attrtest"), &attr);
5282 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5283 IXMLDOMAttribute_Release(attr);
5284
5285 IXMLDOMElement_Release(elem);
5286 IXMLDOMNode_Release(rootNode);
5287
5288 /* and now check for attribute in original document */
5289 hr = IXMLDOMDocument2_get_documentElement(doc, &elem);
5290 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5291
5292 hr = IXMLDOMElement_getAttributeNode(elem, _bstr_("attrtest"), &attr);
5293 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5294 IXMLDOMAttribute_Release(attr);
5295
5296 IXMLDOMElement_Release(elem);
5297
5298 /* attach node from list to another document */
5299 doc2 = create_document(&IID_IXMLDOMDocument);
5300
5301 hr = IXMLDOMDocument2_loadXML(doc, _bstr_(szExampleXML), &b);
5302 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5303 ok(b == VARIANT_TRUE, "failed to load XML string\n");
5304
5305 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("root"), &list);
5306 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5308
5309 hr = IXMLDOMNodeList_get_item(list, 0, &rootNode);
5310 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5311 EXPECT_REF(rootNode, 1);
5312
5313 hr = IXMLDOMDocument_appendChild(doc2, rootNode, NULL);
5314 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5315 EXPECT_REF(rootNode, 1);
5316 EXPECT_REF(doc2, 1);
5317 EXPECT_REF(list, 1);
5318
5320
5321 IXMLDOMNode_Release(rootNode);
5322 IXMLDOMNodeList_Release(list);
5323 IXMLDOMDocument_Release(doc2);
5324 IXMLDOMDocument2_Release(doc);
5325
5326 while (ptr->clsid)
5327 {
5328 if (is_clsid_supported(ptr->clsid, &IID_IXMLDOMDocument2))
5329 {
5330 hr = CoCreateInstance(ptr->clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (void**)&doc);
5331 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5332 }
5333 else
5334 {
5335 ptr++;
5336 continue;
5337 }
5338
5339 hr = IXMLDOMDocument2_loadXML(doc, _bstr_(szExampleXML), &b);
5340 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5341 ok(b == VARIANT_TRUE, "failed to load, %s\n", ptr->name);
5342
5343 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionLanguage"), _variantbstr_("XPath"));
5344 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5345
5346 V_VT(&var) = VT_BSTR;
5347 V_BSTR(&var) = _bstr_(ptr->ns);
5348
5349 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionNamespaces"), var);
5350 ok(hr == ptr->hr, "Unexpected hr %#lx., for %s, %s\n", hr, ptr->name, ptr->ns);
5351
5352 V_VT(&var) = VT_EMPTY;
5353 hr = IXMLDOMDocument2_getProperty(doc, _bstr_("SelectionNamespaces"), &var);
5354 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5355 ok(V_VT(&var) == VT_BSTR, "got wrong property type %d\n", V_VT(&var));
5356 ok(!lstrcmpW(V_BSTR(&var), _bstr_(ptr->ns)), "got wrong value %s\n", wine_dbgstr_w(V_BSTR(&var)));
5357 VariantClear(&var);
5358
5359 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("root//test:c"), &list);
5360 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5361 if (hr == S_OK)
5362 expect_list_and_release(list, "E3.E3.E2.D1 E3.E4.E2.D1");
5363
5364 IXMLDOMDocument2_Release(doc);
5365 ptr++;
5366 free_bstrs();
5367 }
5368
5369 free_bstrs();
5370}
5371
5372static void test_cloneNode(void )
5373{
5374 IXMLDOMDocument2 *doc, *doc_clone;
5375 IXMLDOMDocument *doc2;
5378 IXMLDOMNamedNodeMap *mapAttr;
5379 LONG length, length1;
5380 LONG attr_cnt, attr_cnt1;
5383 IXMLDOMNode *node_first;
5384 VARIANT v;
5385 HRESULT hr;
5386
5387 doc = create_document(&IID_IXMLDOMDocument2);
5388
5389 hr = IXMLDOMDocument2_loadXML(doc, _bstr_(complete4A), &b);
5390 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5391 ok(b == VARIANT_TRUE, "failed to load XML string\n");
5392
5393 hr = IXMLDOMDocument2_getProperty(doc, _bstr_("SelectionLanguage"), &v);
5394 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5395 ok(!lstrcmpW(V_BSTR(&v), L"XSLPattern"), "got prop value %s\n", wine_dbgstr_w(V_BSTR(&v)));
5396 VariantClear(&v);
5397
5398 V_BSTR(&v) = _bstr_("XPath");
5399 V_VT(&v) = VT_BSTR;
5400 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionLanguage"), v);
5401 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5402
5403 /* clone document node */
5404 hr = IXMLDOMDocument2_cloneNode(doc, VARIANT_TRUE, &node);
5405 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr );
5406 ok( node != NULL, "node %p\n", node );
5407
5408 hr = IXMLDOMNode_get_childNodes(node, &pList);
5409 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr );
5410 length = 0;
5411 hr = IXMLDOMNodeList_get_length(pList, &length);
5412 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr );
5413 ok(length == 2, "got %ld\n", length);
5414 IXMLDOMNodeList_Release(pList);
5415
5416 hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMDocument2, (void**)&doc_clone);
5417 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5418
5419 /* cloned document inherits properties */
5420 hr = IXMLDOMDocument2_getProperty(doc_clone, _bstr_("SelectionLanguage"), &v);
5421 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5422 ok(!lstrcmpW(V_BSTR(&v), L"XPath"), "got prop value %s\n", wine_dbgstr_w(V_BSTR(&v)));
5423 VariantClear(&v);
5424
5425 IXMLDOMDocument2_Release(doc_clone);
5426 IXMLDOMNode_Release(node);
5427
5428 hr = IXMLDOMDocument2_selectSingleNode(doc, _bstr_("lc/pr"), &node);
5429 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr );
5430 ok( node != NULL, "node %p\n", node );
5431
5432 /* Check invalid parameter */
5433 hr = IXMLDOMNode_cloneNode(node, VARIANT_TRUE, NULL);
5434 ok( hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5435
5436 /* All Children */
5437 hr = IXMLDOMNode_cloneNode(node, VARIANT_TRUE, &node_clone);
5438 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr );
5439 ok( node_clone != NULL, "node %p\n", node );
5440
5441 hr = IXMLDOMNode_get_firstChild(node_clone, &node_first);
5442 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr );
5443 hr = IXMLDOMNode_get_ownerDocument(node_clone, &doc2);
5444 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr );
5445 IXMLDOMDocument_Release(doc2);
5446 IXMLDOMNode_Release(node_first);
5447
5448 hr = IXMLDOMNode_get_childNodes(node, &pList);
5449 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr );
5450 length = 0;
5451 hr = IXMLDOMNodeList_get_length(pList, &length);
5452 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr );
5453 ok(length == 1, "got %ld\n", length);
5454 IXMLDOMNodeList_Release(pList);
5455
5456 hr = IXMLDOMNode_get_attributes(node, &mapAttr);
5457 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr );
5458 attr_cnt = 0;
5459 hr = IXMLDOMNamedNodeMap_get_length(mapAttr, &attr_cnt);
5460 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr );
5461 ok(attr_cnt == 3, "got %ld\n", attr_cnt);
5462 IXMLDOMNamedNodeMap_Release(mapAttr);
5463
5464 hr = IXMLDOMNode_get_childNodes(node_clone, &pList);
5465 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr );
5466 length1 = 0;
5467 hr = IXMLDOMNodeList_get_length(pList, &length1);
5468 ok(length1 == 1, "got %ld\n", length1);
5469 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr );
5470 IXMLDOMNodeList_Release(pList);
5471
5472 hr = IXMLDOMNode_get_attributes(node_clone, &mapAttr);
5473 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr );
5474 attr_cnt1 = 0;
5475 hr = IXMLDOMNamedNodeMap_get_length(mapAttr, &attr_cnt1);
5476 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr );
5477 ok(attr_cnt1 == 3, "got %ld\n", attr_cnt1);
5478 /* now really get some attributes from cloned element */
5479 attr = NULL;
5480 hr = IXMLDOMNamedNodeMap_getNamedItem(mapAttr, _bstr_("id"), &attr);
5481 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
5482 IXMLDOMNode_Release(attr);
5483 IXMLDOMNamedNodeMap_Release(mapAttr);
5484
5485 ok(length == length1, "wrong Child count (%ld, %ld)\n", length, length1);
5486 ok(attr_cnt == attr_cnt1, "wrong Attribute count (%ld, %ld)\n", attr_cnt, attr_cnt1);
5487 IXMLDOMNode_Release(node_clone);
5488
5489 /* No Children */
5490 hr = IXMLDOMNode_cloneNode(node, VARIANT_FALSE, &node_clone);
5491 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr );
5492 ok( node_clone != NULL, "node %p\n", node );
5493
5494 hr = IXMLDOMNode_get_firstChild(node_clone, &node_first);
5495 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
5496
5497 hr = IXMLDOMNode_get_childNodes(node_clone, &pList);
5498 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5499 hr = IXMLDOMNodeList_get_length(pList, &length1);
5500 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5501 ok( length1 == 0, "Length should be 0 (%ld)\n", length1);
5502 IXMLDOMNodeList_Release(pList);
5503
5504 hr = IXMLDOMNode_get_attributes(node_clone, &mapAttr);
5505 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5506 hr = IXMLDOMNamedNodeMap_get_length(mapAttr, &attr_cnt1);
5507 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5508 ok(attr_cnt1 == 3, "Attribute count should be 3 (%ld)\n", attr_cnt1);
5509 IXMLDOMNamedNodeMap_Release(mapAttr);
5510
5511 ok(length != length1, "wrong Child count (%ld, %ld)\n", length, length1);
5512 ok(attr_cnt == attr_cnt1, "wrong Attribute count (%ld, %ld)\n", attr_cnt, attr_cnt1);
5513 IXMLDOMNode_Release(node_clone);
5514
5515 IXMLDOMNode_Release(node);
5516 IXMLDOMDocument2_Release(doc);
5517 free_bstrs();
5518}
5519
5520static void test_xmlTypes(void)
5521{
5522 IXMLDOMDocument *doc;
5523 IXMLDOMElement *pRoot;
5524 HRESULT hr;
5525 IXMLDOMComment *pComment;
5526 IXMLDOMElement *pElement;
5527 IXMLDOMAttribute *pAttribute;
5528 IXMLDOMNamedNodeMap *pAttribs;
5529 IXMLDOMCDATASection *pCDataSec;
5530 IXMLDOMImplementation *pIXMLDOMImplementation = NULL;
5531 IXMLDOMDocumentFragment *pDocFrag = NULL;
5532 IXMLDOMEntityReference *pEntityRef = NULL;
5533 BSTR str;
5534 IXMLDOMNode *pNextChild;
5535 VARIANT v;
5536 LONG len = 0;
5537
5538 doc = create_document(&IID_IXMLDOMDocument);
5539
5540 hr = IXMLDOMDocument_get_nextSibling(doc, NULL);
5541 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5542
5543 pNextChild = (void*)0xdeadbeef;
5544 hr = IXMLDOMDocument_get_nextSibling(doc, &pNextChild);
5545 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
5546 ok(pNextChild == NULL, "pDocChild not NULL\n");
5547
5548 /* test previous Sibling */
5549 hr = IXMLDOMDocument_get_previousSibling(doc, NULL);
5550 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5551
5552 pNextChild = (void*)0xdeadbeef;
5553 hr = IXMLDOMDocument_get_previousSibling(doc, &pNextChild);
5554 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
5555 ok(pNextChild == NULL, "pNextChild not NULL\n");
5556
5557 /* test get_dataType */
5558 V_VT(&v) = VT_EMPTY;
5559 hr = IXMLDOMDocument_get_dataType(doc, &v);
5560 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
5561 ok( V_VT(&v) == VT_NULL, "incorrect dataType type\n");
5562 VariantClear(&v);
5563
5564 /* test implementation */
5565 hr = IXMLDOMDocument_get_implementation(doc, NULL);
5566 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5567
5568 hr = IXMLDOMDocument_get_implementation(doc, &pIXMLDOMImplementation);
5569 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5570 if(hr == S_OK)
5571 {
5572 VARIANT_BOOL hasFeature = VARIANT_TRUE;
5573 BSTR sEmpty = SysAllocStringLen(NULL, 0);
5574
5575 hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, NULL, sEmpty, &hasFeature);
5576 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5577
5578 hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, sEmpty, sEmpty, NULL);
5579 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5580
5581 hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, _bstr_("DOM"), sEmpty, &hasFeature);
5582 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5583 ok(hasFeature == VARIANT_FALSE, "hasFeature returned false\n");
5584
5585 hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, sEmpty, sEmpty, &hasFeature);
5586 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5587 ok(hasFeature == VARIANT_FALSE, "hasFeature returned true\n");
5588
5589 hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, _bstr_("DOM"), NULL, &hasFeature);
5590 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5591 ok(hasFeature == VARIANT_TRUE, "hasFeature returned false\n");
5592
5593 hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, _bstr_("DOM"), sEmpty, &hasFeature);
5594 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5595 ok(hasFeature == VARIANT_FALSE, "hasFeature returned false\n");
5596
5597 hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, _bstr_("DOM"), _bstr_("1.0"), &hasFeature);
5598 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5599 ok(hasFeature == VARIANT_TRUE, "hasFeature returned true\n");
5600
5601 hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, _bstr_("XML"), _bstr_("1.0"), &hasFeature);
5602 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5603 ok(hasFeature == VARIANT_TRUE, "hasFeature returned true\n");
5604
5605 hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, _bstr_("MS-DOM"), _bstr_("1.0"), &hasFeature);
5606 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5607 ok(hasFeature == VARIANT_TRUE, "hasFeature returned true\n");
5608
5609 hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, _bstr_("SSS"), NULL, &hasFeature);
5610 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5611 ok(hasFeature == VARIANT_FALSE, "hasFeature returned false\n");
5612
5613 SysFreeString(sEmpty);
5614 IXMLDOMImplementation_Release(pIXMLDOMImplementation);
5615 }
5616
5617 pRoot = (IXMLDOMElement*)0x1;
5618 hr = IXMLDOMDocument_createElement(doc, NULL, &pRoot);
5619 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5620 ok(pRoot == (void*)0x1, "Expect same ptr, got %p\n", pRoot);
5621
5622 pRoot = (IXMLDOMElement*)0x1;
5623 hr = IXMLDOMDocument_createElement(doc, _bstr_(""), &pRoot);
5624 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr );
5625 ok(pRoot == (void*)0x1, "Expect same ptr, got %p\n", pRoot);
5626
5627 hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing"), &pRoot);
5628 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5629 if(hr == S_OK)
5630 {
5631 hr = IXMLDOMDocument_appendChild(doc, (IXMLDOMNode*)pRoot, NULL);
5632 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5633 if(hr == S_OK)
5634 {
5635 /* Comment */
5636 str = SysAllocString(L"A Comment");
5637 hr = IXMLDOMDocument_createComment(doc, str, &pComment);
5639 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5640 if(hr == S_OK)
5641 {
5642 hr = IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pComment, NULL);
5643 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5644
5645 hr = IXMLDOMComment_get_nodeName(pComment, &str);
5646 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5647 ok( !lstrcmpW( str, L"#comment" ), "incorrect comment node Name\n");
5649
5650 hr = IXMLDOMComment_get_xml(pComment, &str);
5651 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5652 ok( !lstrcmpW( str, L"<!--A Comment-->" ), "incorrect comment xml\n");
5654
5655 /* put data Tests */
5656 hr = IXMLDOMComment_put_data(pComment, _bstr_("This &is a ; test <>\\"));
5657 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5658
5659 /* get data Tests */
5660 hr = IXMLDOMComment_get_data(pComment, &str);
5661 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5662 ok(!lstrcmpW(str, L"This &is a ; test <>\\"), "incorrect get_data string\n");
5664
5665 /* Confirm XML text is good */
5666 hr = IXMLDOMComment_get_xml(pComment, &str);
5667 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5668 ok(!lstrcmpW(str, L"<!--This &is a ; test <>\\-->"), "incorrect xml string\n");
5670
5671 /* Confirm we get the put_data Text back */
5672 hr = IXMLDOMComment_get_text(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 /* test length property */
5678 hr = IXMLDOMComment_get_length(pComment, &len);
5679 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5680 ok(len == 21, "expected 21 got %ld\n", len);
5681
5682 /* test substringData */
5683 hr = IXMLDOMComment_substringData(pComment, 0, 4, NULL);
5684 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5685
5686 /* test substringData - Invalid offset */
5687 str = (void *)0xdeadbeef;
5688 hr = IXMLDOMComment_substringData(pComment, -1, 4, &str);
5689 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5690 ok( str == NULL, "incorrect string\n");
5691
5692 /* test substringData - Invalid offset */
5693 str = (void *)0xdeadbeef;
5694 hr = IXMLDOMComment_substringData(pComment, 30, 0, &str);
5695 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
5696 ok( str == NULL, "incorrect string\n");
5697
5698 /* test substringData - Invalid size */
5699 str = (void *)0xdeadbeef;
5700 hr = IXMLDOMComment_substringData(pComment, 0, -1, &str);
5701 ok(hr == E_INVALIDARG, "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, 2, 0, &str);
5707 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
5708 ok( str == NULL, "incorrect string\n");
5709
5710 /* test substringData - Start of string */
5711 hr = IXMLDOMComment_substringData(pComment, 0, 4, &str);
5712 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5713 ok(!lstrcmpW(str, L"This"), "incorrect substringData string\n");
5715
5716 /* test substringData - Middle of string */
5717 hr = IXMLDOMComment_substringData(pComment, 13, 4, &str);
5718 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5719 ok(!lstrcmpW(str, L"test"), "incorrect substringData string\n");
5721
5722 /* test substringData - End of string */
5723 hr = IXMLDOMComment_substringData(pComment, 20, 4, &str);
5724 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5725 ok(!lstrcmpW(str, L"\\"), "incorrect substringData string\n");
5727
5728 /* test appendData */
5729 hr = IXMLDOMComment_appendData(pComment, NULL);
5730 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5731
5732 hr = IXMLDOMComment_appendData(pComment, _bstr_(""));
5733 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5734
5735 hr = IXMLDOMComment_appendData(pComment, _bstr_("Append"));
5736 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5737
5738 hr = IXMLDOMComment_get_text(pComment, &str);
5739 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5740 ok(!lstrcmpW(str, L"This &is a ; test <>\\Append"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
5742
5743 /* test insertData */
5745 hr = IXMLDOMComment_insertData(pComment, -1, str);
5746 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5747
5748 hr = IXMLDOMComment_insertData(pComment, -1, NULL);
5749 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5750
5751 hr = IXMLDOMComment_insertData(pComment, 1000, str);
5752 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5753
5754 hr = IXMLDOMComment_insertData(pComment, 1000, NULL);
5755 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5756
5757 hr = IXMLDOMComment_insertData(pComment, 0, NULL);
5758 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5759
5760 hr = IXMLDOMComment_insertData(pComment, 0, str);
5761 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5763
5764 hr = IXMLDOMComment_insertData(pComment, -1, _bstr_("Inserting"));
5765 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5766
5767 hr = IXMLDOMComment_insertData(pComment, 1000, _bstr_("Inserting"));
5768 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5769
5770 hr = IXMLDOMComment_insertData(pComment, 0, _bstr_("Begin "));
5771 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5772
5773 hr = IXMLDOMComment_insertData(pComment, 17, _bstr_("Middle"));
5774 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5775
5776 hr = IXMLDOMComment_insertData(pComment, 39, _bstr_(" End"));
5777 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5778
5779 hr = IXMLDOMComment_get_text(pComment, &str);
5780 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5781 ok(!lstrcmpW(str, L"Begin This &is a Middle; test <>\\Append End"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
5783
5784 /* delete data */
5785 /* invalid arguments */
5786 hr = IXMLDOMComment_deleteData(pComment, -1, 1);
5787 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5788
5789 hr = IXMLDOMComment_deleteData(pComment, 0, 0);
5790 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5791
5792 hr = IXMLDOMComment_deleteData(pComment, 0, -1);
5793 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5794
5795 hr = IXMLDOMComment_get_length(pComment, &len);
5796 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5797 ok(len == 43, "expected 43 got %ld\n", len);
5798
5799 hr = IXMLDOMComment_deleteData(pComment, len, 1);
5800 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5801
5802 hr = IXMLDOMComment_deleteData(pComment, len+1, 1);
5803 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5804
5805 /* delete from start */
5806 hr = IXMLDOMComment_deleteData(pComment, 0, 5);
5807 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5808
5809 hr = IXMLDOMComment_get_length(pComment, &len);
5810 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5811 ok(len == 38, "expected 38 got %ld\n", len);
5812
5813 hr = IXMLDOMComment_get_text(pComment, &str);
5814 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5815 ok(!lstrcmpW(str, L" This &is a Middle; test <>\\Append End"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
5817
5818 /* delete from end */
5819 hr = IXMLDOMComment_deleteData(pComment, 35, 3);
5820 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5821
5822 hr = IXMLDOMComment_get_length(pComment, &len);
5823 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5824 ok(len == 35, "expected 35 got %ld\n", len);
5825
5826 hr = IXMLDOMComment_get_text(pComment, &str);
5827 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5828 ok(!lstrcmpW(str, L" This &is a Middle; test <>\\Append "), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
5830
5831 /* delete from inside */
5832 hr = IXMLDOMComment_deleteData(pComment, 1, 33);
5833 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5834
5835 hr = IXMLDOMComment_get_length(pComment, &len);
5836 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5837 ok(len == 2, "expected 2 got %ld\n", len);
5838
5839 hr = IXMLDOMComment_get_text(pComment, &str);
5840 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5841 ok(!lstrcmpW(str, L" "), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
5843
5844 /* delete whole data ... */
5845 hr = IXMLDOMComment_get_length(pComment, &len);
5846 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5847
5848 hr = IXMLDOMComment_deleteData(pComment, 0, len);
5849 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5850 /* ... and try again with empty string */
5851 hr = IXMLDOMComment_deleteData(pComment, 0, len);
5852 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5853
5854 /* ::replaceData() */
5855 V_VT(&v) = VT_BSTR;
5856 V_BSTR(&v) = SysAllocString(L"str1");
5857 hr = IXMLDOMComment_put_nodeValue(pComment, v);
5858 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5859 VariantClear(&v);
5860
5861 hr = IXMLDOMComment_replaceData(pComment, 6, 0, NULL);
5862 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5863 hr = IXMLDOMComment_get_text(pComment, &str);
5864 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5865 ok(!lstrcmpW(str, L"str1"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
5867
5868 hr = IXMLDOMComment_replaceData(pComment, 0, 0, NULL);
5869 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5870 hr = IXMLDOMComment_get_text(pComment, &str);
5871 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5872 ok(!lstrcmpW(str, L"str1"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
5874
5875 /* NULL pointer means delete */
5876 hr = IXMLDOMComment_replaceData(pComment, 0, 1, NULL);
5877 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5878 hr = IXMLDOMComment_get_text(pComment, &str);
5879 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5880 ok(!lstrcmpW(str, L"tr1"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
5882
5883 /* empty string means delete */
5884 hr = IXMLDOMComment_replaceData(pComment, 0, 1, _bstr_(""));
5885 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5886 hr = IXMLDOMComment_get_text(pComment, &str);
5887 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5888 ok(!lstrcmpW(str, L"r1"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
5890
5891 /* zero count means insert */
5892 hr = IXMLDOMComment_replaceData(pComment, 0, 0, _bstr_("a"));
5893 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5894 hr = IXMLDOMComment_get_text(pComment, &str);
5895 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5896 ok(!lstrcmpW(str, L"ar1"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
5898
5899 hr = IXMLDOMComment_replaceData(pComment, 0, 2, NULL);
5900 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5901
5902 hr = IXMLDOMComment_insertData(pComment, 0, _bstr_("m"));
5903 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5904 hr = IXMLDOMComment_get_text(pComment, &str);
5905 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5906 ok(!lstrcmpW(str, L"m1"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
5908
5909 /* nonempty string, count greater than its length */
5910 hr = IXMLDOMComment_replaceData(pComment, 0, 2, _bstr_("a1.2"));
5911 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5912 hr = IXMLDOMComment_get_text(pComment, &str);
5913 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5914 ok(!lstrcmpW(str, L"a1.2"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
5916
5917 /* nonempty string, count less than its length */
5918 hr = IXMLDOMComment_replaceData(pComment, 0, 1, _bstr_("wine"));
5919 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5920 hr = IXMLDOMComment_get_text(pComment, &str);
5921 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5922 ok(!lstrcmpW(str, L"wine1.2"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
5924
5925 IXMLDOMComment_Release(pComment);
5926 }
5927
5928 /* Element */
5929 str = SysAllocString(L"EleTest");
5930 hr = IXMLDOMDocument_createElement(doc, str, &pElement);
5932 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5933 if(hr == S_OK)
5934 {
5935 hr = IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pElement, NULL);
5936 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5937
5938 hr = IXMLDOMElement_get_nodeName(pElement, &str);
5939 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5940 ok( !lstrcmpW( str, L"EleTest" ), "incorrect element node Name\n");
5942
5943 hr = IXMLDOMElement_get_xml(pElement, &str);
5944 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5945 ok( !lstrcmpW( str, L"<EleTest/>" ), "incorrect element xml\n");
5947
5948 /* Attribute */
5949 pAttribute = (IXMLDOMAttribute*)0x1;
5950 hr = IXMLDOMDocument_createAttribute(doc, NULL, &pAttribute);
5951 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5952 ok(pAttribute == (void*)0x1, "Expect same ptr, got %p\n", pAttribute);
5953
5954 pAttribute = (IXMLDOMAttribute*)0x1;
5955 hr = IXMLDOMDocument_createAttribute(doc, _bstr_(""), &pAttribute);
5956 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr );
5957 ok(pAttribute == (void*)0x1, "Expect same ptr, got %p\n", pAttribute);
5958
5959 str = SysAllocString(L"Attr");
5960 hr = IXMLDOMDocument_createAttribute(doc, str, &pAttribute);
5962 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5963 if(hr == S_OK)
5964 {
5965 IXMLDOMNode *pNewChild = (IXMLDOMNode *)0x1;
5966
5967 hr = IXMLDOMAttribute_get_nextSibling(pAttribute, NULL);
5968 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5969
5970 pNextChild = (IXMLDOMNode *)0x1;
5971 hr = IXMLDOMAttribute_get_nextSibling(pAttribute, &pNextChild);
5972 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
5973 ok(pNextChild == NULL, "pNextChild not NULL\n");
5974
5975 /* test Previous Sibling*/
5976 hr = IXMLDOMAttribute_get_previousSibling(pAttribute, NULL);
5977 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
5978
5979 pNextChild = (IXMLDOMNode *)0x1;
5980 hr = IXMLDOMAttribute_get_previousSibling(pAttribute, &pNextChild);
5981 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
5982 ok(pNextChild == NULL, "pNextChild not NULL\n");
5983
5984 hr = IXMLDOMElement_appendChild(pElement, (IXMLDOMNode*)pAttribute, &pNewChild);
5985 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr );
5986 ok(pNewChild == NULL, "pNewChild not NULL\n");
5987
5988 hr = IXMLDOMElement_get_attributes(pElement, &pAttribs);
5989 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5990 if ( hr == S_OK )
5991 {
5992 hr = IXMLDOMNamedNodeMap_setNamedItem(pAttribs, (IXMLDOMNode*)pAttribute, NULL );
5993 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
5994
5995 IXMLDOMNamedNodeMap_Release(pAttribs);
5996 }
5997
5998 hr = IXMLDOMAttribute_get_nodeName(pAttribute, &str);
5999 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6000 ok( !lstrcmpW( str, L"Attr" ), "incorrect attribute node Name\n");
6002
6003 /* test nodeName */
6004 hr = IXMLDOMAttribute_get_nodeName(pAttribute, &str);
6005 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6006 ok( !lstrcmpW( str, L"Attr" ), "incorrect nodeName string\n");
6008
6009 /* test name property */
6010 hr = IXMLDOMAttribute_get_name(pAttribute, &str);
6011 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6012 ok( !lstrcmpW( str, L"Attr" ), "incorrect name string\n");
6014
6015 hr = IXMLDOMAttribute_get_xml(pAttribute, &str);
6016 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6017 ok( !lstrcmpW( str, L"Attr=\"\"" ), "incorrect attribute xml\n");
6019
6020 IXMLDOMAttribute_Release(pAttribute);
6021
6022 /* Check Element again with the Add Attribute*/
6023 hr = IXMLDOMElement_get_xml(pElement, &str);
6024 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6025 ok( !lstrcmpW( str, L"<EleTest Attr=\"\"/>" ), "incorrect element xml\n");
6027 }
6028
6029 hr = IXMLDOMElement_put_text(pElement, _bstr_("TestingNode"));
6030 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6031
6032 hr = IXMLDOMElement_get_xml(pElement, &str);
6033 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6034 ok( !lstrcmpW( str, L"<EleTest Attr=\"\">TestingNode</EleTest>" ), "incorrect element xml\n");
6036
6037 /* Test for reversible escaping */
6039 hr = IXMLDOMElement_put_text(pElement, str);
6040 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6041 SysFreeString( str );
6042
6043 hr = IXMLDOMElement_get_xml(pElement, &str);
6044 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6045 ok( !lstrcmpW( str, L"<EleTest Attr=\"\">&amp;x \x2103</EleTest>" ), "incorrect element xml\n");
6047
6048 hr = IXMLDOMElement_get_text(pElement, &str);
6049 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6050 ok( !lstrcmpW( str, szStrangeChars ), "incorrect element text\n");
6052
6053 IXMLDOMElement_Release(pElement);
6054 }
6055
6056 /* CData Section */
6057 str = SysAllocString(L"[1]*2=3; &gee that is not right!");
6058 hr = IXMLDOMDocument_createCDATASection(doc, str, NULL);
6059 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
6060
6061 hr = IXMLDOMDocument_createCDATASection(doc, str, &pCDataSec);
6063 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6064 if(hr == S_OK)
6065 {
6066 IXMLDOMNode *pNextChild = (IXMLDOMNode *)0x1;
6067 VARIANT var;
6068
6069 VariantInit(&var);
6070
6071 hr = IXMLDOMCDATASection_QueryInterface(pCDataSec, &IID_IXMLDOMElement, (void**)&pElement);
6072 ok(hr == E_NOINTERFACE, "Unexpected hr %#lx.\n", hr);
6073
6074 hr = IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pCDataSec, NULL);
6075 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6076
6077 hr = IXMLDOMCDATASection_get_nodeName(pCDataSec, &str);
6078 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6079 ok( !lstrcmpW( str, L"#cdata-section" ), "incorrect cdata node Name\n");
6081
6082 hr = IXMLDOMCDATASection_get_xml(pCDataSec, &str);
6083 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6084 ok( !lstrcmpW( str, L"<![CDATA[[1]*2=3; &gee that is not right!]]>" ), "incorrect cdata xml\n");
6086
6087 /* test lastChild */
6088 pNextChild = (IXMLDOMNode*)0x1;
6089 hr = IXMLDOMCDATASection_get_lastChild(pCDataSec, &pNextChild);
6090 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
6091 ok(pNextChild == NULL, "pNextChild not NULL\n");
6092
6093 /* put data Tests */
6094 hr = IXMLDOMCDATASection_put_data(pCDataSec, _bstr_("This &is a ; test <>\\"));
6095 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6096
6097 /* Confirm XML text is good */
6098 hr = IXMLDOMCDATASection_get_xml(pCDataSec, &str);
6099 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6100 ok(!lstrcmpW(str, L"<![CDATA[This &is a ; test <>\\]]>"), "incorrect xml string\n");
6102
6103 /* Confirm we get the put_data Text back */
6104 hr = IXMLDOMCDATASection_get_text(pCDataSec, &str);
6105 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6106 ok(!lstrcmpW(str, L"This &is a ; test <>\\"), "incorrect text string\n");
6108
6109 /* test length property */
6110 hr = IXMLDOMCDATASection_get_length(pCDataSec, &len);
6111 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6112 ok(len == 21, "expected 21 got %ld\n", len);
6113
6114 /* test get data */
6115 hr = IXMLDOMCDATASection_get_data(pCDataSec, &str);
6116 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6117 ok(!lstrcmpW(str, L"This &is a ; test <>\\"), "incorrect text string\n");
6119
6120 /* test substringData */
6121 hr = IXMLDOMCDATASection_substringData(pCDataSec, 0, 4, NULL);
6122 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
6123
6124 /* test substringData - Invalid offset */
6125 str = (void *)0xdeadbeef;
6126 hr = IXMLDOMCDATASection_substringData(pCDataSec, -1, 4, &str);
6127 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
6128 ok( str == NULL, "incorrect string\n");
6129
6130 /* test substringData - Invalid offset */
6131 str = (void *)0xdeadbeef;
6132 hr = IXMLDOMCDATASection_substringData(pCDataSec, 30, 0, &str);
6133 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
6134 ok( str == NULL, "incorrect string\n");
6135
6136 /* test substringData - Invalid size */
6137 str = (void *)0xdeadbeef;
6138 hr = IXMLDOMCDATASection_substringData(pCDataSec, 0, -1, &str);
6139 ok(hr == E_INVALIDARG, "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, 2, 0, &str);
6145 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
6146 ok( str == NULL, "incorrect string\n");
6147
6148 /* test substringData - Start of string */
6149 hr = IXMLDOMCDATASection_substringData(pCDataSec, 0, 4, &str);
6150 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6151 ok(!lstrcmpW(str, L"This"), "incorrect substringData string\n");
6153
6154 /* test substringData - Middle of string */
6155 hr = IXMLDOMCDATASection_substringData(pCDataSec, 13, 4, &str);
6156 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6157 ok(!lstrcmpW(str, L"test"), "incorrect substringData string\n");
6159
6160 /* test substringData - End of string */
6161 hr = IXMLDOMCDATASection_substringData(pCDataSec, 20, 4, &str);
6162 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6163 ok(!lstrcmpW(str, L"\\"), "incorrect substringData string\n");
6165
6166 /* test appendData */
6167 hr = IXMLDOMCDATASection_appendData(pCDataSec, NULL);
6168 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6169
6170 hr = IXMLDOMCDATASection_appendData(pCDataSec, _bstr_(""));
6171 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6172
6173 hr = IXMLDOMCDATASection_appendData(pCDataSec, _bstr_("Append"));
6174 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6175
6176 hr = IXMLDOMCDATASection_get_text(pCDataSec, &str);
6177 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6178 ok(!lstrcmpW(str, L"This &is a ; test <>\\Append"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
6180
6181 /* test insertData */
6183 hr = IXMLDOMCDATASection_insertData(pCDataSec, -1, str);
6184 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6185
6186 hr = IXMLDOMCDATASection_insertData(pCDataSec, -1, NULL);
6187 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6188
6189 hr = IXMLDOMCDATASection_insertData(pCDataSec, 1000, str);
6190 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6191
6192 hr = IXMLDOMCDATASection_insertData(pCDataSec, 1000, NULL);
6193 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6194
6195 hr = IXMLDOMCDATASection_insertData(pCDataSec, 0, NULL);
6196 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6197
6198 hr = IXMLDOMCDATASection_insertData(pCDataSec, 0, str);
6199 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6201
6202 hr = IXMLDOMCDATASection_insertData(pCDataSec, -1, _bstr_("Inserting"));
6203 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
6204
6205 hr = IXMLDOMCDATASection_insertData(pCDataSec, 1000, _bstr_("Inserting"));
6206 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
6207
6208 hr = IXMLDOMCDATASection_insertData(pCDataSec, 0, _bstr_("Begin "));
6209 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6210
6211 hr = IXMLDOMCDATASection_insertData(pCDataSec, 17, _bstr_("Middle"));
6212 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6213
6214 hr = IXMLDOMCDATASection_insertData(pCDataSec, 39, _bstr_(" End"));
6215 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6216
6217 hr = IXMLDOMCDATASection_get_text(pCDataSec, &str);
6218 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6219 ok(!lstrcmpW(str, L"Begin This &is a Middle; test <>\\Append End"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
6221
6222 /* delete data */
6223 /* invalid arguments */
6224 hr = IXMLDOMCDATASection_deleteData(pCDataSec, -1, 1);
6225 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
6226
6227 hr = IXMLDOMCDATASection_deleteData(pCDataSec, 0, 0);
6228 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6229
6230 hr = IXMLDOMCDATASection_deleteData(pCDataSec, 0, -1);
6231 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
6232
6233 hr = IXMLDOMCDATASection_get_length(pCDataSec, &len);
6234 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6235 ok(len == 43, "expected 43 got %ld\n", len);
6236
6237 hr = IXMLDOMCDATASection_deleteData(pCDataSec, len, 1);
6238 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6239
6240 hr = IXMLDOMCDATASection_deleteData(pCDataSec, len+1, 1);
6241 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
6242
6243 /* delete from start */
6244 hr = IXMLDOMCDATASection_deleteData(pCDataSec, 0, 5);
6245 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6246
6247 hr = IXMLDOMCDATASection_get_length(pCDataSec, &len);
6248 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6249 ok(len == 38, "expected 38 got %ld\n", len);
6250
6251 hr = IXMLDOMCDATASection_get_text(pCDataSec, &str);
6252 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6253 ok(!lstrcmpW(str, L" This &is a Middle; test <>\\Append End"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
6255
6256 /* delete from end */
6257 hr = IXMLDOMCDATASection_deleteData(pCDataSec, 35, 3);
6258 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6259
6260 hr = IXMLDOMCDATASection_get_length(pCDataSec, &len);
6261 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6262 ok(len == 35, "expected 35 got %ld\n", len);
6263
6264 hr = IXMLDOMCDATASection_get_text(pCDataSec, &str);
6265 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6266 ok(!lstrcmpW(str, L" This &is a Middle; test <>\\Append "), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
6268
6269 /* delete from inside */
6270 hr = IXMLDOMCDATASection_deleteData(pCDataSec, 1, 33);
6271 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6272
6273 hr = IXMLDOMCDATASection_get_length(pCDataSec, &len);
6274 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6275 ok(len == 2, "expected 2 got %ld\n", len);
6276
6277 hr = IXMLDOMCDATASection_get_text(pCDataSec, &str);
6278 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6279 ok(!lstrcmpW(str, L" "), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
6281
6282 /* delete whole data ... */
6283 hr = IXMLDOMCDATASection_get_length(pCDataSec, &len);
6284 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6285
6286 hr = IXMLDOMCDATASection_deleteData(pCDataSec, 0, len);
6287 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6288
6289 /* ... and try again with empty string */
6290 hr = IXMLDOMCDATASection_deleteData(pCDataSec, 0, len);
6291 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6292
6293 /* ::replaceData() */
6294 V_VT(&v) = VT_BSTR;
6295 V_BSTR(&v) = SysAllocString(L"str1");
6296 hr = IXMLDOMCDATASection_put_nodeValue(pCDataSec, v);
6297 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6298 VariantClear(&v);
6299
6300 hr = IXMLDOMCDATASection_replaceData(pCDataSec, 6, 0, NULL);
6301 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
6302 hr = IXMLDOMCDATASection_get_text(pCDataSec, &str);
6303 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6304 ok(!lstrcmpW(str, L"str1"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
6306
6307 hr = IXMLDOMCDATASection_replaceData(pCDataSec, 0, 0, NULL);
6308 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6309 hr = IXMLDOMCDATASection_get_text(pCDataSec, &str);
6310 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6311 ok(!lstrcmpW(str, L"str1"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
6313
6314 /* NULL pointer means delete */
6315 hr = IXMLDOMCDATASection_replaceData(pCDataSec, 0, 1, NULL);
6316 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6317 hr = IXMLDOMCDATASection_get_text(pCDataSec, &str);
6318 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6319 ok(!lstrcmpW(str, L"tr1"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
6321
6322 /* empty string means delete */
6323 hr = IXMLDOMCDATASection_replaceData(pCDataSec, 0, 1, _bstr_(""));
6324 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6325 hr = IXMLDOMCDATASection_get_text(pCDataSec, &str);
6326 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6327 ok(!lstrcmpW(str, L"r1"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
6329
6330 /* zero count means insert */
6331 hr = IXMLDOMCDATASection_replaceData(pCDataSec, 0, 0, _bstr_("a"));
6332 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6333 hr = IXMLDOMCDATASection_get_text(pCDataSec, &str);
6334 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6335 ok(!lstrcmpW(str, L"ar1"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
6337
6338 hr = IXMLDOMCDATASection_replaceData(pCDataSec, 0, 2, NULL);
6339 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6340
6341 hr = IXMLDOMCDATASection_insertData(pCDataSec, 0, _bstr_("m"));
6342 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6343 hr = IXMLDOMCDATASection_get_text(pCDataSec, &str);
6344 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6345 ok(!lstrcmpW(str, L"m1"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
6347
6348 /* nonempty string, count greater than its length */
6349 hr = IXMLDOMCDATASection_replaceData(pCDataSec, 0, 2, _bstr_("a1.2"));
6350 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6351 hr = IXMLDOMCDATASection_get_text(pCDataSec, &str);
6352 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6353 ok(!lstrcmpW(str, L"a1.2"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
6355
6356 /* nonempty string, count less than its length */
6357 hr = IXMLDOMCDATASection_replaceData(pCDataSec, 0, 1, _bstr_("wine"));
6358 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6359 hr = IXMLDOMCDATASection_get_text(pCDataSec, &str);
6360 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6361 ok(!lstrcmpW(str, L"wine1.2"), "incorrect get_text string, got '%s'\n", wine_dbgstr_w(str));
6363
6364 IXMLDOMCDATASection_Release(pCDataSec);
6365 }
6366
6367 /* Document Fragments */
6368 hr = IXMLDOMDocument_createDocumentFragment(doc, NULL);
6369 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
6370
6371 hr = IXMLDOMDocument_createDocumentFragment(doc, &pDocFrag);
6372 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6373 if(hr == S_OK)
6374 {
6376
6377 hr = IXMLDOMDocumentFragment_get_parentNode(pDocFrag, NULL);
6378 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
6379
6380 node = (IXMLDOMNode *)0x1;
6381 hr = IXMLDOMDocumentFragment_get_parentNode(pDocFrag, &node);
6382 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
6383 ok(node == NULL, "expected NULL, got %p\n", node);
6384
6385 hr = IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pDocFrag, NULL);
6386 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6387
6388 hr = IXMLDOMDocumentFragment_get_nodeName(pDocFrag, &str);
6389 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6390 ok( !lstrcmpW( str, L"#document-fragment" ), "incorrect docfragment node Name\n");
6392
6393 /* test next Sibling*/
6394 hr = IXMLDOMDocumentFragment_get_nextSibling(pDocFrag, NULL);
6395 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
6396
6397 node = (IXMLDOMNode *)0x1;
6398 hr = IXMLDOMDocumentFragment_get_nextSibling(pDocFrag, &node);
6399 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
6400 ok(node == NULL, "next sibling not NULL\n");
6401
6402 /* test Previous Sibling*/
6403 hr = IXMLDOMDocumentFragment_get_previousSibling(pDocFrag, NULL);
6404 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
6405
6406 node = (IXMLDOMNode *)0x1;
6407 hr = IXMLDOMDocumentFragment_get_previousSibling(pDocFrag, &node);
6408 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
6409 ok(node == NULL, "previous sibling not NULL\n");
6410
6411 IXMLDOMDocumentFragment_Release(pDocFrag);
6412 }
6413
6414 /* Entity References */
6415 hr = IXMLDOMDocument_createEntityReference(doc, NULL, &pEntityRef);
6416 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr );
6417 hr = IXMLDOMDocument_createEntityReference(doc, _bstr_(""), &pEntityRef);
6418 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr );
6419
6420 str = SysAllocString(L"entityref");
6421 hr = IXMLDOMDocument_createEntityReference(doc, str, NULL);
6422 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
6423
6424 hr = IXMLDOMDocument_createEntityReference(doc, str, &pEntityRef);
6426 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6427 if(hr == S_OK)
6428 {
6429 hr = IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pEntityRef, NULL);
6430 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6431
6432 /* test get_xml*/
6433 hr = IXMLDOMEntityReference_get_xml(pEntityRef, &str);
6434 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6435 ok( !lstrcmpW( str, L"&entityref;" ), "incorrect xml string\n");
6437
6438 IXMLDOMEntityReference_Release(pEntityRef);
6439 }
6440
6441 IXMLDOMElement_Release( pRoot );
6442 }
6443 }
6444
6445 IXMLDOMDocument_Release(doc);
6446
6447 free_bstrs();
6448}
6449
6450typedef struct {
6451 const char *name;
6452 const char *type;
6455
6456/* Type test for elements only. Name passed into put_dataType is case-insensitive.
6457 So many of the names have been changed to reflect this. */
6459 { "test_inval", "abcdefg", E_FAIL },
6460 { "test_bool", "Boolean", S_OK },
6461 { "test_string", "String", S_OK },
6462 { "test_number", "number", S_OK },
6463 { "test_int", "InT", S_OK },
6464 { "test_fixed", "fixed.14.4", S_OK },
6465 { "test_datetime", "DateTime", S_OK },
6466 { "test_datetimetz", "DateTime.tz", S_OK },
6467 { "test_date", "Date", S_OK },
6468 { "test_time", "Time", S_OK },
6469 { "test_timetz", "Time.tz", S_OK },
6470 { "test_I1", "I1", S_OK },
6471 { "test_I2", "I2", S_OK },
6472 { "test_I4", "I4", S_OK },
6473 { "test_UI1", "UI1", S_OK },
6474 { "test_UI2", "UI2", S_OK },
6475 { "test_UI4", "UI4", S_OK },
6476 { "test_r4", "r4", S_OK },
6477 { "test_r8", "r8", S_OK },
6478 { "test_float", "float", S_OK },
6479 { "test_uuid", "UuId", S_OK },
6480 { "test_binhex", "bin.hex", S_OK },
6481 { "test_binbase64", "bin.base64", S_OK },
6482 { NULL }
6483};
6484
6485typedef struct {
6489
6495 { NODE_COMMENT, E_FAIL },
6496 { NODE_INVALID }
6497};
6498
6499static void test_put_dataType( void )
6500{
6504 BSTR nameW, type1W, type2W;
6505 IXMLDOMDocument *doc;
6506 HRESULT hr;
6507
6508 doc = create_document(&IID_IXMLDOMDocument);
6509
6510 hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing"), NULL);
6511 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
6512
6513 hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing"), &root);
6514 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6515
6516 hr = IXMLDOMDocument_appendChild(doc, (IXMLDOMNode*)root, NULL);
6517 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6518
6519 hr = IXMLDOMElement_put_dataType(root, NULL);
6520 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
6521
6522 while (ptr->name)
6523 {
6524 hr = IXMLDOMDocument_createElement(doc, _bstr_(ptr->name), &element);
6525 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6526 if(hr == S_OK)
6527 {
6528 hr = IXMLDOMElement_appendChild(root, (IXMLDOMNode*)element, NULL);
6529 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6530
6531 hr = IXMLDOMElement_put_dataType(element, _bstr_(ptr->type));
6532 ok(hr == ptr->hr, "failed for %s:%s, %#lx.\n", ptr->name, ptr->type, ptr->hr);
6533
6534 IXMLDOMElement_Release(element);
6535 }
6536 ptr++;
6537 }
6538
6539 /* check changing types */
6540 hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing_Change"), &element);
6541 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6542
6543 hr = IXMLDOMElement_appendChild(root, (IXMLDOMNode*)element, NULL);
6544 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6545
6546 hr = IXMLDOMElement_put_dataType(element, _bstr_("DateTime.tz"));
6547 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6548
6549 hr = IXMLDOMElement_put_dataType(element, _bstr_("string"));
6550 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6551
6552 IXMLDOMElement_Release(element);
6553
6554 /* try to set type for node without a type */
6555 nameW = _bstr_("testname");
6556 type1W = _bstr_("string");
6557 type2W = _bstr_("number");
6558 while (ptr2->type != NODE_INVALID)
6559 {
6561 VARIANT type;
6562
6563 V_VT(&type) = VT_I2;
6564 V_I2(&type) = ptr2->type;
6565
6566 hr = IXMLDOMDocument_createNode(doc, type, nameW, NULL, &node);
6567 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6568 if(hr == S_OK)
6569 {
6570 hr = IXMLDOMElement_appendChild(root, node, NULL);
6571 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6572
6573 hr = IXMLDOMNode_put_dataType(node, NULL);
6574 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
6575
6576 hr = IXMLDOMNode_put_dataType(node, type1W);
6577 ok(hr == ptr2->hr, "failed for type %d, %#lx\n", ptr2->type, ptr->hr);
6578 hr = IXMLDOMNode_put_dataType(node, type2W);
6579 ok(hr == ptr2->hr, "failed for type %d, %#lx\n", ptr2->type, ptr->hr);
6580
6581 IXMLDOMNode_Release(node);
6582 }
6583 ptr2++;
6584 }
6585
6586 IXMLDOMElement_Release(root);
6587 IXMLDOMDocument_Release(doc);
6588 free_bstrs();
6589}
6590
6591static void test_save(void)
6592{
6593 static const char cheA[] = "<Testing che=\"\xd0\xa7\"/>";
6594 IXMLDOMDocument *doc, *doc2;
6597 BSTR sOrig, sNew, filename;
6598 char buffer[100];
6599 IStream *stream;
6602 DWORD read = 0;
6603 VARIANT v, dest;
6604 HANDLE hfile;
6605 HRESULT hr;
6606 char *ptr;
6607
6608 doc = create_document(&IID_IXMLDOMDocument);
6609 doc2 = create_document(&IID_IXMLDOMDocument);
6610
6611 /* save to IXMLDOMDocument */
6612 hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing"), &root);
6613 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6614
6615 hr = IXMLDOMDocument_appendChild(doc, (IXMLDOMNode*)root, NULL);
6616 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6617
6618 V_VT(&dest) = VT_UNKNOWN;
6619 V_UNKNOWN(&dest) = (IUnknown*)doc2;
6620
6621 hr = IXMLDOMDocument_save(doc, dest);
6622 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6623
6624 hr = IXMLDOMDocument_get_xml(doc, &sOrig);
6625 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6626
6627 hr = IXMLDOMDocument_get_xml(doc2, &sNew);
6628 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6629
6630 ok( !lstrcmpW( sOrig, sNew ), "New document is not the same as original\n");
6631
6632 SysFreeString(sOrig);
6633 SysFreeString(sNew);
6634
6635 IXMLDOMElement_Release(root);
6636 IXMLDOMDocument_Release(doc2);
6637
6638 /* save to path */
6639 V_VT(&dest) = VT_BSTR;
6640 V_BSTR(&dest) = _bstr_("test.xml");
6641
6642 hr = IXMLDOMDocument_save(doc, dest);
6643 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6644
6646 ok(hfile != INVALID_HANDLE_VALUE, "Could not open file: %lu\n", GetLastError());
6647 if(hfile == INVALID_HANDLE_VALUE) return;
6648
6649 ReadFile(hfile, buffer, sizeof(buffer), &read, NULL);
6650 ok(read != 0, "could not read file\n");
6651 ok(buffer[0] != '<' || buffer[1] != '?', "File contains processing instruction\n");
6652
6653 CloseHandle(hfile);
6654 DeleteFileA("test.xml");
6655
6656 /* save to path VT_BSTR | VT_BYREF */
6657 filename = _bstr_("test.xml");
6658 V_VT(&dest) = VT_BSTR | VT_BYREF;
6659 V_BSTRREF(&dest) = &filename;
6660
6661 hr = IXMLDOMDocument_save(doc, dest);
6662 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6663
6665 ok(hfile != INVALID_HANDLE_VALUE, "Could not open file: %lu\n", GetLastError());
6666 if(hfile == INVALID_HANDLE_VALUE) return;
6667
6668 if (hfile != INVALID_HANDLE_VALUE)
6669 {
6670 ReadFile(hfile, buffer, sizeof(buffer), &read, NULL);
6671 ok(read != 0, "could not read file\n");
6672 ok(buffer[0] != '<' || buffer[1] != '?', "File contains processing instruction\n");
6673
6674 CloseHandle(hfile);
6675 DeleteFileA("test.xml");
6676 }
6677
6678 /* save to stream */
6679 V_VT(&dest) = VT_UNKNOWN;
6681
6682 hr = IXMLDOMDocument_save(doc, dest);
6683 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6684
6685 /* loaded data contains xml declaration */
6686 hr = IXMLDOMDocument_loadXML(doc, _bstr_(win1252xml), &b);
6687 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6688
6690 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6691 V_VT(&dest) = VT_UNKNOWN;
6693 hr = IXMLDOMDocument_save(doc, dest);
6694 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6695
6697 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6699 ok(!memcmp(ptr, win1252decl, strlen(win1252decl)), "got wrong xml declaration\n");
6701 IStream_Release(stream);
6702
6703 /* loaded data without xml declaration */
6704 hr = IXMLDOMDocument_loadXML(doc, _bstr_("<a/>"), &b);
6705 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6706
6708 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6709 V_VT(&dest) = VT_UNKNOWN;
6711 hr = IXMLDOMDocument_save(doc, dest);
6712 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6713
6715 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6717 ok(ptr[0] == '<' && ptr[1] != '?', "got wrong start tag %c%c\n", ptr[0], ptr[1]);
6719 IStream_Release(stream);
6720
6721 IXMLDOMDocument_Release(doc);
6722
6723 /* test default encoding with non-english characters */
6724 doc = create_document(&IID_IXMLDOMDocument);
6725
6726 hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing"), &root);
6727 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6728
6729 hr = IXMLDOMDocument_appendChild(doc, (IXMLDOMNode*)root, NULL);
6730 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6731
6732 hr = IXMLDOMDocument_createAttribute(doc, _bstr_("che"), &attr);
6733 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6734
6735 V_VT(&v) = VT_BSTR;
6736 V_BSTR(&v) = SysAllocString(L"\x0427");
6737 hr = IXMLDOMAttribute_put_value(attr, v);
6738 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6739 VariantClear(&v);
6740
6741 hr = IXMLDOMElement_setAttributeNode(root, attr, NULL);
6742 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6743
6744 V_VT(&dest) = VT_BSTR;
6745 V_BSTR(&dest) = _bstr_("test.xml");
6746
6747 hr = IXMLDOMDocument_save(doc, dest);
6748 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6749
6751 ok(hfile != INVALID_HANDLE_VALUE, "Could not open file: %lu\n", GetLastError());
6752 if (hfile != INVALID_HANDLE_VALUE)
6753 {
6754 ReadFile(hfile, buffer, sizeof(buffer), &read, NULL);
6755 ok(read != 0, "could not read file\n");
6756 ok(!memcmp(buffer, cheA, sizeof(cheA)-1), "got: %s\n", buffer);
6757
6758 CloseHandle(hfile);
6759 DeleteFileA("test.xml");
6760 }
6761
6762 IXMLDOMAttribute_Release(attr);
6763 IXMLDOMElement_Release(root);
6764 IXMLDOMDocument_Release(doc);
6765
6766 free_bstrs();
6767}
6768
6769static void test_testTransforms(void)
6770{
6771 IXMLDOMDocument *doc, *docSS;
6772 IXMLDOMNode *pNode;
6773 VARIANT_BOOL bSucc;
6774 HRESULT hr;
6775
6776 doc = create_document(&IID_IXMLDOMDocument);
6777 docSS = create_document(&IID_IXMLDOMDocument);
6778
6779 hr = IXMLDOMDocument_loadXML(doc, _bstr_(szTransformXML), &bSucc);
6780 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6781
6782 hr = IXMLDOMDocument_loadXML(docSS, _bstr_(szTransformSSXML), &bSucc);
6783 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6784
6785 hr = IXMLDOMDocument_QueryInterface(docSS, &IID_IXMLDOMNode, (void**)&pNode );
6786 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6787 if(hr == S_OK)
6788 {
6789 BSTR bOut;
6790
6791 hr = IXMLDOMDocument_transformNode(doc, pNode, &bOut);
6792 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6793 if(hr == S_OK)
6794 {
6795 ok( compareIgnoreReturns( bOut, _bstr_(szTransformOutput)), "got output %s\n", wine_dbgstr_w(bOut));
6796 SysFreeString(bOut);
6797 }
6798
6799 IXMLDOMNode_Release(pNode);
6800 }
6801
6802 IXMLDOMDocument_Release(docSS);
6803 IXMLDOMDocument_Release(doc);
6804
6805 free_bstrs();
6806}
6807
6809 const CLSID *clsid;
6810 const char *name;
6811};
6812
6814 { &CLSID_DOMDocument, "CLSID_DOMDocument" },
6815 { &CLSID_DOMDocument2, "CLSID_DOMDocument2" },
6816 { &CLSID_DOMDocument26, "CLSID_DOMDocument26" },
6817 { &CLSID_DOMDocument30, "CLSID_DOMDocument30" },
6818 { &CLSID_DOMDocument40, "CLSID_DOMDocument40" },
6819 { &CLSID_DOMDocument60, "CLSID_DOMDocument60" },
6820 { 0 }
6821};
6822
6823static void test_namespaces_change(void)
6824{
6825 const struct namespaces_change_t *class_ptr = namespaces_change_test_data;
6826
6827 while (class_ptr->clsid)
6828 {
6829 IXMLDOMDocument *doc = NULL;
6832
6833 VARIANT var;
6834 HRESULT hr;
6835 BSTR str;
6836
6837 if (!is_clsid_supported(class_ptr->clsid, &IID_IXMLDOMDocument))
6838 {
6839 class_ptr++;
6840 continue;
6841 }
6842
6843 hr = CoCreateInstance(class_ptr->clsid, NULL, CLSCTX_INPROC_SERVER,
6844 &IID_IXMLDOMDocument, (void**)&doc);
6845 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6846
6847 V_VT(&var) = VT_I2;
6848 V_I2(&var) = NODE_ELEMENT;
6849
6850 hr = IXMLDOMDocument_createNode(doc, var, _bstr_("ns:elem"), _bstr_("ns/uri"), &node);
6851 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6852
6853 hr = IXMLDOMDocument_appendChild(doc, node, NULL);
6854 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6855
6856 hr = IXMLDOMDocument_get_documentElement(doc, &elem);
6857 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6858
6859 /* try same prefix, different uri */
6860 V_VT(&var) = VT_BSTR;
6861 V_BSTR(&var) = _bstr_("ns/uri2");
6862
6863 hr = IXMLDOMElement_setAttribute(elem, _bstr_("xmlns:ns"), var);
6864 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
6865
6866 /* try same prefix and uri */
6867 V_VT(&var) = VT_BSTR;
6868 V_BSTR(&var) = _bstr_("ns/uri");
6869
6870 hr = IXMLDOMElement_setAttribute(elem, _bstr_("xmlns:ns"), var);
6871 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6872
6873 hr = IXMLDOMElement_get_xml(elem, &str);
6874 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6875 ok(!lstrcmpW(str, L"<ns:elem xmlns:ns=\"ns/uri\"/>"), "got element %s for %s\n",
6876 wine_dbgstr_w(str), class_ptr->name);
6878
6879 IXMLDOMElement_Release(elem);
6880 IXMLDOMDocument_Release(doc);
6881
6882 free_bstrs();
6883
6884 class_ptr++;
6885 }
6886}
6887
6888static void test_namespaces_basic(void)
6889{
6890 static const CHAR namespaces_xmlA[] =
6891 "<?xml version=\"1.0\"?>\n"
6892 "<XMI xmi.version=\"1.1\" xmlns:Model=\"http://omg.org/mof.Model/1.3\">"
6893 " <XMI.content>"
6894 " <Model:Package name=\"WinePackage\" Model:name2=\"name2 attr\" />"
6895 " </XMI.content>"
6896 "</XMI>";
6897
6898 IXMLDOMDocument *doc;
6901
6903 HRESULT hr;
6904 BSTR str;
6905
6906 doc = create_document(&IID_IXMLDOMDocument);
6907
6908 hr = IXMLDOMDocument_loadXML(doc, _bstr_(namespaces_xmlA), &b);
6909 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6910 ok(b == VARIANT_TRUE, "got %d\n", b);
6911
6912 str = (void *)0xdeadbeef;
6913 hr = IXMLDOMDocument_get_namespaceURI(doc, &str);
6914 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
6915 ok(str == NULL, "got %p\n", str);
6916
6917 hr = IXMLDOMDocument_selectSingleNode(doc, _bstr_("//XMI.content"), &node );
6918 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6919 if(hr == S_OK)
6920 {
6922 IXMLDOMNode *node2;
6923
6924 hr = IXMLDOMNode_get_firstChild(node, &node2);
6925 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6926 ok(node2 != NULL, "got %p\n", node2);
6927
6928 /* Test get_prefix */
6929 hr = IXMLDOMNode_get_prefix(node2, NULL);
6930 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
6931 /* NOTE: Need to test that arg2 gets cleared on Error. */
6932
6933 hr = IXMLDOMNode_get_prefix(node2, &str);
6934 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6935 ok(!lstrcmpW(str, L"Model"), "got %s\n", wine_dbgstr_w(str));
6937
6938 hr = IXMLDOMNode_get_nodeName(node2, &str);
6939 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6940 ok(!lstrcmpW(str, L"Model:Package"), "got %s\n", wine_dbgstr_w(str));
6942
6943 /* Test get_namespaceURI */
6944 hr = IXMLDOMNode_get_namespaceURI(node2, NULL);
6945 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
6946 /* NOTE: Need to test that arg2 gets cleared on Error. */
6947
6948 hr = IXMLDOMNode_get_namespaceURI(node2, &str);
6949 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6950 ok(!lstrcmpW(str, L"http://omg.org/mof.Model/1.3"), "got %s\n", wine_dbgstr_w(str));
6952
6953 hr = IXMLDOMNode_QueryInterface(node2, &IID_IXMLDOMElement, (void**)&elem);
6954 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6955
6956 hr = IXMLDOMElement_getAttributeNode(elem, _bstr_("Model:name2"), &attr);
6957 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6958
6959 hr = IXMLDOMAttribute_get_nodeName(attr, &str);
6960 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6961 ok(!lstrcmpW(str, L"Model:name2"), "got %s\n", wine_dbgstr_w(str));
6963
6964 hr = IXMLDOMAttribute_get_prefix(attr, &str);
6965 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
6966 ok(!lstrcmpW(str, L"Model"), "got %s\n", wine_dbgstr_w(str));
6968
6969 IXMLDOMAttribute_Release(attr);
6970 IXMLDOMElement_Release(elem);
6971
6972 IXMLDOMNode_Release(node2);
6973 IXMLDOMNode_Release(node);
6974 }
6975
6976 IXMLDOMDocument_Release(doc);
6977
6978 free_bstrs();
6979}
6980
6981static void test_FormattingXML(void)
6982{
6983 IXMLDOMDocument *doc;
6984 IXMLDOMElement *pElement;
6985 VARIANT_BOOL bSucc;
6986 HRESULT hr;
6987 BSTR str;
6988 static const CHAR szLinefeedXML[] = "<?xml version=\"1.0\"?>\n<Root>\n\t<Sub val=\"A\" />\n</Root>";
6989 static const CHAR szLinefeedRootXML[] = "<Root>\r\n\t<Sub val=\"A\"/>\r\n</Root>";
6990
6991 doc = create_document(&IID_IXMLDOMDocument);
6992
6993 hr = IXMLDOMDocument_loadXML(doc, _bstr_(szLinefeedXML), &bSucc);
6994 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
6995 ok(bSucc == VARIANT_TRUE, "Expected VARIANT_TRUE got VARIANT_FALSE\n");
6996
6997 if(bSucc == VARIANT_TRUE)
6998 {
6999 hr = IXMLDOMDocument_get_documentElement(doc, &pElement);
7000 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7001 if(hr == S_OK)
7002 {
7003 hr = IXMLDOMElement_get_xml(pElement, &str);
7004 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7005 ok( !lstrcmpW( str, _bstr_(szLinefeedRootXML) ), "incorrect element xml\n");
7007
7008 IXMLDOMElement_Release(pElement);
7009 }
7010 }
7011
7012 IXMLDOMDocument_Release(doc);
7013
7014 free_bstrs();
7015}
7016
7017typedef struct _nodetypedvalue_t {
7018 const char *name;
7020 const char *value; /* value in string format */
7023
7025 { "root/string", VT_BSTR, "Wine", TRUE },
7026 { "root/string2", VT_BSTR, "String " },
7027 { "root/string3", VT_BSTR, " Wine Wine ", TRUE },
7028 { "root/string4", VT_BSTR, "\nWine Wine\t", TRUE },
7029 { "root/string5", VT_BSTR, "", TRUE },
7030 { "root/nested", VT_BSTR, " s1 \ns2 s2\t", TRUE },
7031 { "root/number", VT_BSTR, "12.44" },
7032 { "root/number2", VT_BSTR, "-3.71e3" },
7033 { "root/int", VT_I4, "-13" },
7034 { "root/fixed", VT_CY, "7322.9371" },
7035 { "root/bool", VT_BOOL, "-1" },
7036 { "root/datetime", VT_DATE, "40135.14" },
7037 { "root/datetimetz",VT_DATE, "37813.59" },
7038 { "root/date", VT_DATE, "665413" },
7039 { "root/time", VT_DATE, "0.5813889" },
7040 { "root/timetz", VT_DATE, "1.112512" },
7041 { "root/i1", VT_I1, "-13" },
7042 { "root/i2", VT_I2, "31915" },
7043 { "root/i4", VT_I4, "-312232" },
7044 { "root/ui1", VT_UI1, "123" },
7045 { "root/ui2", VT_UI2, "48282" },
7046 { "root/ui4", VT_UI4, "949281" },
7047 { "root/r4", VT_R4, "213124" },
7048 { "root/r8", VT_R8, "0.412" },
7049 { "root/float", VT_R8, "41221.421" },
7050 { "root/uuid", VT_BSTR, "333C7BC4-460F-11D0-BC04-0080C7055a83" },
7051 { "root/binbase64", VT_ARRAY|VT_UI1, "base64 test" },
7052 { "root/binbase64_1", VT_ARRAY|VT_UI1, "base64 test" },
7053 { "root/binbase64_2", VT_ARRAY|VT_UI1, "base64 test" },
7054 { 0 }
7055};
7056
7057static const char *strip_spaces(const char *str)
7058{
7059 static char buf[256];
7060 const char *p;
7061
7062 while (isspace(*str))
7063 ++str;
7064
7065 p = str + strlen(str);
7066 while (p != str && isspace(p[-1]))
7067 --p;
7068
7069 memcpy(buf, str, p - str);
7070 buf[p - str] = 0;
7071
7072 return buf;
7073}
7074
7075static void test_nodeTypedValue(void)
7076{
7078 IXMLDOMDocumentType *doctype, *doctype2;
7081 IXMLDOMDocument *doc, *doc2;
7082 IXMLDOMCDATASection *cdata;
7086 VARIANT value;
7087 HRESULT hr;
7088
7089 doc = create_document(&IID_IXMLDOMDocument);
7090
7091 b = VARIANT_FALSE;
7092 hr = IXMLDOMDocument_loadXML(doc, _bstr_(szTypeValueXML), &b);
7093 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7094 ok(b == VARIANT_TRUE, "got %d\n", b);
7095
7096 hr = IXMLDOMDocument_get_nodeValue(doc, NULL);
7097 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
7098
7099 V_VT(&value) = VT_BSTR;
7100 V_BSTR(&value) = NULL;
7101 hr = IXMLDOMDocument_get_nodeValue(doc, &value);
7102 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
7103 ok(V_VT(&value) == VT_NULL, "expect VT_NULL got %d\n", V_VT(&value));
7104
7105 hr = IXMLDOMDocument_get_nodeTypedValue(doc, NULL);
7106 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
7107
7108 V_VT(&value) = VT_EMPTY;
7109 hr = IXMLDOMDocument_get_nodeTypedValue(doc, &value);
7110 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
7111 ok(V_VT(&value) == VT_NULL, "got %d\n", V_VT(&value));
7112
7113 hr = IXMLDOMDocument_selectSingleNode(doc, _bstr_("root/string"), &node);
7114 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7115
7116 V_VT(&value) = VT_BSTR;
7117 V_BSTR(&value) = NULL;
7118 hr = IXMLDOMNode_get_nodeValue(node, &value);
7119 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
7120 ok(V_VT(&value) == VT_NULL, "expect VT_NULL got %d\n", V_VT(&value));
7121
7122 hr = IXMLDOMNode_get_nodeTypedValue(node, NULL);
7123 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr );
7124
7125 IXMLDOMNode_Release(node);
7126
7127 hr = IXMLDOMDocument_selectSingleNode(doc, _bstr_("root/binhex"), &node);
7128 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7129 {
7130 BYTE bytes[] = {0xff,0xfc,0xa0,0x12,0x00,0x3c};
7131
7132 hr = IXMLDOMNode_get_nodeTypedValue(node, &value);
7133 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7134 ok(V_VT(&value) == (VT_ARRAY|VT_UI1), "incorrect type\n");
7135 ok(V_ARRAY(&value)->rgsabound[0].cElements == 6, "incorrect array size\n");
7136 if(V_ARRAY(&value)->rgsabound[0].cElements == 6)
7137 ok(!memcmp(bytes, V_ARRAY(&value)->pvData, sizeof(bytes)), "incorrect value\n");
7139 IXMLDOMNode_Release(node);
7140 }
7141
7142 hr = IXMLDOMDocument_createProcessingInstruction(doc, _bstr_("foo"), _bstr_("value"), &pi);
7143 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7144 {
7145 V_VT(&value) = VT_NULL;
7146 V_BSTR(&value) = (void*)0xdeadbeef;
7147 hr = IXMLDOMProcessingInstruction_get_nodeTypedValue(pi, &value);
7148 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7149 ok(V_VT(&value) == VT_BSTR, "got %d\n", V_VT(&value));
7150 ok(!lstrcmpW(V_BSTR(&value), L"value"), "got wrong value\n");
7151 IXMLDOMProcessingInstruction_Release(pi);
7153 }
7154
7155 hr = IXMLDOMDocument_createCDATASection(doc, _bstr_("[1]*2=3; &gee that's not right!"), &cdata);
7156 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7157 {
7158 V_VT(&value) = VT_NULL;
7159 V_BSTR(&value) = (void*)0xdeadbeef;
7160 hr = IXMLDOMCDATASection_get_nodeTypedValue(cdata, &value);
7161 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7162 ok(V_VT(&value) == VT_BSTR, "got %d\n", V_VT(&value));
7163 ok(!lstrcmpW(V_BSTR(&value), L"[1]*2=3; &gee that's not right!"), "got wrong value\n");
7164 IXMLDOMCDATASection_Release(cdata);
7166 }
7167
7168 hr = IXMLDOMDocument_createComment(doc, _bstr_("comment"), &comment);
7169 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7170 {
7171 V_VT(&value) = VT_NULL;
7172 V_BSTR(&value) = (void*)0xdeadbeef;
7173 hr = IXMLDOMComment_get_nodeTypedValue(comment, &value);
7174 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7175 ok(V_VT(&value) == VT_BSTR, "got %d\n", V_VT(&value));
7176 ok(!lstrcmpW(V_BSTR(&value), L"comment"), "got wrong value\n");
7177 IXMLDOMComment_Release(comment);
7179 }
7180
7181 hr = IXMLDOMDocument_createDocumentFragment(doc, &frag);
7182 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7183 {
7184 V_VT(&value) = VT_EMPTY;
7185 hr = IXMLDOMDocumentFragment_get_nodeTypedValue(frag, &value);
7186 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
7187 ok(V_VT(&value) == VT_NULL, "got %d\n", V_VT(&value));
7188 IXMLDOMDocumentFragment_Release(frag);
7189 }
7190
7191 doc2 = create_document(&IID_IXMLDOMDocument);
7192
7193 b = VARIANT_FALSE;
7194 hr = IXMLDOMDocument_loadXML(doc2, _bstr_(szEmailXML), &b);
7195 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7196 ok(b == VARIANT_TRUE, "got %d\n", b);
7197
7198 EXPECT_REF(doc2, 1);
7199
7200 hr = IXMLDOMDocument_get_doctype(doc2, &doctype);
7201 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7202
7203 EXPECT_REF(doc2, 1);
7204 todo_wine EXPECT_REF(doctype, 2);
7205
7206 {
7207 V_VT(&value) = VT_EMPTY;
7208 hr = IXMLDOMDocumentType_get_nodeTypedValue(doctype, &value);
7209 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
7210 ok(V_VT(&value) == VT_NULL, "got %d\n", V_VT(&value));
7211 }
7212
7213 hr = IXMLDOMDocument_get_doctype(doc2, &doctype2);
7214 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7215 ok(doctype != doctype2, "got %p, was %p\n", doctype2, doctype);
7216
7217 IXMLDOMDocumentType_Release(doctype2);
7218 IXMLDOMDocumentType_Release(doctype);
7219
7220 IXMLDOMDocument_Release(doc2);
7221
7222 while (entry->name)
7223 {
7224 hr = IXMLDOMDocument_selectSingleNode(doc, _bstr_(entry->name), &node);
7225 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7226
7227 hr = IXMLDOMNode_get_nodeTypedValue(node, &value);
7228 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7229 ok(V_VT(&value) == entry->type, "incorrect type, expected %d, got %d\n", entry->type, V_VT(&value));
7230
7231 if (entry->type == (VT_ARRAY|VT_UI1))
7232 {
7233 ok(V_ARRAY(&value)->rgsabound[0].cElements == strlen(entry->value),
7234 "incorrect array size %ld\n", V_ARRAY(&value)->rgsabound[0].cElements);
7235 }
7236
7237 if (entry->type != VT_BSTR)
7238 {
7239 if (entry->type == VT_DATE ||
7240 entry->type == VT_R8 ||
7241 entry->type == VT_CY)
7242 {
7243 if (entry->type == VT_DATE)
7244 {
7246 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7247 }
7251 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7252 }
7253 else
7254 {
7256 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7257 }
7258
7259 /* for byte array from VT_ARRAY|VT_UI1 it's not a WCHAR buffer */
7260 if (entry->type == (VT_ARRAY|VT_UI1))
7261 {
7262 ok(!memcmp( V_BSTR(&value), entry->value, strlen(entry->value)),
7263 "expected %s\n", entry->value);
7264 }
7265 else
7266 ok(lstrcmpW( V_BSTR(&value), _bstr_(entry->value)) == 0,
7267 "expected %s, got %s\n", entry->value, wine_dbgstr_w(V_BSTR(&value)));
7268 }
7269 else
7270 {
7271 BSTR bstr, expected;
7272
7273 expected = entry->no_type ? _bstr_(strip_spaces(entry->value)) : _bstr_(entry->value);
7274 ok(!wcscmp( V_BSTR(&value), expected ), "expected %s, got %s\n",
7276 if (entry->no_type)
7277 {
7278 VariantClear( &value );
7279
7280 hr = IXMLDOMDocument_get_preserveWhiteSpace(doc, &b);
7281 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7282 ok(b == VARIANT_FALSE, "got %d\n", b);
7283
7284 hr = IXMLDOMNode_get_text(node, &bstr);
7285 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7286 ok(!wcscmp( bstr, expected ), "expected %s, got %s\n",
7288 SysFreeString(bstr);
7289
7290 hr = IXMLDOMDocument_put_preserveWhiteSpace(doc, VARIANT_TRUE);
7291 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7292
7293 expected = _bstr_(entry->value);
7294 hr = IXMLDOMNode_get_text(node, &bstr);
7295 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7296 ok(!wcscmp( bstr, expected ), "expected %s, got %s\n",
7298 SysFreeString(bstr);
7299
7300 hr = IXMLDOMNode_get_nodeTypedValue(node, &value);
7301 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7302 ok(V_VT(&value) == entry->type, "incorrect type, expected %d, got %d\n", entry->type, V_VT(&value));
7303 ok(!wcscmp( V_BSTR(&value), expected ), "expected %s, got %s\n",
7305
7306 hr = IXMLDOMDocument_put_preserveWhiteSpace(doc, VARIANT_FALSE);
7307 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7308 }
7309 }
7310
7311 VariantClear( &value );
7312 IXMLDOMNode_Release(node);
7313
7314 entry++;
7315 }
7316
7317 IXMLDOMDocument_Release(doc);
7318 free_bstrs();
7319}
7320
7322{
7323 IXMLDOMDocument *doc;
7324 IXMLDOMDocument *xsl;
7325 IXMLDOMNode *pNode;
7326 VARIANT_BOOL bSucc;
7327 HRESULT hr;
7328 HANDLE file;
7329 DWORD dwWritten;
7330 char lpPathBuffer[MAX_PATH];
7331 int i;
7332
7333 /* Create a Temp File. */
7334 GetTempPathA(MAX_PATH, lpPathBuffer);
7335 strcat(lpPathBuffer, "customers.xml" );
7336
7338 ok(file != INVALID_HANDLE_VALUE, "Could not create file: %lu\n", GetLastError());
7340 return;
7341
7344
7345 /* Correct path to not include an escape character. */
7346 for(i=0; i < strlen(lpPathBuffer); i++)
7347 {
7348 if(lpPathBuffer[i] == '\\')
7349 lpPathBuffer[i] = '/';
7350 }
7351
7352 doc = create_document(&IID_IXMLDOMDocument);
7353 xsl = create_document(&IID_IXMLDOMDocument);
7354
7355 hr = IXMLDOMDocument_loadXML(doc, _bstr_(szTypeValueXML), &bSucc);
7356 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7357 ok(bSucc == VARIANT_TRUE, "Expected VARIANT_TRUE got VARIANT_FALSE\n");
7358 if(bSucc == VARIANT_TRUE)
7359 {
7360 BSTR sXSL;
7363 BSTR sFileName = _bstr_(lpPathBuffer);
7364 int nLength = lstrlenW(sPart1) + lstrlenW(sPart2) + lstrlenW(sFileName) + 1;
7365
7367 lstrcpyW(sXSL, sPart1);
7368 lstrcatW(sXSL, sFileName);
7369 lstrcatW(sXSL, sPart2);
7370
7371 hr = IXMLDOMDocument_loadXML(xsl, sXSL, &bSucc);
7372 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7373 ok(bSucc == VARIANT_TRUE, "Expected VARIANT_TRUE got VARIANT_FALSE\n");
7374 if(bSucc == VARIANT_TRUE)
7375 {
7376 BSTR sResult;
7377
7378 hr = IXMLDOMDocument_QueryInterface(xsl, &IID_IXMLDOMNode, (void**)&pNode );
7379 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7380 if(hr == S_OK)
7381 {
7382 /* This will load the temp file via the XSL */
7383 hr = IXMLDOMDocument_transformNode(doc, pNode, &sResult);
7384 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7385 if(hr == S_OK)
7386 {
7387 ok( compareIgnoreReturns( sResult, _bstr_(szBasicTransformOutput)), "Stylesheet output not correct\n");
7388 SysFreeString(sResult);
7389 }
7390
7391 IXMLDOMNode_Release(pNode);
7392 }
7393 }
7394
7395 SysFreeString(sXSL);
7396 }
7397
7398 IXMLDOMDocument_Release(doc);
7399 IXMLDOMDocument_Release(xsl);
7400
7401 DeleteFileA(lpPathBuffer);
7402 free_bstrs();
7403}
7404
7405static void test_put_nodeValue(void)
7406{
7407 IXMLDOMDocument *doc;
7412 HRESULT hr;
7413 VARIANT data, type;
7414
7415 doc = create_document(&IID_IXMLDOMDocument);
7416
7417 /* test for unsupported types */
7418 /* NODE_DOCUMENT */
7419 hr = IXMLDOMDocument_QueryInterface(doc, &IID_IXMLDOMNode, (void**)&node);
7420 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7421 V_VT(&data) = VT_BSTR;
7422 V_BSTR(&data) = _bstr_("one two three");
7423 hr = IXMLDOMNode_put_nodeValue(node, data);
7424 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr );
7425 IXMLDOMNode_Release(node);
7426
7427 /* NODE_DOCUMENT_FRAGMENT */
7428 V_VT(&type) = VT_I1;
7430 hr = IXMLDOMDocument_createNode(doc, type, _bstr_("test"), NULL, &node);
7431 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7432 V_VT(&data) = VT_BSTR;
7433 V_BSTR(&data) = _bstr_("one two three");
7434 hr = IXMLDOMNode_put_nodeValue(node, data);
7435 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr );
7436 IXMLDOMNode_Release(node);
7437
7438 /* NODE_ELEMENT */
7439 V_VT(&type) = VT_I1;
7441 hr = IXMLDOMDocument_createNode(doc, type, _bstr_("test"), NULL, &node);
7442 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7443 V_VT(&data) = VT_BSTR;
7444 V_BSTR(&data) = _bstr_("one two three");
7445 hr = IXMLDOMNode_put_nodeValue(node, data);
7446 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr );
7447 IXMLDOMNode_Release(node);
7448
7449 /* NODE_ENTITY_REFERENCE */
7450 hr = IXMLDOMDocument_createEntityReference(doc, _bstr_("ref"), &entityref);
7451 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7452
7453 V_VT(&data) = VT_BSTR;
7454 V_BSTR(&data) = _bstr_("one two three");
7455 hr = IXMLDOMEntityReference_put_nodeValue(entityref, data);
7456 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr );
7457
7458 hr = IXMLDOMEntityReference_QueryInterface(entityref, &IID_IXMLDOMNode, (void**)&node);
7459 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7460 V_VT(&data) = VT_BSTR;
7461 V_BSTR(&data) = _bstr_("one two three");
7462 hr = IXMLDOMNode_put_nodeValue(node, data);
7463 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr );
7464 IXMLDOMNode_Release(node);
7465 IXMLDOMEntityReference_Release(entityref);
7466
7467 /* supported types */
7468 hr = IXMLDOMDocument_createTextNode(doc, _bstr_(""), &text);
7469 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7470 V_VT(&data) = VT_BSTR;
7471 V_BSTR(&data) = _bstr_("Jeeves & Wooster");
7472 hr = IXMLDOMText_put_nodeValue(text, data);
7473 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7474 IXMLDOMText_Release(text);
7475
7476 hr = IXMLDOMDocument_createAttribute(doc, _bstr_("attr"), &attr);
7477 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7478 V_VT(&data) = VT_BSTR;
7479 V_BSTR(&data) = _bstr_("Jeeves & Wooster");
7480 hr = IXMLDOMAttribute_put_nodeValue(attr, data);
7481 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7482 hr = IXMLDOMAttribute_get_nodeValue(attr, &data);
7483 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7484 ok(!lstrcmpW(V_BSTR(&data), L"Jeeves & Wooster"), "got %s\n", wine_dbgstr_w(V_BSTR(&data)));
7486 IXMLDOMAttribute_Release(attr);
7487
7488 free_bstrs();
7489
7490 IXMLDOMDocument_Release(doc);
7491}
7492
7493static void test_IObjectSafety(void)
7494{
7495 IXMLDOMDocument *doc;
7496 IObjectSafety *safety;
7497 HRESULT hr;
7498
7499 doc = create_document(&IID_IXMLDOMDocument);
7500
7501 hr = IXMLDOMDocument_QueryInterface(doc, &IID_IObjectSafety, (void**)&safety);
7502 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7503
7505
7506 IObjectSafety_Release(safety);
7507 IXMLDOMDocument_Release(doc);
7508
7509 hr = CoCreateInstance(&CLSID_XMLHTTPRequest, NULL, CLSCTX_INPROC_SERVER,
7510 &IID_IObjectSafety, (void**)&safety);
7511 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
7512
7514
7515 IObjectSafety_Release(safety);
7516
7517}
7518
7519typedef struct _property_test_t {
7520 const GUID *guid;
7521 const char *clsid;
7522 const char *property;
7523 const char *value;
7525
7527 { &CLSID_DOMDocument, "CLSID_DOMDocument" , "SelectionLanguage", "XSLPattern" },
7528 { &CLSID_DOMDocument2, "CLSID_DOMDocument2" , "SelectionLanguage", "XSLPattern" },
7529 { &CLSID_DOMDocument30, "CLSID_DOMDocument30", "SelectionLanguage", "XSLPattern" },
7530 { &CLSID_DOMDocument40, "CLSID_DOMDocument40", "SelectionLanguage", "XPath" },
7531 { &CLSID_DOMDocument60, "CLSID_DOMDocument60", "SelectionLanguage", "XPath" },
7532 { 0 }
7533};
7534
7536{
7538
7539 while (entry->guid)
7540 {
7541 IXMLDOMDocument2 *doc;
7542 VARIANT var;
7543 HRESULT hr;
7544
7545 if (!is_clsid_supported(entry->guid, &IID_IXMLDOMDocument2))
7546 {
7547 entry++;
7548 continue;
7549 }
7550
7551 hr = CoCreateInstance(entry->guid, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (void**)&doc);
7552 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7553
7554 hr = IXMLDOMDocument2_getProperty(doc, _bstr_(entry->property), &var);
7555 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7556 ok(lstrcmpW(V_BSTR(&var), _bstr_(entry->value)) == 0, "expected %s, for %s\n",
7557 entry->value, entry->clsid);
7558 VariantClear(&var);
7559
7560 IXMLDOMDocument2_Release(doc);
7561
7562 entry++;
7563 }
7564}
7565
7566typedef struct {
7567 const char *query;
7568 const char *list;
7571
7573 { "root//elem[0]", "E1.E2.D1" },
7574 { "root//elem[index()=1]", "E2.E2.D1" },
7575 { "root//elem[index() $eq$ 1]", "E2.E2.D1" },
7576 { "root//elem[end()]", "E4.E2.D1" },
7577 { "root//elem[$not$ end()]", "E1.E2.D1 E2.E2.D1 E3.E2.D1" },
7578 { "root//elem[index() != 0]", "E2.E2.D1 E3.E2.D1 E4.E2.D1" },
7579 { "root//elem[index() $ne$ 0]", "E2.E2.D1 E3.E2.D1 E4.E2.D1" },
7580 { "root//elem[index() < 2]", "E1.E2.D1 E2.E2.D1" },
7581 { "root//elem[index() $lt$ 2]", "E1.E2.D1 E2.E2.D1" },
7582 { "root//elem[index() <= 1]", "E1.E2.D1 E2.E2.D1" },
7583 { "root//elem[index() $le$ 1]", "E1.E2.D1 E2.E2.D1" },
7584 { "root//elem[index() > 1]", "E3.E2.D1 E4.E2.D1" },
7585 { "root//elem[index() $gt$ 1]", "E3.E2.D1 E4.E2.D1" },
7586 { "root//elem[index() >= 2]", "E3.E2.D1 E4.E2.D1" },
7587 { "root//elem[index() $ge$ 2]", "E3.E2.D1 E4.E2.D1" },
7588 { "root//elem[a $ieq$ 'a2 field']", "E2.E2.D1" },
7589 { "root//elem[a $ine$ 'a2 field']", "E1.E2.D1 E3.E2.D1 E4.E2.D1" },
7590 { "root//elem[a $ilt$ 'a3 field']", "E1.E2.D1 E2.E2.D1" },
7591 { "root//elem[a $ile$ 'a2 field']", "E1.E2.D1 E2.E2.D1" },
7592 { "root//elem[a $igt$ 'a2 field']", "E3.E2.D1 E4.E2.D1" },
7593 { "root//elem[a $ige$ 'a3 field']", "E3.E2.D1 E4.E2.D1" },
7594 { "root//elem[$any$ *='B2 field']", "E2.E2.D1" },
7595 { "root//elem[$all$ *!='B2 field']", "E1.E2.D1 E3.E2.D1 E4.E2.D1" },
7596 { "root//elem[index()=0 or end()]", "E1.E2.D1 E4.E2.D1" },
7597 { "root//elem[index()=0 $or$ end()]", "E1.E2.D1 E4.E2.D1" },
7598 { "root//elem[index()=0 || end()]", "E1.E2.D1 E4.E2.D1" },
7599 { "root//elem[index()>0 and $not$ end()]", "E2.E2.D1 E3.E2.D1" },
7600 { "root//elem[index()>0 $and$ $not$ end()]", "E2.E2.D1 E3.E2.D1" },
7601 { "root//elem[index()>0 && $not$ end()]", "E2.E2.D1 E3.E2.D1" },
7602 { "root/elem[0]", "E1.E2.D1" },
7603 { "root/elem[index()=1]", "E2.E2.D1" },
7604 { "root/elem[index() $eq$ 1]", "E2.E2.D1" },
7605 { "root/elem[end()]", "E4.E2.D1" },
7606 { "root/elem[$not$ end()]", "E1.E2.D1 E2.E2.D1 E3.E2.D1" },
7607 { "root/elem[index() != 0]", "E2.E2.D1 E3.E2.D1 E4.E2.D1" },
7608 { "root/elem[index() $ne$ 0]", "E2.E2.D1 E3.E2.D1 E4.E2.D1" },
7609 { "root/elem[index() < 2]", "E1.E2.D1 E2.E2.D1" },
7610 { "root/elem[index() $lt$ 2]", "E1.E2.D1 E2.E2.D1" },
7611 { "root/elem[index() <= 1]", "E1.E2.D1 E2.E2.D1" },
7612 { "root/elem[index() $le$ 1]", "E1.E2.D1 E2.E2.D1" },
7613 { "root/elem[index() > 1]", "E3.E2.D1 E4.E2.D1" },
7614 { "root/elem[index() $gt$ 1]", "E3.E2.D1 E4.E2.D1" },
7615 { "root/elem[index() >= 2]", "E3.E2.D1 E4.E2.D1" },
7616 { "root/elem[index() $ge$ 2]", "E3.E2.D1 E4.E2.D1" },
7617 { "root/elem[a $ieq$ 'a2 field']", "E2.E2.D1" },
7618 { "root/elem[a $ine$ 'a2 field']", "E1.E2.D1 E3.E2.D1 E4.E2.D1" },
7619 { "root/elem[a $ilt$ 'a3 field']", "E1.E2.D1 E2.E2.D1" },
7620 { "root/elem[a $ile$ 'a2 field']", "E1.E2.D1 E2.E2.D1" },
7621 { "root/elem[a $igt$ 'a2 field']", "E3.E2.D1 E4.E2.D1" },
7622 { "root/elem[a $ige$ 'a3 field']", "E3.E2.D1 E4.E2.D1" },
7623 { "root/elem[$any$ *='B2 field']", "E2.E2.D1" },
7624 { "root/elem[$all$ *!='B2 field']", "E1.E2.D1 E3.E2.D1 E4.E2.D1" },
7625 { "root/elem[index()=0 or end()]", "E1.E2.D1 E4.E2.D1" },
7626 { "root/elem[index()=0 $or$ end()]", "E1.E2.D1 E4.E2.D1" },
7627 { "root/elem[index()=0 || end()]", "E1.E2.D1 E4.E2.D1" },
7628 { "root/elem[index()>0 and $not$ end()]", "E2.E2.D1 E3.E2.D1" },
7629 { "root/elem[index()>0 $and$ $not$ end()]", "E2.E2.D1 E3.E2.D1" },
7630 { "root/elem[index()>0 && $not$ end()]", "E2.E2.D1 E3.E2.D1" },
7631 { "root/elem[d]", "E1.E2.D1 E2.E2.D1 E4.E2.D1" },
7632 { "root/elem[@*]", "E2.E2.D1 E3.E2.D1", TRUE },
7633 { NULL }
7634};
7635
7637 /* prefixes don't need to be registered, you may use them as they are in the doc */
7638 { "//bar:x", "E6.E1.E5.E1.E2.D1 E6.E2.E5.E1.E2.D1" },
7639 /* prefixes must be explicitly specified in the name */
7640 { "//foo:elem", "" },
7641 { "//foo:c", "E3.E4.E2.D1" },
7642 { NULL }
7643};
7644
7646 { "attribute()", "" },
7647 { "attribute('depth')", "" },
7648 { "root/attribute('depth')", "A'depth'.E3.D1" },
7649 { "//x/attribute()", "A'id'.E3.E3.D1 A'depth'.E3.E3.D1" },
7650 { "//x//attribute(id)", NULL },
7651 { "//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" },
7652 { "comment()", "C2.D1" },
7653 { "//comment()", "C2.D1 C1.E3.D1 C2.E3.E3.D1 C2.E4.E3.D1" },
7654 { "element()", "E3.D1" },
7655 { "root/y/element()", "E4.E4.E3.D1 E5.E4.E3.D1 E6.E4.E3.D1" },
7656 { "//element(a)", NULL },
7657 { "//element('a')", "E4.E3.E3.D1 E4.E4.E3.D1" },
7658 { "node()", "P1.D1 C2.D1 E3.D1" },
7659 { "//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" },
7660 { "//x/node()[nodeType()=1]", "E4.E3.E3.D1 E5.E3.E3.D1 E6.E3.E3.D1" },
7661 { "//x/node()[nodeType()=3]", "T3.E3.E3.D1" },
7662 { "//x/node()[nodeType()=7]", "P1.E3.E3.D1" },
7663 { "//x/node()[nodeType()=8]", "C2.E3.E3.D1" },
7664 { "pi()", "P1.D1" },
7665 { "//y/pi()", "P1.E4.E3.D1" },
7666 { "root/textnode()", "T2.E3.D1" },
7667 { "root/element()/textnode()", "T3.E3.E3.D1 T3.E4.E3.D1" },
7668 { NULL }
7669};
7670
7671static void test_XSLPattern(void)
7672{
7674 IXMLDOMDocument2 *doc;
7677 HRESULT hr;
7678 LONG len;
7679
7680 doc = create_document(&IID_IXMLDOMDocument2);
7681
7682 b = VARIANT_FALSE;
7683 hr = IXMLDOMDocument2_loadXML(doc, _bstr_(szExampleXML), &b);
7684 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7685 ok(b == VARIANT_TRUE, "failed to load XML string\n");
7686
7687 /* switch to XSLPattern */
7688 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionLanguage"), _variantbstr_("XSLPattern"));
7689 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7690
7691 /* XPath doesn't select elements with non-null default namespace with unqualified selectors, XSLPattern does */
7692 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("//elem/c"), &list);
7693 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7694
7695 len = 0;
7696 hr = IXMLDOMNodeList_get_length(list, &len);
7697 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7698 /* should select <elem><c> and <elem xmlns='...'><c> but not <elem><foo:c> */
7699 ok(len == 3, "expected 3 entries in list, got %ld\n", len);
7700 IXMLDOMNodeList_Release(list);
7701
7702 while (ptr->query)
7703 {
7704 list = NULL;
7705 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_(ptr->query), &list);
7706 ok(hr == S_OK, "query=%s, failed with %#lx\n", ptr->query, hr);
7707 len = 0;
7708 hr = IXMLDOMNodeList_get_length(list, &len);
7709 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7710 ok(len != 0, "query=%s, empty list\n", ptr->query);
7711 if (len) {
7712 if (ptr->todo) {
7713 char *str = list_to_string(list);
7714 todo_wine
7715 ok(!strcmp(str, ptr->list), "Invalid node list: %s, expected %s\n", str, ptr->list);
7716 IXMLDOMNodeList_Release(list);
7717 }
7718 else
7720 }
7721
7722 ptr++;
7723 }
7724
7725 /* namespace handling */
7726 /* no registered namespaces */
7727 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionNamespaces"), _variantbstr_(""));
7728 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7729
7731 while (ptr->query)
7732 {
7733 list = NULL;
7734 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_(ptr->query), &list);
7735 ok(hr == S_OK, "query=%s, failed with %#lx.\n", ptr->query, hr);
7736
7737 if (*ptr->list)
7738 {
7739 len = 0;
7740 hr = IXMLDOMNodeList_get_length(list, &len);
7741 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7742 ok(len != 0, "query=%s, empty list\n", ptr->query);
7743 }
7744 else
7745 {
7746 len = 1;
7747 hr = IXMLDOMNodeList_get_length(list, &len);
7748 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7749 ok(len == 0, "query=%s, empty list\n", ptr->query);
7750 }
7751 if (len)
7753
7754 ptr++;
7755 }
7756
7757 /* explicitly register prefix foo */
7758 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionNamespaces"),
7759 _variantbstr_("xmlns:foo='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'"));
7760 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7761
7762 /* now we get the same behavior as XPath */
7763 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("//foo:c"), &list);
7764 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7765 len = 0;
7766 hr = IXMLDOMNodeList_get_length(list, &len);
7767 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7768 ok(len != 0, "expected filled list\n");
7769 if (len)
7770 expect_list_and_release(list, "E3.E3.E2.D1 E3.E4.E2.D1");
7771
7772 /* set prefix foo to some nonexistent namespace */
7773 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionNamespaces"), _variantbstr_("xmlns:foo='urn:nonexistent-foo'"));
7774 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7775
7776 /* the registered prefix takes precedence */
7777 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_("//foo:c"), &list);
7778 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7779 len = 0;
7780 hr = IXMLDOMNodeList_get_length(list, &len);
7781 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7782 ok(len == 0, "expected empty list\n");
7783 IXMLDOMNodeList_Release(list);
7784
7785 IXMLDOMDocument2_Release(doc);
7786
7787 doc = create_document(&IID_IXMLDOMDocument2);
7788
7789 hr = IXMLDOMDocument2_loadXML(doc, _bstr_(szNodeTypesXML), &b);
7790 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7791 ok(b == VARIANT_TRUE, "failed to load XML string\n");
7792
7794 while (ptr->query)
7795 {
7796 list = NULL;
7797 hr = IXMLDOMDocument2_selectNodes(doc, _bstr_(ptr->query), &list);
7798 if (ptr->list)
7799 {
7800 ok(hr == S_OK, "query=%s, failed with %#lx.\n", ptr->query, hr);
7801 len = 0;
7802 hr = IXMLDOMNodeList_get_length(list, &len);
7803 ok(hr == S_OK, "Failed to get list length, hr %#lx.\n", hr);
7804 if (*ptr->list)
7805 {
7806 ok(len != 0, "query=%s, empty list\n", ptr->query);
7807 if (len)
7809 }
7810 else
7811 ok(len == 0, "query=%s, filled list\n", ptr->query);
7812 }
7813 else
7814 ok(hr == E_FAIL, "query=%s, failed with %#lx.\n", ptr->query, hr);
7815
7816 ptr++;
7817 }
7818
7819 IXMLDOMDocument2_Release(doc);
7820 free_bstrs();
7821}
7822
7823static void test_splitText(void)
7824{
7825 IXMLDOMCDATASection *cdata;
7827 IXMLDOMDocument *doc;
7828 IXMLDOMText *text, *text2;
7830 VARIANT var;
7832 LONG length;
7833 HRESULT hr;
7834
7835 doc = create_document(&IID_IXMLDOMDocument);
7836
7837 hr = IXMLDOMDocument_loadXML(doc, _bstr_("<root></root>"), &success);
7838 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7839
7840 hr = IXMLDOMDocument_get_documentElement(doc, &root);
7841 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7842
7843 hr = IXMLDOMDocument_createCDATASection(doc, _bstr_("beautiful plumage"), &cdata);
7844 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7845
7846 V_VT(&var) = VT_EMPTY;
7847 hr = IXMLDOMElement_appendChild(root, (IXMLDOMNode*)cdata, NULL);
7848 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7849
7850 length = 0;
7851 hr = IXMLDOMCDATASection_get_length(cdata, &length);
7852 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7853 ok(length > 0, "got %ld\n", length);
7854
7855 hr = IXMLDOMCDATASection_splitText(cdata, 0, NULL);
7856 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
7857
7858 text = (void*)0xdeadbeef;
7859 /* negative offset */
7860 hr = IXMLDOMCDATASection_splitText(cdata, -1, &text);
7861 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
7862 ok(text == (void*)0xdeadbeef, "got %p\n", text);
7863
7864 text = (void*)0xdeadbeef;
7865 /* offset outside data */
7866 hr = IXMLDOMCDATASection_splitText(cdata, length + 1, &text);
7867 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
7868 ok(text == 0, "got %p\n", text);
7869
7870 text = (void*)0xdeadbeef;
7871 /* offset outside data */
7872 hr = IXMLDOMCDATASection_splitText(cdata, length, &text);
7873 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
7874 ok(text == 0, "got %p\n", text);
7875
7876 /* no empty node created */
7877 node = (void*)0xdeadbeef;
7878 hr = IXMLDOMCDATASection_get_nextSibling(cdata, &node);
7879 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
7880 ok(node == 0, "got %p\n", text);
7881
7882 hr = IXMLDOMCDATASection_splitText(cdata, 10, &text);
7883 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7884
7885 length = 0;
7886 hr = IXMLDOMText_get_length(text, &length);
7887 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7888 ok(length == 7, "got %ld\n", length);
7889
7890 hr = IXMLDOMCDATASection_get_nextSibling(cdata, &node);
7891 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7892 IXMLDOMNode_Release(node);
7893
7894 /* split new text node */
7895 hr = IXMLDOMText_get_length(text, &length);
7896 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7897
7898 node = (void*)0xdeadbeef;
7899 hr = IXMLDOMText_get_nextSibling(text, &node);
7900 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
7901 ok(node == 0, "got %p\n", text);
7902
7903 hr = IXMLDOMText_splitText(text, 0, NULL);
7904 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
7905
7906 text2 = (void*)0xdeadbeef;
7907 /* negative offset */
7908 hr = IXMLDOMText_splitText(text, -1, &text2);
7909 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
7910 ok(text2 == (void*)0xdeadbeef, "got %p\n", text2);
7911
7912 text2 = (void*)0xdeadbeef;
7913 /* offset outside data */
7914 hr = IXMLDOMText_splitText(text, length + 1, &text2);
7915 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
7916 ok(text2 == 0, "got %p\n", text2);
7917
7918 text2 = (void*)0xdeadbeef;
7919 /* offset outside data */
7920 hr = IXMLDOMText_splitText(text, length, &text2);
7921 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
7922 ok(text2 == 0, "got %p\n", text);
7923
7924 text2 = 0;
7925 hr = IXMLDOMText_splitText(text, 4, &text2);
7926 todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7927 if (text2) IXMLDOMText_Release(text2);
7928
7929 node = 0;
7930 hr = IXMLDOMText_get_nextSibling(text, &node);
7931 todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7932 if (node) IXMLDOMNode_Release(node);
7933
7934 IXMLDOMText_Release(text);
7935 IXMLDOMElement_Release(root);
7936 IXMLDOMCDATASection_Release(cdata);
7937 free_bstrs();
7938}
7939
7940typedef struct {
7941 const char *name;
7942 const char *uri;
7944} ns_item_t;
7945
7946/* default_ns_doc used */
7948 { "xml:lang", NULL, S_FALSE },
7949 { "xml:lang", "http://www.w3.org/XML/1998/namespace", S_FALSE },
7950 { "lang", "http://www.w3.org/XML/1998/namespace", S_OK },
7951 { "ns:b", NULL, S_FALSE },
7952 { "ns:b", "nshref", S_FALSE },
7953 { "b", "nshref", S_OK },
7954 { "d", NULL, S_OK },
7955 { NULL }
7956};
7957
7958static const ns_item_t named_item_tests[] = {
7959 { "xml:lang", NULL, S_OK },
7960 { "lang", NULL, S_FALSE },
7961 { "ns:b", NULL, S_OK },
7962 { "b", NULL, S_FALSE },
7963 { "d", NULL, S_OK },
7964 { NULL }
7965};
7966
7967static void test_getQualifiedItem(void)
7968{
7969 IXMLDOMNode *pr_node, *node;
7970 IXMLDOMNodeList *root_list;
7973 const ns_item_t* ptr;
7974 IXMLDOMDocument *doc;
7976 HRESULT hr;
7977 LONG len;
7978
7979 doc = create_document(&IID_IXMLDOMDocument);
7980
7981 hr = IXMLDOMDocument_loadXML( doc, _bstr_(complete4A), &b );
7982 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7983 ok( b == VARIANT_TRUE, "failed to load XML string\n");
7984
7985 hr = IXMLDOMDocument_get_documentElement(doc, &element);
7986 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7987
7988 hr = IXMLDOMElement_get_childNodes(element, &root_list);
7989 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7990
7991 hr = IXMLDOMNodeList_get_item(root_list, 1, &pr_node);
7992 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7993 IXMLDOMNodeList_Release(root_list);
7994
7995 hr = IXMLDOMNode_get_attributes(pr_node, &map);
7996 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
7997 IXMLDOMNode_Release(pr_node);
7998
7999 len = 0;
8000 hr = IXMLDOMNamedNodeMap_get_length(map, &len);
8001 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8002 ok( len == 3, "length %ld\n", len);
8003
8004 hr = IXMLDOMNamedNodeMap_getQualifiedItem(map, NULL, NULL, NULL);
8005 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8006
8007 node = (void*)0xdeadbeef;
8008 hr = IXMLDOMNamedNodeMap_getQualifiedItem(map, NULL, NULL, &node);
8009 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8010 ok( node == (void*)0xdeadbeef, "got %p\n", node);
8011
8012 hr = IXMLDOMNamedNodeMap_getQualifiedItem(map, _bstr_("id"), NULL, NULL);
8013 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8014
8015 hr = IXMLDOMNamedNodeMap_getQualifiedItem(map, _bstr_("id"), NULL, &node);
8016 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8017
8018 IXMLDOMNode_Release(node);
8019 IXMLDOMNamedNodeMap_Release(map);
8020 IXMLDOMElement_Release(element);
8021
8022 hr = IXMLDOMDocument_loadXML(doc, _bstr_(default_ns_doc), &b);
8023 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8024
8025 hr = IXMLDOMDocument_selectSingleNode(doc, _bstr_("a"), &node);
8026 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8027
8028 hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMElement, (void**)&element);
8029 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8030 IXMLDOMNode_Release(node);
8031
8032 hr = IXMLDOMElement_get_attributes(element, &map);
8033 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8034
8036 while (ptr->name)
8037 {
8038 node = (void*)0xdeadbeef;
8039 hr = IXMLDOMNamedNodeMap_getQualifiedItem(map, _bstr_(ptr->name), _bstr_(ptr->uri), &node);
8040 ok(hr == ptr->hr, "%s, %s: unexpected hr %#lx, expected %#lx.\n", ptr->name, ptr->uri, hr, ptr->hr);
8041 if (hr == S_OK)
8042 IXMLDOMNode_Release(node);
8043 else
8044 ok(node == NULL, "%s, %s: got %p\n", ptr->name, ptr->uri, node);
8045 ptr++;
8046 }
8047
8049 while (ptr->name)
8050 {
8051 node = (void*)0xdeadbeef;
8052 hr = IXMLDOMNamedNodeMap_getNamedItem(map, _bstr_(ptr->name), &node);
8053 ok(hr == ptr->hr, "%s: unexpected hr %#lx, expected %#lx.\n", ptr->name, hr, ptr->hr);
8054 if (hr == S_OK)
8055 IXMLDOMNode_Release(node);
8056 else
8057 ok(node == NULL, "%s: got %p\n", ptr->name, node);
8058 ptr++;
8059 }
8060
8061 IXMLDOMNamedNodeMap_Release(map);
8062
8063 IXMLDOMElement_Release(element);
8064 IXMLDOMDocument_Release(doc);
8065 free_bstrs();
8066}
8067
8069{
8070 IXMLDOMDocument *doc;
8072 IXMLDOMNode *pr_node, *node;
8073 IXMLDOMNodeList *root_list;
8076 LONG len;
8077 HRESULT hr;
8078
8079 doc = create_document(&IID_IXMLDOMDocument);
8080
8081 hr = IXMLDOMDocument_loadXML( doc, _bstr_(complete4A), &b );
8082 ok( hr == S_OK, "loadXML failed\n");
8083 ok( b == VARIANT_TRUE, "failed to load XML string\n");
8084
8085 hr = IXMLDOMDocument_get_documentElement(doc, &element);
8086 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8087
8088 hr = IXMLDOMElement_get_childNodes(element, &root_list);
8089 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8090
8091 hr = IXMLDOMNodeList_get_item(root_list, 1, &pr_node);
8092 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8093 IXMLDOMNodeList_Release(root_list);
8094
8095 hr = IXMLDOMNode_get_attributes(pr_node, &map);
8096 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8097 IXMLDOMNode_Release(pr_node);
8098
8099 hr = IXMLDOMNamedNodeMap_get_length(map, &len);
8100 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8101 ok( len == 3, "length %ld\n", len);
8102
8103 hr = IXMLDOMNamedNodeMap_removeQualifiedItem(map, NULL, NULL, NULL);
8104 ok( hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8105
8106 node = (void*)0xdeadbeef;
8107 hr = IXMLDOMNamedNodeMap_removeQualifiedItem(map, NULL, NULL, &node);
8108 ok( hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8109 ok( node == (void*)0xdeadbeef, "got %p\n", node);
8110
8111 /* out pointer is optional */
8112 hr = IXMLDOMNamedNodeMap_removeQualifiedItem(map, _bstr_("id"), NULL, NULL);
8113 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8114
8115 /* already removed */
8116 hr = IXMLDOMNamedNodeMap_removeQualifiedItem(map, _bstr_("id"), NULL, NULL);
8117 ok( hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
8118
8119 hr = IXMLDOMNamedNodeMap_removeQualifiedItem(map, _bstr_("vr"), NULL, &node);
8120 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8121 IXMLDOMNode_Release(node);
8122
8123 IXMLDOMNamedNodeMap_Release( map );
8124 IXMLDOMElement_Release( element );
8125 IXMLDOMDocument_Release( doc );
8126 free_bstrs();
8127}
8128
8129#define check_default_props(doc) _check_default_props(__LINE__, doc)
8130static inline void _check_default_props(int line, IXMLDOMDocument2* doc)
8131{
8133 VARIANT var;
8134 HRESULT hr;
8135
8136 VariantInit(&var);
8137 hr = IXMLDOMDocument2_getProperty(doc, _bstr_("SelectionLanguage"), &var);
8138 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8139 VariantClear(&var);
8140
8141 hr = IXMLDOMDocument2_getProperty(doc, _bstr_("SelectionNamespaces"), &var);
8142 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8143 ok_(__FILE__, line)(lstrcmpW(V_BSTR(&var), L"") == 0, "expected empty string\n");
8144 VariantClear(&var);
8145
8146 hr = IXMLDOMDocument2_get_preserveWhiteSpace(doc, &b);
8147 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8148 ok_(__FILE__, line)(b == VARIANT_FALSE, "expected FALSE\n");
8149
8150 hr = IXMLDOMDocument2_get_schemas(doc, &var);
8151 ok_(__FILE__, line)(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
8152 VariantClear(&var);
8153}
8154
8155#define check_set_props(doc) _check_set_props(__LINE__, doc)
8156static inline void _check_set_props(int line, IXMLDOMDocument2* doc)
8157{
8159 VARIANT var;
8160 HRESULT hr;
8161
8162 VariantInit(&var);
8163 hr = IXMLDOMDocument2_getProperty(doc, _bstr_("SelectionLanguage"), &var);
8164 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8165 ok_(__FILE__, line)(lstrcmpW(V_BSTR(&var), L"XPath") == 0, "expected XPath\n");
8166 VariantClear(&var);
8167
8168 hr = IXMLDOMDocument2_getProperty(doc, _bstr_("SelectionNamespaces"), &var);
8169 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8170 ok_(__FILE__, line)(lstrcmpW(V_BSTR(&var), L"xmlns:wi=\'www.winehq.org\'") == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&var)));
8171 VariantClear(&var);
8172
8173 hr = IXMLDOMDocument2_get_preserveWhiteSpace(doc, &b);
8174 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8175 ok_(__FILE__, line)(b == VARIANT_TRUE, "expected TRUE\n");
8176
8177 hr = IXMLDOMDocument2_get_schemas(doc, &var);
8178 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8179 ok_(__FILE__, line)(V_VT(&var) != VT_NULL, "expected pointer\n");
8180 VariantClear(&var);
8181}
8182
8183#define set_props(doc, cache) _set_props(__LINE__, doc, cache)
8185{
8186 VARIANT var;
8187 HRESULT hr;
8188
8189 VariantInit(&var);
8190 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionLanguage"), _variantbstr_("XPath"));
8191 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8192 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionNamespaces"), _variantbstr_("xmlns:wi=\'www.winehq.org\'"));
8193 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8194 hr = IXMLDOMDocument2_put_preserveWhiteSpace(doc, VARIANT_TRUE);
8195 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8196 V_VT(&var) = VT_DISPATCH;
8197 V_DISPATCH(&var) = NULL;
8198 hr = IXMLDOMSchemaCollection_QueryInterface(cache, &IID_IDispatch, (void**)&V_DISPATCH(&var));
8199 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8200 ok_(__FILE__, line)(V_DISPATCH(&var) != NULL, "expected pointer\n");
8201 hr = IXMLDOMDocument2_putref_schemas(doc, var);
8202 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8203 VariantClear(&var);
8204}
8205
8206#define unset_props(doc) _unset_props(__LINE__, doc)
8207static inline void _unset_props(int line, IXMLDOMDocument2* doc)
8208{
8209 VARIANT var;
8210 HRESULT hr;
8211
8212 VariantInit(&var);
8213 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionLanguage"), _variantbstr_("XSLPattern"));
8214 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8215 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionNamespaces"), _variantbstr_(""));
8216 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8217 hr = IXMLDOMDocument2_put_preserveWhiteSpace(doc, VARIANT_FALSE);
8218 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8219 V_VT(&var) = VT_NULL;
8220 hr = IXMLDOMDocument2_putref_schemas(doc, var);
8221 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8222 VariantClear(&var);
8223}
8224
8225static void test_get_ownerDocument(void)
8226{
8227 IXMLDOMDocument *doc1, *doc2, *doc3;
8228 IXMLDOMDocument2 *doc, *doc_owner;
8232 VARIANT var;
8234 IXMLDOMNodeList *node_list;
8236 LONG i, len;
8237 HRESULT hr;
8238 const CHAR nodeXML[] =
8239 "<root id='0'>"
8240 " <!-- comment node 0 -->"
8241 " text node 0"
8242 " <x attr='val'></x>"
8243 " <?foo value='PI for x'?>"
8244 " <![CDATA[ cdata ]]>"
8245 "</root>";
8246
8247 if (!is_clsid_supported(&CLSID_DOMDocument2, &IID_IXMLDOMDocument2)) return;
8248 if (!is_clsid_supported(&CLSID_XMLSchemaCache, &IID_IXMLDOMSchemaCollection)) return;
8249
8250 doc = create_document(&IID_IXMLDOMDocument2);
8251 cache = create_cache(&IID_IXMLDOMSchemaCollection);
8252
8253 VariantInit(&var);
8254
8255 hr = IXMLDOMDocument2_loadXML(doc, _bstr_(complete4A), &b);
8256 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8257 ok(b == VARIANT_TRUE, "failed to load XML string\n");
8258
8260
8261 /* set properties and check that new instances use them */
8262 set_props(doc, cache);
8263 check_set_props(doc);
8264
8265 hr = IXMLDOMDocument2_get_firstChild(doc, &node);
8266 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8267 hr = IXMLDOMNode_get_ownerDocument(node, &doc1);
8268 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8269
8270 /* new interface keeps props */
8271 hr = IXMLDOMDocument_QueryInterface(doc1, &IID_IXMLDOMDocument2, (void**)&doc_owner);
8272 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8273 ok( doc_owner != doc, "got %p, doc %p\n", doc_owner, doc);
8274 check_set_props(doc_owner);
8275 IXMLDOMDocument2_Release(doc_owner);
8276
8277 hr = IXMLDOMNode_get_ownerDocument(node, &doc2);
8278 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8279 IXMLDOMNode_Release(node);
8280
8281 ok(doc1 != doc2, "got %p, expected %p. original %p\n", doc2, doc1, doc);
8282
8283 /* reload */
8284 hr = IXMLDOMDocument2_loadXML(doc, _bstr_(complete4A), &b);
8285 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8286 ok(b == VARIANT_TRUE, "failed to load XML string\n");
8287
8288 /* properties retained even after reload */
8289 check_set_props(doc);
8290
8291 hr = IXMLDOMDocument2_get_firstChild(doc, &node);
8292 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8293 hr = IXMLDOMNode_get_ownerDocument(node, &doc3);
8294 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8295 IXMLDOMNode_Release(node);
8296
8297 hr = IXMLDOMDocument_QueryInterface(doc3, &IID_IXMLDOMDocument2, (void**)&doc_owner);
8298 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8299 ok(doc3 != doc1 && doc3 != doc2 && doc_owner != doc, "got %p, (%p, %p, %p)\n", doc3, doc, doc1, doc2);
8300 check_set_props(doc_owner);
8301
8302 /* changing properties for one instance changes them for all */
8303 unset_props(doc_owner);
8304 check_default_props(doc_owner);
8306
8307 /* NULL check */
8308 hr = IXMLDOMDocument_loadXML(doc1, _bstr_(nodeXML), &b);
8309 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8310 ok(b == VARIANT_TRUE, "failed to load XML string\n");
8311
8312 hr = IXMLDOMDocument_get_documentElement(doc1, &element);
8313 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8314
8315 hr = IXMLDOMElement_get_childNodes(element, &node_list);
8316 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8317
8318 hr = IXMLDOMNodeList_get_length(node_list, &len);
8319 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8320
8321 for(i = 0; i < len; i++) {
8322 hr = IXMLDOMNodeList_get_item(node_list, i, &node);
8323 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8324
8325 hr = IXMLDOMNode_get_ownerDocument(node, NULL);
8326 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8327
8328 IXMLDOMNode_Release(node);
8329 }
8330 IXMLDOMElement_Release(element);
8331
8332 /* Test Attribute Node */
8333 hr = IXMLDOMNodeList_get_item(node_list, 2, &node);
8334 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8335 hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMElement, (void**)&element);
8336 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8337 IXMLDOMNode_Release(node);
8338
8339 hr = IXMLDOMElement_getAttributeNode(element, _bstr_("attr"), &attr);
8340 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8341 ok(attr != NULL, "attr == NULL\n");
8342 IXMLDOMElement_Release(element);
8343 hr = IXMLDOMAttribute_get_ownerDocument(attr, NULL);
8344 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8345 IXMLDOMAttribute_Release(attr);
8346 IXMLDOMNodeList_Release(node_list);
8347
8348 IXMLDOMSchemaCollection_Release(cache);
8349 IXMLDOMDocument_Release(doc1);
8350 IXMLDOMDocument_Release(doc2);
8351 IXMLDOMDocument_Release(doc3);
8352 IXMLDOMDocument2_Release(doc);
8353 IXMLDOMDocument2_Release(doc_owner);
8354 free_bstrs();
8355}
8356
8357static void test_setAttributeNode(void)
8358{
8359 IXMLDOMDocument *doc, *doc2;
8360 IXMLDOMElement *elem, *elem2;
8361 IXMLDOMAttribute *attr, *attr2, *ret_attr;
8363 HRESULT hr;
8364 VARIANT v;
8365 BSTR str;
8366 ULONG ref1, ref2;
8367
8368 doc = create_document(&IID_IXMLDOMDocument);
8369
8370 hr = IXMLDOMDocument_loadXML( doc, _bstr_(complete4A), &b );
8371 ok( hr == S_OK, "loadXML failed\n");
8372 ok( b == VARIANT_TRUE, "failed to load XML string\n");
8373
8374 hr = IXMLDOMDocument_get_documentElement(doc, &elem);
8375 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8376
8377 hr = IXMLDOMDocument_get_documentElement(doc, &elem2);
8378 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8379 ok( elem2 != elem, "got same instance\n");
8380
8381 ret_attr = (void*)0xdeadbeef;
8382 hr = IXMLDOMElement_setAttributeNode(elem, NULL, &ret_attr);
8383 ok( hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8384 ok( ret_attr == (void*)0xdeadbeef, "got %p\n", ret_attr);
8385
8386 hr = IXMLDOMDocument_createAttribute(doc, _bstr_("attr"), &attr);
8387 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8388
8389 ref1 = IXMLDOMElement_AddRef(elem);
8390 IXMLDOMElement_Release(elem);
8391
8392 ret_attr = (void*)0xdeadbeef;
8393 hr = IXMLDOMElement_setAttributeNode(elem, attr, &ret_attr);
8394 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8395 ok( ret_attr == NULL, "got %p\n", ret_attr);
8396
8397 /* no reference added */
8398 ref2 = IXMLDOMElement_AddRef(elem);
8399 IXMLDOMElement_Release(elem);
8400 ok(ref2 == ref1, "got %ld, expected %ld\n", ref2, ref1);
8401
8403 EXPECT_CHILDREN(elem2);
8404
8405 IXMLDOMElement_Release(elem2);
8406
8407 attr2 = NULL;
8408 hr = IXMLDOMElement_getAttributeNode(elem, _bstr_("attr"), &attr2);
8409 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8410 ok( attr2 != attr, "got same instance %p\n", attr2);
8411 IXMLDOMAttribute_Release(attr2);
8412
8413 /* try to add it another time */
8414 ret_attr = (void*)0xdeadbeef;
8415 hr = IXMLDOMElement_setAttributeNode(elem, attr, &ret_attr);
8416 ok( hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
8417 ok( ret_attr == (void*)0xdeadbeef, "got %p\n", ret_attr);
8418
8419 IXMLDOMElement_Release(elem);
8420
8421 /* initially used element is released, attribute still 'has' a container */
8422 hr = IXMLDOMDocument_get_documentElement(doc, &elem);
8423 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8424 ret_attr = (void*)0xdeadbeef;
8425 hr = IXMLDOMElement_setAttributeNode(elem, attr, &ret_attr);
8426 ok( hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
8427 ok( ret_attr == (void*)0xdeadbeef, "got %p\n", ret_attr);
8428 IXMLDOMElement_Release(elem);
8429
8430 /* add attribute already attached to another document */
8431 doc2 = create_document(&IID_IXMLDOMDocument);
8432
8433 hr = IXMLDOMDocument_loadXML( doc2, _bstr_(complete4A), &b );
8434 ok( hr == S_OK, "loadXML failed\n");
8435 ok( b == VARIANT_TRUE, "failed to load XML string\n");
8436
8437 hr = IXMLDOMDocument_get_documentElement(doc2, &elem);
8438 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8439 hr = IXMLDOMElement_setAttributeNode(elem, attr, NULL);
8440 ok( hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
8441 IXMLDOMElement_Release(elem);
8442
8443 IXMLDOMAttribute_Release(attr);
8444
8445 /* create element, add attribute, see if it's copied or linked */
8446 hr = IXMLDOMDocument_createElement(doc, _bstr_("test"), &elem);
8447 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8448
8449 attr = NULL;
8450 hr = IXMLDOMDocument_createAttribute(doc, _bstr_("attr"), &attr);
8451 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8452 ok(attr != NULL, "got %p\n", attr);
8453
8454 ref1 = IXMLDOMAttribute_AddRef(attr);
8455 IXMLDOMAttribute_Release(attr);
8456
8457 V_VT(&v) = VT_BSTR;
8458 V_BSTR(&v) = _bstr_("attrvalue1");
8459 hr = IXMLDOMAttribute_put_nodeValue(attr, v);
8460 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8461
8462 str = NULL;
8463 hr = IXMLDOMAttribute_get_xml(attr, &str);
8464 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8465 ok(lstrcmpW(str, L"attr=\"attrvalue1\"") == 0,
8466 "got %s\n", wine_dbgstr_w(str));
8468
8469 ret_attr = (void*)0xdeadbeef;
8470 hr = IXMLDOMElement_setAttributeNode(elem, attr, &ret_attr);
8471 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8472 ok(ret_attr == NULL, "got %p\n", ret_attr);
8473
8474 /* attribute reference increased */
8475 ref2 = IXMLDOMAttribute_AddRef(attr);
8476 IXMLDOMAttribute_Release(attr);
8477 ok(ref1 == ref2, "got %ld, expected %ld\n", ref2, ref1);
8478
8479 hr = IXMLDOMElement_get_xml(elem, &str);
8480 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8481 ok(lstrcmpW(str, L"<test attr=\"attrvalue1\"/>") == 0,
8482 "got %s\n", wine_dbgstr_w(str));
8484
8485 V_VT(&v) = VT_BSTR;
8486 V_BSTR(&v) = _bstr_("attrvalue2");
8487 hr = IXMLDOMAttribute_put_nodeValue(attr, v);
8488 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8489
8490 hr = IXMLDOMElement_get_xml(elem, &str);
8491 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8492 todo_wine ok(lstrcmpW(str, L"<test attr=\"attrvalue2\"/>") == 0,
8493 "got %s\n", wine_dbgstr_w(str));
8495
8496 IXMLDOMElement_Release(elem);
8497 IXMLDOMAttribute_Release(attr);
8498 IXMLDOMDocument_Release(doc2);
8499 IXMLDOMDocument_Release(doc);
8500 free_bstrs();
8501}
8502
8503static void test_createNode(void)
8504{
8505 IXMLDOMDocument *doc;
8508 VARIANT v, var;
8509 BSTR prefix, str;
8510 HRESULT hr;
8511 ULONG ref;
8512
8513 doc = create_document(&IID_IXMLDOMDocument);
8514
8515 EXPECT_REF(doc, 1);
8516
8517 /* reference count tests */
8518 hr = IXMLDOMDocument_createElement(doc, _bstr_("elem"), &elem);
8519 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8520
8521 /* initial reference is 2 */
8522todo_wine {
8523 EXPECT_REF(elem, 2);
8524 ref = IXMLDOMElement_Release(elem);
8525 ok(ref == 1, "got %ld\n", ref);
8526 /* it's released already, attempt to release now will crash it */
8527}
8528
8529 hr = IXMLDOMDocument_createElement(doc, _bstr_("elem"), &elem);
8530 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8532 IXMLDOMDocument_Release(doc);
8534 IXMLDOMElement_Release(elem);
8535
8536 doc = create_document(&IID_IXMLDOMDocument);
8537
8538 /* NODE_ELEMENT nodes */
8539 /* 1. specified namespace */
8540 V_VT(&v) = VT_I4;
8541 V_I4(&v) = NODE_ELEMENT;
8542
8543 hr = IXMLDOMDocument_createNode(doc, v, _bstr_("ns1:test"), _bstr_("http://winehq.org"), &node);
8544 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8545 prefix = NULL;
8546 hr = IXMLDOMNode_get_prefix(node, &prefix);
8547 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8548 ok(lstrcmpW(prefix, L"ns1") == 0, "wrong prefix\n");
8550 IXMLDOMNode_Release(node);
8551
8552 /* 2. default namespace */
8553 hr = IXMLDOMDocument_createNode(doc, v, _bstr_("test"), _bstr_("http://winehq.org/default"), &node);
8554 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8555 prefix = (void*)0xdeadbeef;
8556 hr = IXMLDOMNode_get_prefix(node, &prefix);
8557 ok( hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
8558 ok(prefix == 0, "expected empty prefix, got %p\n", prefix);
8559 /* check dump */
8560 hr = IXMLDOMNode_get_xml(node, &str);
8561 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8562 ok(lstrcmpW(str, L"<test xmlns=\"http://winehq.org/default\"/>") == 0,
8563 "got %s\n", wine_dbgstr_w(str));
8565
8566 hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMElement, (void**)&elem);
8567 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8568
8569 V_VT(&var) = VT_BSTR;
8570 hr = IXMLDOMElement_getAttribute(elem, _bstr_("xmlns"), &var);
8571 ok( hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
8572 ok( V_VT(&var) == VT_NULL, "got %d\n", V_VT(&var));
8573
8574 str = NULL;
8575 hr = IXMLDOMElement_get_namespaceURI(elem, &str);
8576 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8577 ok(lstrcmpW(str, L"http://winehq.org/default") == 0, "expected default namespace\n");
8579
8580 IXMLDOMElement_Release(elem);
8581 IXMLDOMNode_Release(node);
8582
8583 IXMLDOMDocument_Release(doc);
8584 free_bstrs();
8585}
8586
8587static const char get_prefix_doc[] =
8588 "<?xml version=\"1.0\" ?>"
8589 "<a xmlns:ns1=\"ns1 href\" />";
8590
8591static void test_get_prefix(void)
8592{
8593 IXMLDOMDocumentFragment *fragment;
8594 IXMLDOMCDATASection *cdata;
8597 IXMLDOMDocument *doc;
8599 HRESULT hr;
8600 BSTR str;
8601
8602 doc = create_document(&IID_IXMLDOMDocument);
8603
8604 /* nodes that can't support prefix */
8605 /* 1. document */
8606 str = (void*)0xdeadbeef;
8607 hr = IXMLDOMDocument_get_prefix(doc, &str);
8608 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
8609 ok(str == NULL, "got %p\n", str);
8610
8611 hr = IXMLDOMDocument_get_prefix(doc, NULL);
8612 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8613
8614 /* 2. cdata */
8615 hr = IXMLDOMDocument_createCDATASection(doc, NULL, &cdata);
8616 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8617
8618 str = (void*)0xdeadbeef;
8619 hr = IXMLDOMCDATASection_get_prefix(cdata, &str);
8620 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
8621 ok( str == 0, "got %p\n", str);
8622
8623 hr = IXMLDOMCDATASection_get_prefix(cdata, NULL);
8624 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8625 IXMLDOMCDATASection_Release(cdata);
8626
8627 /* 3. comment */
8628 hr = IXMLDOMDocument_createComment(doc, NULL, &comment);
8629 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8630
8631 str = (void*)0xdeadbeef;
8632 hr = IXMLDOMComment_get_prefix(comment, &str);
8633 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
8634 ok( str == 0, "got %p\n", str);
8635
8636 hr = IXMLDOMComment_get_prefix(comment, NULL);
8637 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8638 IXMLDOMComment_Release(comment);
8639
8640 /* 4. fragment */
8641 hr = IXMLDOMDocument_createDocumentFragment(doc, &fragment);
8642 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8643
8644 str = (void*)0xdeadbeef;
8645 hr = IXMLDOMDocumentFragment_get_prefix(fragment, &str);
8646 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
8647 ok( str == 0, "got %p\n", str);
8648
8649 hr = IXMLDOMDocumentFragment_get_prefix(fragment, NULL);
8650 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8651 IXMLDOMDocumentFragment_Release(fragment);
8652
8653 /* no prefix */
8654 hr = IXMLDOMDocument_createElement(doc, _bstr_("elem"), &element);
8655 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8656
8657 hr = IXMLDOMElement_get_prefix(element, NULL);
8658 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8659
8660 str = (void*)0xdeadbeef;
8661 hr = IXMLDOMElement_get_prefix(element, &str);
8662 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
8663 ok(str == 0, "got %p\n", str);
8664
8665 IXMLDOMElement_Release(element);
8666
8667 /* with prefix */
8668 hr = IXMLDOMDocument_createElement(doc, _bstr_("a:elem"), &element);
8669 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8670
8671 str = (void*)0xdeadbeef;
8672 hr = IXMLDOMElement_get_prefix(element, &str);
8673 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
8674 ok(lstrcmpW(str, L"a") == 0, "expected prefix \"a\"\n");
8676
8677 str = (void*)0xdeadbeef;
8678 hr = IXMLDOMElement_get_namespaceURI(element, &str);
8679 ok( hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
8680 ok( str == 0, "got %p\n", str);
8681
8682 IXMLDOMElement_Release(element);
8683
8684 hr = IXMLDOMDocument_loadXML(doc, _bstr_(get_prefix_doc), &b);
8685 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8686
8687 hr = IXMLDOMDocument_get_documentElement(doc, &element);
8688 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8689
8690 str = (void*)0xdeadbeef;
8691 hr = IXMLDOMElement_get_prefix(element, &str);
8692 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
8693 ok(str == NULL, "got %p\n", str);
8694
8695 str = (void*)0xdeadbeef;
8696 hr = IXMLDOMElement_get_namespaceURI(element, &str);
8697 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
8698 ok(str == NULL, "got %s\n", wine_dbgstr_w(str));
8699
8700 IXMLDOMDocument_Release(doc);
8701 free_bstrs();
8702}
8703
8704static void test_selectSingleNode(void)
8705{
8706 IXMLDOMDocument *doc;
8710 HRESULT hr;
8711 LONG len;
8712
8713 doc = create_document(&IID_IXMLDOMDocument);
8714
8715 hr = IXMLDOMDocument_selectSingleNode(doc, NULL, NULL);
8716 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8717
8718 hr = IXMLDOMDocument_selectNodes(doc, NULL, NULL);
8719 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8720
8721 hr = IXMLDOMDocument_loadXML( doc, _bstr_(complete4A), &b );
8722 ok( hr == S_OK, "loadXML failed\n");
8723 ok( b == VARIANT_TRUE, "failed to load XML string\n");
8724
8725 hr = IXMLDOMDocument_selectSingleNode(doc, NULL, NULL);
8726 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8727
8728 hr = IXMLDOMDocument_selectNodes(doc, NULL, NULL);
8729 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8730
8731 hr = IXMLDOMDocument_selectSingleNode(doc, _bstr_("lc"), NULL);
8732 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8733
8734 hr = IXMLDOMDocument_selectNodes(doc, _bstr_("lc"), NULL);
8735 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8736
8737 hr = IXMLDOMDocument_selectSingleNode(doc, _bstr_("lc"), &node);
8738 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8739 IXMLDOMNode_Release(node);
8740
8741 hr = IXMLDOMDocument_selectNodes(doc, _bstr_("lc"), &list);
8742 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8743 IXMLDOMNodeList_Release(list);
8744
8745 list = (void*)0xdeadbeef;
8746 hr = IXMLDOMDocument_selectNodes(doc, NULL, &list);
8747 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
8748 ok(list == (void*)0xdeadbeef, "got %p\n", list);
8749
8750 node = (void*)0xdeadbeef;
8751 hr = IXMLDOMDocument_selectSingleNode(doc, _bstr_("nonexistent"), &node);
8752 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
8753 ok(node == 0, "got %p\n", node);
8754
8755 list = (void*)0xdeadbeef;
8756 hr = IXMLDOMDocument_selectNodes(doc, _bstr_("nonexistent"), &list);
8757 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8758 len = 1;
8759 hr = IXMLDOMNodeList_get_length(list, &len);
8760 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8761 ok(len == 0, "got %ld\n", len);
8762 IXMLDOMNodeList_Release(list);
8763
8764 IXMLDOMDocument_Release(doc);
8765 free_bstrs();
8766}
8767
8768static void test_events(void)
8769{
8772 IXMLDOMDocument *doc;
8773 HRESULT hr;
8774 VARIANT v;
8776
8777 doc = create_document(&IID_IXMLDOMDocument);
8778
8779 hr = IXMLDOMDocument_QueryInterface(doc, &IID_IConnectionPointContainer, (void**)&conn);
8780 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8781
8782 hr = IConnectionPointContainer_FindConnectionPoint(conn, &IID_IDispatch, &point);
8783 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8784 IConnectionPoint_Release(point);
8785 hr = IConnectionPointContainer_FindConnectionPoint(conn, &IID_IPropertyNotifySink, &point);
8786 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8787 IConnectionPoint_Release(point);
8788 hr = IConnectionPointContainer_FindConnectionPoint(conn, &DIID_XMLDOMDocumentEvents, &point);
8789 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8790 IConnectionPoint_Release(point);
8791
8792 IConnectionPointContainer_Release(conn);
8793
8794 /* ready state callback */
8795 VariantInit(&v);
8796 hr = IXMLDOMDocument_put_onreadystatechange(doc, v);
8797 ok(hr == DISP_E_TYPEMISMATCH, "Unexpected hr %#lx.\n", hr);
8798
8799 event = create_dispevent();
8800 V_VT(&v) = VT_UNKNOWN;
8801 V_UNKNOWN(&v) = (IUnknown*)event;
8802
8803 hr = IXMLDOMDocument_put_onreadystatechange(doc, v);
8804 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8805 EXPECT_REF(event, 2);
8806
8807 V_VT(&v) = VT_DISPATCH;
8808 V_DISPATCH(&v) = event;
8809
8810 hr = IXMLDOMDocument_put_onreadystatechange(doc, v);
8811 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8812 EXPECT_REF(event, 2);
8813
8814 /* VT_NULL doesn't reset event handler */
8815 V_VT(&v) = VT_NULL;
8816 hr = IXMLDOMDocument_put_onreadystatechange(doc, v);
8817 ok(hr == DISP_E_TYPEMISMATCH, "Unexpected hr %#lx.\n", hr);
8818 EXPECT_REF(event, 2);
8819
8820 V_VT(&v) = VT_DISPATCH;
8821 V_DISPATCH(&v) = NULL;
8822
8823 hr = IXMLDOMDocument_put_onreadystatechange(doc, v);
8824 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8825 EXPECT_REF(event, 1);
8826
8827 V_VT(&v) = VT_UNKNOWN;
8828 V_DISPATCH(&v) = NULL;
8829 hr = IXMLDOMDocument_put_onreadystatechange(doc, v);
8830 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8831
8832 IDispatch_Release(event);
8833
8834 IXMLDOMDocument_Release(doc);
8835}
8836
8838{
8839 static const WCHAR xml1[] = L"<?xml version=\"1.0\"?>\r\n<test/>\r\n";
8840 static const char xml2[] = "<?xml version=\"1.0\" encoding=\"windows-1252\"?>\r\n<test/>\r\n";
8841 static const char xml2_wine[] = "<?xml version=\"1.0\" encoding=\"windows-1252\"?>\n<test/>\n";
8842 static const char xml3[] = "<?xml version=\"1.0\" standalone=\"yes\"?>\r\n<test/>\r\n";
8843 static const char xml3_wine[] = "<?xml version=\"1.0\" standalone=\"yes\"?>\n<test/>\n";
8845 IXMLDOMDocument *doc;
8847 IXMLDOMNamedNodeMap *node_map;
8849 WCHAR buff[10];
8850 BSTR xml, bstr;
8851 VARIANT var;
8852 HRESULT hr;
8853 IStream *stream;
8854 LARGE_INTEGER off;
8857 char *p;
8858
8859 doc = create_document(&IID_IXMLDOMDocument);
8860
8861 hr = IXMLDOMDocument_createProcessingInstruction(doc, _bstr_("xml"), _bstr_("version=\"1.0\" encoding=\"windows-1252\" dummy=\"value\""), &pi);
8862 ok(hr == XML_E_UNEXPECTED_ATTRIBUTE, "Unexpected hr %#lx.\n", hr);
8863 hr = IXMLDOMDocument_createProcessingInstruction(doc, NULL, _bstr_("version=\"1.0\" encoding=\"UTF-8\""), &pi);
8864 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
8865 hr = IXMLDOMDocument_createProcessingInstruction(doc, _bstr_("xml"), NULL, &pi);
8866 ok(hr == XML_E_XMLDECLSYNTAX, "Unexpected hr %#lx.\n", hr);
8867 hr = IXMLDOMDocument_createProcessingInstruction(doc, _bstr_("xml"), _bstr_("version=\"1.0\" encoding=UTF-8"), &pi);
8868 ok(hr == XML_E_MISSINGQUOTE, "Unexpected hr %#lx.\n", hr);
8869 hr = IXMLDOMDocument_createProcessingInstruction(doc, _bstr_("xml"), _bstr_("version=\"1.0\" encoding='UTF-8\""), &pi);
8870 ok(hr == XML_E_BADCHARINSTRING, "Unexpected hr %#lx.\n", hr);
8871 hr = IXMLDOMDocument_createProcessingInstruction(doc, _bstr_("xml"), _bstr_("version=\"1.0\" encoding=\"UTF-8"), &pi);
8872 ok(hr == XML_E_BADCHARINSTRING, "Unexpected hr %#lx.\n", hr);
8873 pi = NULL;
8874 hr = IXMLDOMDocument_createProcessingInstruction(doc, _bstr_("xml"), _bstr_("version=\"1.0\" encoding='UTF-8'"), &pi);
8875 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8876 hr = IXMLDOMProcessingInstruction_QueryInterface(pi, &IID_IXMLDOMNode, (void **)&node);
8877 node_map = NULL;
8878 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8879 hr = IXMLDOMNode_get_attributes(node, &node_map);
8880 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8881 IXMLDOMNamedNodeMap_Release(node_map);
8882 IXMLDOMNode_Release(node);
8883 IXMLDOMProcessingInstruction_Release(pi);
8884
8885 /* test for BSTR handling, pass broken BSTR */
8886 memcpy(&buff[2], L"test", 5 * sizeof(WCHAR));
8887 /* just a big length */
8888 *(DWORD*)buff = 0xf0f0;
8889 hr = IXMLDOMDocument_createProcessingInstruction(doc, _bstr_("test"), &buff[2], &pi);
8890 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8891
8892 IXMLDOMProcessingInstruction_Release(pi);
8893 IXMLDOMDocument_Release(doc);
8894
8895 doc = create_document(&IID_IXMLDOMDocument);
8896
8897 hr = IXMLDOMDocument_createProcessingInstruction(doc, _bstr_("xml"), _bstr_("version=\"1.0\" encoding=\"windows-1252\""), &pi);
8898 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8899 hr = IXMLDOMProcessingInstruction_QueryInterface(pi, &IID_IXMLDOMNode, (void **)&node);
8900 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8901 hr = IXMLDOMDocument_appendChild(doc, node, NULL);
8902 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8903
8904 hr = IXMLDOMNode_get_attributes(node, &node_map);
8905 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8906
8907 item = (void *)0xdeadbeef;
8908 hr = IXMLDOMNamedNodeMap_getNamedItem(node_map, _bstr_("xml"), &item);
8909 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
8910 ok(!item, "got %p\n", item);
8911
8912 item = NULL;
8913 hr = IXMLDOMNamedNodeMap_getNamedItem(node_map, _bstr_("encoding"), &item);
8914 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8915 ok(item != NULL, "got NULL\n");
8916
8917 hr = IXMLDOMNode_get_nodeName(item, &bstr);
8918 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8919 ok(!lstrcmpW(bstr, L"encoding"), "got %s\n", wine_dbgstr_w(bstr));
8920 SysFreeString(bstr);
8921
8922 VariantInit(&var);
8923 hr = IXMLDOMNode_get_nodeValue(item, &var);
8924 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8925 ok(V_VT(&var) == VT_BSTR, "got %u\n", V_VT(&var));
8926 ok(!lstrcmpW(V_BSTR(&var), L"windows-1252"), "got %s\n", wine_dbgstr_w(V_BSTR(&var)));
8927 VariantClear(&var);
8928
8929 IXMLDOMNamedNodeMap_Release(node_map);
8930 IXMLDOMNode_Release(node);
8931 IXMLDOMProcessingInstruction_Release(pi);
8932
8933 hr = IXMLDOMDocument_createElement(doc, _bstr_("test"), &element);
8934 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8935 hr = IXMLDOMDocument_appendChild(doc, (IXMLDOMNode *)element, NULL);
8936 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8937 IXMLDOMElement_Release(element);
8938
8939 hr = IXMLDOMDocument_get_xml(doc, &xml);
8940 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8941 todo_wine
8942 ok(!wcscmp(xml, xml1), "got %s\n", wine_dbgstr_w(xml));
8943 SysFreeString(xml);
8944
8946 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8947 V_VT(&var) = VT_UNKNOWN;
8949 hr = IXMLDOMDocument_save(doc, var);
8950 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8951
8953 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8954 p = GlobalLock(global);
8955 ok(!memcmp(p, xml2, sizeof(xml2) - 1) || !memcmp(p, xml2_wine, sizeof(xml2_wine) - 1), "got %s\n", wine_dbgstr_a(p));
8957
8958 /* Verify the result after load+save */
8959 off.QuadPart = 0;
8960 hr = IStream_Seek(stream, off, STREAM_SEEK_SET, NULL);
8961 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8962
8963 hr = IXMLDOMDocument_load(doc, var, &b);
8964 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8965 ok(b == VARIANT_TRUE, "got %d\n", b);
8966
8967 off.QuadPart = 0;
8968 hr = IStream_Seek(stream, off, STREAM_SEEK_SET, NULL);
8969 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8970
8971 hr = IXMLDOMDocument_save(doc, var);
8972 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8973
8975 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8976 p = GlobalLock(global);
8977 ok(!memcmp(p, xml2, sizeof(xml2) - 1) || !memcmp(p, xml2_wine, sizeof(xml2_wine) - 1), "got %s\n", wine_dbgstr_a(p));
8979
8980 IStream_Release(stream);
8981
8982 hr = IXMLDOMDocument_loadXML(doc, _bstr_("<?xml version=\"1.0\" standalone=\"yes\"?>\r\n<test/>\r\n"), &b);
8983 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8984 ok(b == VARIANT_TRUE, "got %d\n", b);
8985
8987 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8988
8989 V_VT(&var) = VT_UNKNOWN;
8991 hr = IXMLDOMDocument_save(doc, var);
8992 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8993
8995 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8996
8997 p = GlobalLock(global);
8998 ok(!memcmp(p, xml3, sizeof(xml3) - 1) || !memcmp(p, xml3_wine, sizeof(xml3_wine) - 1), "got %s\n", wine_dbgstr_a(p));
9000
9001 IStream_Release(stream);
9002 IXMLDOMDocument_Release(doc);
9003}
9004
9006{
9007 static const BYTE binhexdata[16] =
9008 {0,1,2,3,4,5,6,7,8,9,0xa,0xb,0xc,0xd,0xe,0xf};
9009 IXMLDOMDocument *doc;
9012 LONG ubound, lbound;
9015 HRESULT hr;
9016 BYTE *ptr;
9017 BSTR str;
9018
9019 doc = create_document(&IID_IXMLDOMDocument);
9020
9021 hr = IXMLDOMDocument_createElement(doc, _bstr_("Element"), &elem);
9022 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9023
9024 V_VT(&type) = VT_EMPTY;
9025 hr = IXMLDOMElement_get_dataType(elem, &type);
9026 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
9027 ok(V_VT(&type) == VT_NULL, "got %d, expected VT_NULL\n", V_VT(&type));
9028
9029 /* set typed value for untyped node */
9030 V_VT(&type) = VT_I1;
9031 V_I1(&type) = 1;
9032 hr = IXMLDOMElement_put_nodeTypedValue(elem, type);
9033 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9034
9035 V_VT(&type) = VT_EMPTY;
9036 hr = IXMLDOMElement_get_dataType(elem, &type);
9037 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
9038 ok(V_VT(&type) == VT_NULL, "got %d, expected VT_NULL\n", V_VT(&type));
9039
9040 /* no type info stored */
9041 V_VT(&type) = VT_EMPTY;
9042 hr = IXMLDOMElement_get_nodeTypedValue(elem, &type);
9043 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9044 ok(V_VT(&type) == VT_BSTR, "got %d, expected VT_BSTR\n", V_VT(&type));
9045 ok(memcmp(V_BSTR(&type), L"1", 2*sizeof(WCHAR)) == 0,
9046 "got %s, expected \"1\"\n", wine_dbgstr_w(V_BSTR(&type)));
9048
9049 /* int */
9050 hr = IXMLDOMElement_put_dataType(elem, _bstr_("int"));
9051 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9052
9053 V_VT(&value) = VT_BSTR;
9054 V_BSTR(&value) = _bstr_("1");
9055 hr = IXMLDOMElement_put_nodeTypedValue(elem, value);
9056 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9057
9058 V_VT(&value) = VT_EMPTY;
9059 hr = IXMLDOMElement_get_nodeTypedValue(elem, &value);
9060 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9061 ok(V_VT(&value) == VT_I4, "got %d\n", V_VT(&value));
9062 ok(V_I4(&value) == 1, "got %ld\n", V_I4(&value));
9063
9064 V_VT(&value) = VT_I2;
9065 V_I2(&value) = -1;
9066 hr = IXMLDOMElement_put_nodeTypedValue(elem, value);
9067 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9068
9069 V_VT(&value) = VT_EMPTY;
9070 hr = IXMLDOMElement_get_nodeTypedValue(elem, &value);
9071 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9072 ok(V_VT(&value) == VT_I4, "got %d\n", V_VT(&value));
9073 ok(V_I4(&value) == -1, "got %ld\n", V_I4(&value));
9074
9075 hr = IXMLDOMElement_get_firstChild(elem, &node);
9076 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9077 hr = IXMLDOMElement_removeChild(elem, node, NULL);
9078 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9079 IXMLDOMNode_Release(node);
9080
9081 hr = IXMLDOMDocument_appendChild(doc, (IXMLDOMNode*)elem, NULL);
9082 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9083
9084 /* bin.base64 */
9085 hr = IXMLDOMElement_put_dataType(elem, _bstr_("bin.base64"));
9086 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9087
9088 V_VT(&value) = VT_BSTR;
9089 V_BSTR(&value) = _bstr_("ABCD");
9090 hr = IXMLDOMElement_put_nodeTypedValue(elem, value);
9091 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9092
9093 V_VT(&value) = VT_EMPTY;
9094 hr = IXMLDOMElement_get_nodeTypedValue(elem, &value);
9095 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9096 ok(V_VT(&value) == (VT_UI1|VT_ARRAY), "got %d\n", V_VT(&value));
9097 ok(SafeArrayGetDim(V_ARRAY(&value)) == 1, "got wrong dimension\n");
9098 ubound = 0;
9099 hr = SafeArrayGetUBound(V_ARRAY(&value), 1, &ubound);
9100 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9101 ok(ubound == 2, "got %ld\n", ubound);
9102 lbound = 0;
9103 hr = SafeArrayGetLBound(V_ARRAY(&value), 1, &lbound);
9104 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9105 ok(lbound == 0, "got %ld\n", lbound);
9106 hr = SafeArrayAccessData(V_ARRAY(&value), (void*)&ptr);
9107 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9108 ok(ptr[0] == 0, "got %x\n", ptr[0]);
9109 ok(ptr[1] == 0x10, "got %x\n", ptr[1]);
9110 ok(ptr[2] == 0x83, "got %x\n", ptr[2]);
9113
9114 /* when set as VT_BSTR it's stored as is */
9115 hr = IXMLDOMElement_get_firstChild(elem, &node);
9116 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9117 hr = IXMLDOMNode_get_text(node, &str);
9118 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9119 ok(!lstrcmpW(str, L"ABCD"), "%s\n", wine_dbgstr_w(str));
9120 IXMLDOMNode_Release(node);
9122
9124 hr = SafeArrayAccessData(array, (void*)&ptr);
9125 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9126 memcpy(ptr, "dGVzdA=", strlen("dGVzdA="));
9128
9130 V_ARRAY(&value) = array;
9131 hr = IXMLDOMElement_put_nodeTypedValue(elem, value);
9132 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9133
9134 V_VT(&value) = VT_EMPTY;
9135 hr = IXMLDOMElement_get_nodeTypedValue(elem, &value);
9136 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9137 ok(V_VT(&value) == (VT_UI1|VT_ARRAY), "got %d\n", V_VT(&value));
9138 ok(SafeArrayGetDim(V_ARRAY(&value)) == 1, "got wrong dimension\n");
9139 ubound = 0;
9140 hr = SafeArrayGetUBound(V_ARRAY(&value), 1, &ubound);
9141 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9142 ok(ubound == 6, "got %ld\n", ubound);
9143 lbound = 0;
9144 hr = SafeArrayGetLBound(V_ARRAY(&value), 1, &lbound);
9145 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9146 ok(lbound == 0, "got %ld\n", lbound);
9147 hr = SafeArrayAccessData(V_ARRAY(&value), (void*)&ptr);
9148 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9149 ok(!memcmp(ptr, "dGVzdA=", strlen("dGVzdA=")), "got wrong data, %s\n", ptr);
9152
9153 /* if set with VT_UI1|VT_ARRAY it's encoded */
9154 hr = IXMLDOMElement_get_firstChild(elem, &node);
9155 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9156 hr = IXMLDOMNode_get_text(node, &str);
9157 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9158 ok(!lstrcmpW(str, L"ZEdWemRBPQ=="), "%s\n", wine_dbgstr_w(str));
9159 IXMLDOMNode_Release(node);
9162
9163 /* bin.hex */
9164 V_VT(&value) = VT_BSTR;
9165 V_BSTR(&value) = _bstr_("");
9166 hr = IXMLDOMElement_put_nodeTypedValue(elem, value);
9167 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9168
9169 hr = IXMLDOMElement_put_dataType(elem, _bstr_("bin.hex"));
9170 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9171
9173 hr = SafeArrayAccessData(array, (void*)&ptr);
9174 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9175 memcpy(ptr, binhexdata, sizeof(binhexdata));
9177
9179 V_ARRAY(&value) = array;
9180 hr = IXMLDOMElement_put_nodeTypedValue(elem, value);
9181 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9182
9183 V_VT(&value) = VT_EMPTY;
9184 hr = IXMLDOMElement_get_nodeTypedValue(elem, &value);
9185 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9186 ok(V_VT(&value) == (VT_UI1|VT_ARRAY), "got %d\n", V_VT(&value));
9187 ok(SafeArrayGetDim(V_ARRAY(&value)) == 1, "got wrong dimension\n");
9188 ubound = 0;
9189 hr = SafeArrayGetUBound(V_ARRAY(&value), 1, &ubound);
9190 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9191 ok(ubound == 15, "got %ld\n", ubound);
9192 lbound = 0;
9193 hr = SafeArrayGetLBound(V_ARRAY(&value), 1, &lbound);
9194 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9195 ok(lbound == 0, "got %ld\n", lbound);
9196 hr = SafeArrayAccessData(V_ARRAY(&value), (void*)&ptr);
9197 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9198 ok(!memcmp(ptr, binhexdata, sizeof(binhexdata)), "got wrong data\n");
9201
9202 /* if set with VT_UI1|VT_ARRAY it's encoded */
9203 hr = IXMLDOMElement_get_firstChild(elem, &node);
9204 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9205 hr = IXMLDOMNode_get_text(node, &str);
9206 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9207 ok(!lstrcmpW(str, L"000102030405060708090a0b0c0d0e0f"), "%s\n", wine_dbgstr_w(str));
9208 IXMLDOMNode_Release(node);
9211
9212 IXMLDOMElement_Release(elem);
9213 IXMLDOMDocument_Release(doc);
9214 free_bstrs();
9215}
9216
9217static void test_get_xml(void)
9218{
9219 static const char xmlA[] = "<?xml version=\"1.0\" encoding=\"UTF-16\"?>\r\n<a>test</a>\r\n";
9220 static const char attrA[] = "attr=\"&quot;a &amp; b&quot;\"";
9221 static const char attr2A[] = "\"a & b\"";
9222 static const char attr3A[] = "attr=\"&amp;quot;a\"";
9223 static const char attr4A[] = "&quot;a";
9224 static const char fooA[] = "<foo/>";
9229 IXMLDOMDocument *doc;
9231 VARIANT v;
9232 BSTR xml;
9233 HRESULT hr;
9234
9235 doc = create_document(&IID_IXMLDOMDocument);
9236
9237 b = VARIANT_TRUE;
9238 hr = IXMLDOMDocument_loadXML( doc, _bstr_("<a>test</a>"), &b );
9239 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9240 ok( b == VARIANT_TRUE, "got %d\n", b);
9241
9242 hr = IXMLDOMDocument_createProcessingInstruction(doc, _bstr_("xml"),
9243 _bstr_("version=\"1.0\" encoding=\"UTF-16\""), &pi);
9244 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9245
9246 hr = IXMLDOMDocument_get_firstChild(doc, &first);
9247 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9248
9249 V_UNKNOWN(&v) = (IUnknown*)first;
9250 V_VT(&v) = VT_UNKNOWN;
9251
9252 hr = IXMLDOMDocument_insertBefore(doc, (IXMLDOMNode*)pi, v, NULL);
9253 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9254
9255 IXMLDOMProcessingInstruction_Release(pi);
9256 IXMLDOMNode_Release(first);
9257
9258 hr = IXMLDOMDocument_get_xml(doc, &xml);
9259 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9260
9261 ok(memcmp(xml, _bstr_(xmlA), sizeof(xmlA)*sizeof(WCHAR)) == 0,
9262 "got %s, expected %s\n", wine_dbgstr_w(xml), xmlA);
9263 SysFreeString(xml);
9264
9265 IXMLDOMDocument_Release(doc);
9266
9267 doc = create_document(&IID_IXMLDOMDocument);
9268
9269 hr = IXMLDOMDocument_createElement(doc, _bstr_("foo"), &elem);
9270 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9271
9272 hr = IXMLDOMDocument_putref_documentElement(doc, elem);
9273 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9274
9275 hr = IXMLDOMDocument_get_xml(doc, &xml);
9276 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9277
9278 ok(memcmp(xml, _bstr_(fooA), (sizeof(fooA)-1)*sizeof(WCHAR)) == 0,
9279 "got %s, expected %s\n", wine_dbgstr_w(xml), fooA);
9280 SysFreeString(xml);
9281
9282 IXMLDOMElement_Release(elem);
9283
9284 /* attribute node */
9285 hr = IXMLDOMDocument_createAttribute(doc, _bstr_("attr"), &attr);
9286 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9287
9288 V_VT(&v) = VT_BSTR;
9289 V_BSTR(&v) = _bstr_("\"a & b\"");
9290 hr = IXMLDOMAttribute_put_value(attr, v);
9291 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9292
9293 xml = NULL;
9294 hr = IXMLDOMAttribute_get_xml(attr, &xml);
9295 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9296 ok(!memcmp(xml, _bstr_(attrA), (sizeof(attrA)-1)*sizeof(WCHAR)), "got %s\n", wine_dbgstr_w(xml));
9297 SysFreeString(xml);
9298
9299 VariantInit(&v);
9300 hr = IXMLDOMAttribute_get_value(attr, &v);
9301 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9302 ok(V_VT(&v) == VT_BSTR, "got type %d\n", V_VT(&v));
9303 ok(!memcmp(V_BSTR(&v), _bstr_(attr2A), (sizeof(attr2A)-1)*sizeof(WCHAR)),
9304 "got %s\n", wine_dbgstr_w(V_BSTR(&v)));
9305 VariantClear(&v);
9306
9307 V_VT(&v) = VT_BSTR;
9308 V_BSTR(&v) = _bstr_("&quot;a");
9309 hr = IXMLDOMAttribute_put_value(attr, v);
9310 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9311
9312 xml = NULL;
9313 hr = IXMLDOMAttribute_get_xml(attr, &xml);
9314 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9315 ok(!memcmp(xml, _bstr_(attr3A), (sizeof(attr3A)-1)*sizeof(WCHAR)), "got %s\n", wine_dbgstr_w(xml));
9316 SysFreeString(xml);
9317
9318 VariantInit(&v);
9319 hr = IXMLDOMAttribute_get_value(attr, &v);
9320 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9321 ok(V_VT(&v) == VT_BSTR, "got type %d\n", V_VT(&v));
9322 ok(!memcmp(V_BSTR(&v), _bstr_(attr4A), (sizeof(attr4A)-1)*sizeof(WCHAR)),
9323 "got %s\n", wine_dbgstr_w(V_BSTR(&v)));
9324 VariantClear(&v);
9325
9326 IXMLDOMAttribute_Release(attr);
9327
9328 IXMLDOMDocument_Release(doc);
9329
9330 free_bstrs();
9331}
9332
9333static void test_xsltemplate(void)
9334{
9335 IXMLDOMDocument *doc, *doc2, *doc3;
9336 IXSLTemplate *template;
9337 IXSLProcessor *processor;
9338 IStream *stream;
9340 HRESULT hr;
9341 ULONG ref1, ref2;
9342 VARIANT v;
9343 BSTR str;
9344
9345 if (!is_clsid_supported(&CLSID_XSLTemplate, &IID_IXSLTemplate)) return;
9346 template = create_xsltemplate(&IID_IXSLTemplate);
9347
9348 check_interface(template, &IID_IXSLTemplate, TRUE);
9349 check_interface(template, &IID_IDispatch, TRUE);
9350 check_interface(template, &IID_IDispatchEx, TRUE);
9351
9352 /* works as reset */
9353 hr = IXSLTemplate_putref_stylesheet(template, NULL);
9354 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9355
9356 doc = create_document(&IID_IXMLDOMDocument);
9357
9358 b = VARIANT_TRUE;
9359 hr = IXMLDOMDocument_loadXML( doc, _bstr_("<a>test</a>"), &b );
9360 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9361 ok( b == VARIANT_TRUE, "got %d\n", b);
9362
9363 /* putref with non-xsl document */
9364 hr = IXSLTemplate_putref_stylesheet(template, (IXMLDOMNode*)doc);
9365 todo_wine ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
9366
9367 b = VARIANT_TRUE;
9368 hr = IXMLDOMDocument_loadXML( doc, _bstr_(szTransformSSXML), &b );
9369 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9370 ok( b == VARIANT_TRUE, "got %d\n", b);
9371
9372 /* not a freethreaded document */
9373 hr = IXSLTemplate_putref_stylesheet(template, (IXMLDOMNode*)doc);
9374 todo_wine ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
9375
9376 IXMLDOMDocument_Release(doc);
9377
9378 if (!is_clsid_supported(&CLSID_FreeThreadedDOMDocument, &IID_IXMLDOMDocument))
9379 {
9380 IXSLTemplate_Release(template);
9381 return;
9382 }
9383
9384 hr = CoCreateInstance(&CLSID_FreeThreadedDOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (void**)&doc);
9385 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9386
9387 b = VARIANT_TRUE;
9388 hr = IXMLDOMDocument_loadXML( doc, _bstr_(szTransformSSXML), &b );
9389 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9390 ok( b == VARIANT_TRUE, "got %d\n", b);
9391
9392 /* freethreaded document */
9393 ref1 = IXMLDOMDocument_AddRef(doc);
9394 IXMLDOMDocument_Release(doc);
9395 hr = IXSLTemplate_putref_stylesheet(template, (IXMLDOMNode*)doc);
9396 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9397 ref2 = IXMLDOMDocument_AddRef(doc);
9398 IXMLDOMDocument_Release(doc);
9399 ok(ref2 > ref1, "got %ld\n", ref2);
9400
9401 /* processor */
9402 hr = IXSLTemplate_createProcessor(template, NULL);
9403 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
9404
9405 EXPECT_REF(template, 1);
9406 hr = IXSLTemplate_createProcessor(template, &processor);
9407 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9408 EXPECT_REF(template, 2);
9409
9410 /* input no set yet */
9411 V_VT(&v) = VT_BSTR;
9412 V_BSTR(&v) = NULL;
9413 hr = IXSLProcessor_get_input(processor, &v);
9414todo_wine {
9415 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9416 ok(V_VT(&v) == VT_EMPTY, "got %d\n", V_VT(&v));
9417}
9418
9419 hr = IXSLProcessor_get_output(processor, NULL);
9420 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
9421
9422 /* reset before it was set */
9423 V_VT(&v) = VT_EMPTY;
9424 hr = IXSLProcessor_put_output(processor, v);
9425 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9426
9427 V_VT(&v) = VT_UNKNOWN;
9428 V_UNKNOWN(&v) = NULL;
9429 hr = IXSLProcessor_put_output(processor, v);
9430 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9431
9432 V_VT(&v) = VT_UNKNOWN;
9433 V_DISPATCH(&v) = NULL;
9434 hr = IXSLProcessor_put_output(processor, v);
9435 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9436
9438 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9439 EXPECT_REF(stream, 1);
9440
9441 V_VT(&v) = VT_UNKNOWN;
9442 V_UNKNOWN(&v) = (IUnknown*)stream;
9443 hr = IXSLProcessor_put_output(processor, v);
9444 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9445
9446 /* it seems processor grabs 2 references */
9448
9449 V_VT(&v) = VT_EMPTY;
9450 hr = IXSLProcessor_get_output(processor, &v);
9451 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9452 ok(V_VT(&v) == VT_UNKNOWN, "got type %d\n", V_VT(&v));
9453 ok(V_UNKNOWN(&v) == (IUnknown*)stream, "got %p\n", V_UNKNOWN(&v));
9454
9456 VariantClear(&v);
9457
9458 hr = IXSLProcessor_transform(processor, NULL);
9459 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
9460
9461 /* reset and check stream refcount */
9462 V_VT(&v) = VT_EMPTY;
9463 hr = IXSLProcessor_put_output(processor, v);
9464 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9465
9466 EXPECT_REF(stream, 1);
9467
9468 IStream_Release(stream);
9469
9470 /* no output interface set, check output */
9471 doc2 = create_document(&IID_IXMLDOMDocument);
9472
9473 b = VARIANT_FALSE;
9474 hr = IXMLDOMDocument_loadXML( doc2, _bstr_("<a>test</a>"), &b );
9475 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9476 ok( b == VARIANT_TRUE, "got %d\n", b);
9477
9478 V_VT(&v) = VT_UNKNOWN;
9479 V_UNKNOWN(&v) = (IUnknown*)doc2;
9480 hr = IXSLProcessor_put_input(processor, v);
9481 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9482
9483 hr = IXSLProcessor_transform(processor, &b);
9484 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9485
9486 V_VT(&v) = VT_EMPTY;
9487 hr = IXSLProcessor_get_output(processor, &v);
9488 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9489 ok(V_VT(&v) == VT_BSTR, "got type %d\n", V_VT(&v));
9490 ok(*V_BSTR(&v) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v)));
9491 VariantClear(&v);
9492
9493 /* transform to document */
9494 b = VARIANT_FALSE;
9495 hr = IXMLDOMDocument_loadXML(doc2, _bstr_(szTransformXML), &b);
9496 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9497 ok(b == VARIANT_TRUE, "got %d\n", b);
9498
9499 V_VT(&v) = VT_UNKNOWN;
9500 V_UNKNOWN(&v) = (IUnknown*)doc2;
9501 hr = IXSLProcessor_put_input(processor, v);
9502 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9503
9504 doc3 = create_document(&IID_IXMLDOMDocument);
9505 V_VT(&v) = VT_UNKNOWN;
9506 V_UNKNOWN(&v) = (IUnknown *)doc3;
9507 hr = IXSLProcessor_put_output(processor, v);
9508 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9509
9510 hr = IXMLDOMDocument_get_xml(doc3, &str);
9511 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9512 ok(!*str, "Expected empty document\n");
9514
9515 hr = IXSLProcessor_transform(processor, &b);
9516 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9517
9518 V_VT(&v) = VT_EMPTY;
9519 hr = IXSLProcessor_get_output(processor, &v);
9520 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9521 ok(V_VT(&v) == VT_UNKNOWN, "got type %d\n", V_VT(&v));
9522 VariantClear(&v);
9523
9524 hr = IXMLDOMDocument_get_xml(doc3, &str);
9525 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9526 ok(!!*str, "Expected document\n");
9528
9529 /* transform to IResponse */
9530 V_VT(&v) = VT_EMPTY;
9531 hr = IXSLProcessor_put_output(processor, v);
9532 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9533
9534 V_VT(&v) = VT_UNKNOWN;
9536 hr = IXSLProcessor_put_output(processor, v);
9537 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9538
9539 b = VARIANT_FALSE;
9540 hr = IXSLProcessor_transform(processor, &b);
9541 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9542 ok(b == VARIANT_TRUE, "got %x\n", b);
9543
9544 IXSLProcessor_Release(processor);
9545 IXMLDOMDocument_Release(doc2);
9546 IXMLDOMDocument_Release(doc3);
9547
9548 /* drop reference */
9549 hr = IXSLTemplate_putref_stylesheet(template, NULL);
9550 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9551 ref2 = IXMLDOMDocument_AddRef(doc);
9552 IXMLDOMDocument_Release(doc);
9553 ok(ref2 == ref1, "got %ld\n", ref2);
9554
9555 IXMLDOMDocument_Release(doc);
9556 IXSLTemplate_Release(template);
9557 free_bstrs();
9558}
9559
9560static void test_insertBefore(void)
9561{
9562 IXMLDOMDocument *doc, *doc2, *doc3;
9564 IXMLDOMElement *elem1, *elem2, *elem3, *elem4, *elem5;
9565 IXMLDOMNode *node, *newnode, *cdata;
9566 HRESULT hr;
9567 VARIANT v;
9568 BSTR p;
9569
9570 doc = create_document(&IID_IXMLDOMDocument);
9571 doc3 = create_document(&IID_IXMLDOMDocument);
9572
9573 /* NULL to document */
9574 V_VT(&v) = VT_NULL;
9575 node = (void*)0xdeadbeef;
9576 hr = IXMLDOMDocument_insertBefore(doc, NULL, v, &node);
9577 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
9578 ok(node == (void*)0xdeadbeef, "got %p\n", node);
9579
9580 /* document to document */
9581 V_VT(&v) = VT_NULL;
9582 node = (void*)0xdeadbeef;
9583 hr = IXMLDOMDocument_insertBefore(doc, (IXMLDOMNode*)doc3, v, &node);
9584 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
9585 ok(node == NULL, "got %p\n", node);
9586
9587 /* document to itself */
9588 V_VT(&v) = VT_NULL;
9589 node = (void*)0xdeadbeef;
9590 hr = IXMLDOMDocument_insertBefore(doc, (IXMLDOMNode*)doc, v, &node);
9591 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
9592 ok(node == NULL, "got %p\n", node);
9593
9594 /* insertBefore behaviour for attribute node */
9595 V_VT(&v) = VT_I4;
9596 V_I4(&v) = NODE_ATTRIBUTE;
9597
9598 attr = NULL;
9599 hr = IXMLDOMDocument_createNode(doc, v, _bstr_("attr"), NULL, (IXMLDOMNode**)&attr);
9600 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9601 ok(attr != NULL, "got %p\n", attr);
9602
9603 /* attribute to document */
9604 V_VT(&v) = VT_NULL;
9605 node = (void*)0xdeadbeef;
9606 hr = IXMLDOMDocument_insertBefore(doc3, (IXMLDOMNode*)attr, v, &node);
9607 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
9608 ok(node == NULL, "got %p\n", node);
9609
9610 /* cdata to document */
9611 V_VT(&v) = VT_I4;
9613
9614 cdata = NULL;
9615 hr = IXMLDOMDocument_createNode(doc3, v, _bstr_("cdata"), NULL, &cdata);
9616 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9617 ok(cdata != NULL, "got %p\n", cdata);
9618
9619 EXPECT_NO_CHILDREN(cdata);
9620
9621 /* attribute to cdata */
9622 V_VT(&v) = VT_NULL;
9623 node = (void*)0xdeadbeef;
9624 hr = IXMLDOMNode_insertBefore(cdata, (IXMLDOMNode*)attr, v, &node);
9625 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
9626 ok(node == NULL, "got %p\n", node);
9627
9628 /* document to cdata */
9629 V_VT(&v) = VT_NULL;
9630 node = (void*)0xdeadbeef;
9631 hr = IXMLDOMNode_insertBefore(cdata, (IXMLDOMNode*)doc, v, &node);
9632 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
9633 ok(node == NULL, "got %p\n", node);
9634
9635 V_VT(&v) = VT_NULL;
9636 node = (void*)0xdeadbeef;
9637 hr = IXMLDOMDocument_insertBefore(doc3, cdata, v, &node);
9638 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
9639 ok(node == NULL, "got %p\n", node);
9640
9641 IXMLDOMNode_Release(cdata);
9642 IXMLDOMDocument_Release(doc3);
9643
9644 /* attribute to attribute */
9645 V_VT(&v) = VT_I4;
9646 V_I4(&v) = NODE_ATTRIBUTE;
9647 newnode = NULL;
9648 hr = IXMLDOMDocument_createNode(doc, v, _bstr_("attr2"), NULL, &newnode);
9649 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9650 ok(newnode != NULL, "got %p\n", newnode);
9651
9652 V_VT(&v) = VT_NULL;
9653 node = (void*)0xdeadbeef;
9654 hr = IXMLDOMAttribute_insertBefore(attr, newnode, 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_UNKNOWN;
9659 V_UNKNOWN(&v) = (IUnknown*)attr;
9660 node = (void*)0xdeadbeef;
9661 hr = IXMLDOMAttribute_insertBefore(attr, newnode, v, &node);
9662 todo_wine ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
9663 ok(node == NULL, "got %p\n", node);
9664 IXMLDOMNode_Release(newnode);
9665
9666 /* cdata to attribute */
9667 V_VT(&v) = VT_I4;
9669 newnode = NULL;
9670 hr = IXMLDOMDocument_createNode(doc, v, _bstr_("cdata"), NULL, &newnode);
9671 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9672 ok(newnode != NULL, "got %p\n", newnode);
9673
9674 V_VT(&v) = VT_NULL;
9675 node = (void*)0xdeadbeef;
9676 hr = IXMLDOMAttribute_insertBefore(attr, newnode, v, &node);
9677 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
9678 ok(node == NULL, "got %p\n", node);
9679 IXMLDOMNode_Release(newnode);
9680
9681 /* comment to attribute */
9682 V_VT(&v) = VT_I4;
9683 V_I4(&v) = NODE_COMMENT;
9684 newnode = NULL;
9685 hr = IXMLDOMDocument_createNode(doc, v, _bstr_("cdata"), NULL, &newnode);
9686 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9687 ok(newnode != NULL, "got %p\n", newnode);
9688
9689 V_VT(&v) = VT_NULL;
9690 node = (void*)0xdeadbeef;
9691 hr = IXMLDOMAttribute_insertBefore(attr, newnode, v, &node);
9692 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
9693 ok(node == NULL, "got %p\n", node);
9694 IXMLDOMNode_Release(newnode);
9695
9696 /* element to attribute */
9697 V_VT(&v) = VT_I4;
9698 V_I4(&v) = NODE_ELEMENT;
9699 newnode = NULL;
9700 hr = IXMLDOMDocument_createNode(doc, v, _bstr_("cdata"), NULL, &newnode);
9701 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9702 ok(newnode != NULL, "got %p\n", newnode);
9703
9704 V_VT(&v) = VT_NULL;
9705 node = (void*)0xdeadbeef;
9706 hr = IXMLDOMAttribute_insertBefore(attr, newnode, v, &node);
9707 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
9708 ok(node == NULL, "got %p\n", node);
9709 IXMLDOMNode_Release(newnode);
9710
9711 /* pi to attribute */
9712 V_VT(&v) = VT_I4;
9714 newnode = NULL;
9715 hr = IXMLDOMDocument_createNode(doc, v, _bstr_("cdata"), NULL, &newnode);
9716 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9717 ok(newnode != NULL, "got %p\n", newnode);
9718
9719 V_VT(&v) = VT_NULL;
9720 node = (void*)0xdeadbeef;
9721 hr = IXMLDOMAttribute_insertBefore(attr, newnode, v, &node);
9722 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
9723 ok(node == NULL, "got %p\n", node);
9724 IXMLDOMNode_Release(newnode);
9725 IXMLDOMAttribute_Release(attr);
9726
9727 /* insertBefore for elements */
9728 hr = IXMLDOMDocument_createElement(doc, _bstr_("elem"), &elem1);
9729 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9730
9731 hr = IXMLDOMDocument_createElement(doc, _bstr_("elem2"), &elem2);
9732 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9733
9734 hr = IXMLDOMDocument_createElement(doc, _bstr_("elem3"), &elem3);
9735 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9736
9737 hr = IXMLDOMDocument_createElement(doc, _bstr_("elem3"), &elem3);
9738 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9739
9740 hr = IXMLDOMDocument_createElement(doc, _bstr_("elem4"), &elem4);
9741 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9742
9743 EXPECT_NO_CHILDREN(elem1);
9744 EXPECT_NO_CHILDREN(elem2);
9745 EXPECT_NO_CHILDREN(elem3);
9746
9747 todo_wine EXPECT_REF(elem2, 2);
9748
9749 /* NULL to element */
9750 V_VT(&v) = VT_NULL;
9751 node = (void*)0xdeadbeef;
9752 hr = IXMLDOMElement_insertBefore(elem1, NULL, v, &node);
9753 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
9754 ok(node == (void*)0xdeadbeef, "got %p\n", node);
9755
9756 /* document to element */
9757 V_VT(&v) = VT_DISPATCH;
9758 V_DISPATCH(&v) = NULL;
9759 hr = IXMLDOMElement_insertBefore(elem1, (IXMLDOMNode*)doc, v, NULL);
9760 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
9761
9762 V_VT(&v) = VT_DISPATCH;
9763 V_DISPATCH(&v) = NULL;
9764 node = NULL;
9765 hr = IXMLDOMElement_insertBefore(elem1, (IXMLDOMNode*)elem4, v, &node);
9766 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9767 ok(node == (void*)elem4, "got %p\n", node);
9768
9769 EXPECT_CHILDREN(elem1);
9770 hr = IXMLDOMElement_removeChild(elem1, (IXMLDOMNode*)elem4, NULL);
9771 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9772 IXMLDOMElement_Release(elem4);
9773
9774 EXPECT_NO_CHILDREN(elem1);
9775
9776 V_VT(&v) = VT_NULL;
9777 node = NULL;
9778 hr = IXMLDOMElement_insertBefore(elem1, (IXMLDOMNode*)elem2, v, &node);
9779 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9780 ok(node == (void*)elem2, "got %p\n", node);
9781
9782 EXPECT_CHILDREN(elem1);
9783 todo_wine EXPECT_REF(elem2, 3);
9784 IXMLDOMNode_Release(node);
9785
9786 /* again for already linked node */
9787 V_VT(&v) = VT_NULL;
9788 node = NULL;
9789 hr = IXMLDOMElement_insertBefore(elem1, (IXMLDOMNode*)elem2, v, &node);
9790 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9791 ok(node == (void*)elem2, "got %p\n", node);
9792
9793 EXPECT_CHILDREN(elem1);
9794
9795 /* increments each time */
9796 todo_wine EXPECT_REF(elem2, 3);
9797 IXMLDOMNode_Release(node);
9798
9799 /* try to add to another element */
9800 V_VT(&v) = VT_NULL;
9801 node = (void*)0xdeadbeef;
9802 hr = IXMLDOMElement_insertBefore(elem3, (IXMLDOMNode*)elem2, v, &node);
9803 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9804 ok(node == (void*)elem2, "got %p\n", node);
9805
9806 EXPECT_CHILDREN(elem3);
9807 EXPECT_NO_CHILDREN(elem1);
9808
9809 IXMLDOMNode_Release(node);
9810
9811 /* cross document case - try to add as child to a node created with other doc */
9812 doc2 = create_document(&IID_IXMLDOMDocument);
9813
9814 hr = IXMLDOMDocument_createElement(doc2, _bstr_("elem4"), &elem4);
9815 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9816 todo_wine EXPECT_REF(elem4, 2);
9817
9818 /* same name, another instance */
9819 hr = IXMLDOMDocument_createElement(doc2, _bstr_("elem4"), &elem5);
9820 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9821 todo_wine EXPECT_REF(elem5, 2);
9822
9823 todo_wine EXPECT_REF(elem3, 2);
9824 V_VT(&v) = VT_NULL;
9825 node = NULL;
9826 hr = IXMLDOMElement_insertBefore(elem3, (IXMLDOMNode*)elem4, v, &node);
9827 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9828 ok(node == (void*)elem4, "got %p\n", node);
9829 todo_wine EXPECT_REF(elem4, 3);
9830 todo_wine EXPECT_REF(elem3, 2);
9831 IXMLDOMNode_Release(node);
9832
9833 V_VT(&v) = VT_NULL;
9834 node = NULL;
9835 hr = IXMLDOMElement_insertBefore(elem3, (IXMLDOMNode*)elem5, v, &node);
9836 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9837 ok(node == (void*)elem5, "got %p\n", node);
9838 todo_wine EXPECT_REF(elem4, 2);
9839 todo_wine EXPECT_REF(elem5, 3);
9840 IXMLDOMNode_Release(node);
9841
9842 IXMLDOMDocument_Release(doc2);
9843
9844 IXMLDOMElement_Release(elem1);
9845 IXMLDOMElement_Release(elem2);
9846 IXMLDOMElement_Release(elem3);
9847 IXMLDOMElement_Release(elem4);
9848 IXMLDOMElement_Release(elem5);
9849
9850 /* elements with same default namespace */
9851 V_VT(&v) = VT_I4;
9852 V_I4(&v) = NODE_ELEMENT;
9853 elem1 = NULL;
9854 hr = IXMLDOMDocument_createNode(doc, v, _bstr_("elem1"), _bstr_("http://winehq.org/default"), (IXMLDOMNode**)&elem1);
9855 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9856 ok(elem1 != NULL, "got %p\n", elem1);
9857
9858 V_VT(&v) = VT_I4;
9859 V_I4(&v) = NODE_ELEMENT;
9860 elem2 = NULL;
9861 hr = IXMLDOMDocument_createNode(doc, v, _bstr_("elem2"), _bstr_("http://winehq.org/default"), (IXMLDOMNode**)&elem2);
9862 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9863 ok(elem2 != NULL, "got %p\n", elem2);
9864
9865 /* check contents so far */
9866 p = NULL;
9867 hr = IXMLDOMElement_get_xml(elem1, &p);
9868 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9869 ok(!lstrcmpW(p, L"<elem1 xmlns=\"http://winehq.org/default\"/>"), "got %s\n", wine_dbgstr_w(p));
9871
9872 p = NULL;
9873 hr = IXMLDOMElement_get_xml(elem2, &p);
9874 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9875 ok(!lstrcmpW(p, L"<elem2 xmlns=\"http://winehq.org/default\"/>"), "got %s\n", wine_dbgstr_w(p));
9877
9878 V_VT(&v) = VT_NULL;
9879 hr = IXMLDOMElement_insertBefore(elem1, (IXMLDOMNode*)elem2, v, NULL);
9880 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9881
9882 /* get_xml depends on context, for top node it omits child namespace attribute,
9883 but at child level it's still returned */
9884 p = NULL;
9885 hr = IXMLDOMElement_get_xml(elem1, &p);
9886 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9887 todo_wine ok(!lstrcmpW(p, L"<elem1 xmlns=\"http://winehq.org/default\"><elem2/></elem1>"),
9888 "got %s\n", wine_dbgstr_w(p));
9890
9891 p = NULL;
9892 hr = IXMLDOMElement_get_xml(elem2, &p);
9893 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9894 ok(!lstrcmpW(p, L"<elem2 xmlns=\"http://winehq.org/default\"/>"), "got %s\n", wine_dbgstr_w(p));
9896
9897 IXMLDOMElement_Release(elem1);
9898 IXMLDOMElement_Release(elem2);
9899
9900 /* child without default namespace added to node with default namespace */
9901 V_VT(&v) = VT_I4;
9902 V_I4(&v) = NODE_ELEMENT;
9903 elem1 = NULL;
9904 hr = IXMLDOMDocument_createNode(doc, v, _bstr_("elem1"), _bstr_("http://winehq.org/default"), (IXMLDOMNode**)&elem1);
9905 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9906 ok(elem1 != NULL, "got %p\n", elem1);
9907
9908 V_VT(&v) = VT_I4;
9909 V_I4(&v) = NODE_ELEMENT;
9910 elem2 = NULL;
9911 hr = IXMLDOMDocument_createNode(doc, v, _bstr_("elem2"), NULL, (IXMLDOMNode**)&elem2);
9912 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9913 ok(elem2 != NULL, "got %p\n", elem2);
9914
9915 EXPECT_REF(elem2, 1);
9916 V_VT(&v) = VT_NULL;
9917 hr = IXMLDOMElement_insertBefore(elem1, (IXMLDOMNode*)elem2, v, NULL);
9918 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9919 EXPECT_REF(elem2, 1);
9920
9921 p = NULL;
9922 hr = IXMLDOMElement_get_xml(elem2, &p);
9923 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9924 ok(!lstrcmpW(p, L"<elem2/>"), "got %s\n", wine_dbgstr_w(p));
9926
9927 hr = IXMLDOMElement_removeChild(elem1, (IXMLDOMNode*)elem2, NULL);
9928 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9929
9930 p = NULL;
9931 hr = IXMLDOMElement_get_xml(elem2, &p);
9932 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9933 ok(!lstrcmpW(p, L"<elem2/>"), "got %s\n", wine_dbgstr_w(p));
9935
9936 IXMLDOMElement_Release(elem1);
9937 IXMLDOMElement_Release(elem2);
9938 IXMLDOMDocument_Release(doc);
9939}
9940
9941static void test_appendChild(void)
9942{
9943 IXMLDOMDocument *doc, *doc2;
9944 IXMLDOMElement *elem, *elem2;
9945 HRESULT hr;
9946
9947 doc = create_document(&IID_IXMLDOMDocument);
9948 doc2 = create_document(&IID_IXMLDOMDocument);
9949
9950 hr = IXMLDOMDocument_createElement(doc, _bstr_("elem"), &elem);
9951 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9952
9953 hr = IXMLDOMDocument_createElement(doc2, _bstr_("elem2"), &elem2);
9954 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9955
9956 EXPECT_REF(doc, 1);
9958 EXPECT_REF(doc2, 1);
9959 todo_wine EXPECT_REF(elem2, 2);
9960 EXPECT_NO_CHILDREN(doc);
9961 EXPECT_NO_CHILDREN(doc2);
9962
9963 hr = IXMLDOMDocument_appendChild(doc2, NULL, NULL);
9964 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
9965
9966 hr = IXMLDOMElement_appendChild(elem, NULL, NULL);
9967 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
9968
9969 /* append from another document */
9970 hr = IXMLDOMDocument_appendChild(doc2, (IXMLDOMNode*)elem, NULL);
9971 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
9972
9973 EXPECT_REF(doc, 1);
9975 EXPECT_REF(doc2, 1);
9976 todo_wine EXPECT_REF(elem2, 2);
9977 EXPECT_NO_CHILDREN(doc);
9978 EXPECT_CHILDREN(doc2);
9979
9980 IXMLDOMElement_Release(elem);
9981 IXMLDOMElement_Release(elem2);
9982 IXMLDOMDocument_Release(doc);
9983 IXMLDOMDocument_Release(doc2);
9984}
9985
9986static void test_get_doctype(void)
9987{
9988 IXMLDOMDocumentType *doctype;
9989 IXMLDOMDocument *doc;
9991 HRESULT hr;
9992 BSTR s;
9993
9994 doc = create_document(&IID_IXMLDOMDocument);
9995
9996 hr = IXMLDOMDocument_get_doctype(doc, NULL);
9997 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
9998
9999 doctype = (void*)0xdeadbeef;
10000 hr = IXMLDOMDocument_get_doctype(doc, &doctype);
10001 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
10002 ok(doctype == NULL, "got %p\n", doctype);
10003
10004 hr = IXMLDOMDocument_loadXML(doc, _bstr_(szEmailXML), &b);
10005 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10006 ok(b == VARIANT_TRUE, "failed to load XML string\n");
10007
10008 doctype = NULL;
10009 hr = IXMLDOMDocument_get_doctype(doc, &doctype);
10010 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10011 ok(doctype != NULL, "got %p\n", doctype);
10012
10013 hr = IXMLDOMDocumentType_get_name(doctype, NULL);
10014 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
10015
10016 hr = IXMLDOMDocumentType_get_name(doctype, &s);
10017 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10018 ok(!lstrcmpW(L"email", s), "got name %s\n", wine_dbgstr_w(s));
10020
10021 hr = IXMLDOMDocumentType_get_nodeName(doctype, &s);
10022 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10023 ok(!lstrcmpW(L"email", s), "got name %s\n", wine_dbgstr_w(s));
10025
10026 IXMLDOMDocumentType_Release(doctype);
10027 IXMLDOMDocument_Release(doc);
10028}
10029
10030static void test_get_tagName(void)
10031{
10032 IXMLDOMDocument *doc;
10033 IXMLDOMElement *elem, *elem2;
10034 HRESULT hr;
10035 BSTR str;
10036
10037 doc = create_document(&IID_IXMLDOMDocument);
10038
10039 hr = IXMLDOMDocument_createElement(doc, _bstr_("element"), &elem);
10040 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10041
10042 hr = IXMLDOMElement_get_tagName(elem, NULL);
10043 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
10044
10045 str = NULL;
10046 hr = IXMLDOMElement_get_tagName(elem, &str);
10047 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10048 ok(!lstrcmpW(str, L"element"), "got %s\n", wine_dbgstr_w(str));
10050
10051 hr = IXMLDOMDocument_createElement(doc, _bstr_("s:element"), &elem2);
10052 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10053
10054 str = NULL;
10055 hr = IXMLDOMElement_get_tagName(elem2, &str);
10056 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10057 ok(!lstrcmpW(str, L"s:element"), "got %s\n", wine_dbgstr_w(str));
10059
10060 IXMLDOMElement_Release(elem);
10061 IXMLDOMElement_Release(elem2);
10062 IXMLDOMDocument_Release(doc);
10063 free_bstrs();
10064}
10065
10066typedef struct {
10068 const char *name;
10071} node_type_t;
10072
10073static const node_type_t get_datatype[] = {
10074 { NODE_ELEMENT, "element", VT_NULL, S_FALSE },
10075 { NODE_ATTRIBUTE, "attr", VT_NULL, S_FALSE },
10076 { NODE_TEXT, "text", VT_NULL, S_FALSE },
10077 { NODE_CDATA_SECTION , "cdata", VT_NULL, S_FALSE },
10078 { NODE_ENTITY_REFERENCE, "entityref", VT_NULL, S_FALSE },
10080 { NODE_COMMENT, "comment", VT_NULL, S_FALSE },
10081 { NODE_DOCUMENT_FRAGMENT, "docfrag", VT_NULL, S_FALSE },
10082 { 0 }
10083};
10084
10085static void test_get_dataType(void)
10086{
10088 IXMLDOMDocument *doc;
10089
10090 doc = create_document(&IID_IXMLDOMDocument);
10091
10092 while (entry->type)
10093 {
10095 VARIANT var, type;
10096 HRESULT hr;
10097
10098 V_VT(&var) = VT_I4;
10099 V_I4(&var) = entry->type;
10100 hr = IXMLDOMDocument_createNode(doc, var, _bstr_(entry->name), NULL, &node);
10101 ok(hr == S_OK, "failed to create node, type %d\n", entry->type);
10102
10103 hr = IXMLDOMNode_get_dataType(node, NULL);
10104 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
10105
10106 VariantInit(&type);
10107 hr = IXMLDOMNode_get_dataType(node, &type);
10108 ok(hr == entry->hr, "Unexpected hr %#lx, expected %#lx. node type %d\n",
10109 hr, entry->hr, entry->type);
10110 ok(V_VT(&type) == entry->vt, "got %d, expected %d. node type %d\n",
10111 V_VT(&type), entry->vt, entry->type);
10113
10114 IXMLDOMNode_Release(node);
10115
10116 entry++;
10117 }
10118
10119 IXMLDOMDocument_Release(doc);
10120 free_bstrs();
10121}
10122
10125 const char *string;
10127
10129 { NODE_ELEMENT, "element" },
10130 { NODE_ATTRIBUTE, "attribute" },
10131 { NODE_TEXT, "text" },
10132 { NODE_CDATA_SECTION , "cdatasection" },
10133 { NODE_ENTITY_REFERENCE, "entityreference" },
10134 { NODE_PROCESSING_INSTRUCTION, "processinginstruction" },
10135 { NODE_COMMENT, "comment" },
10136 { NODE_DOCUMENT_FRAGMENT, "documentfragment" },
10137 { 0 }
10138};
10139
10141{
10143 IXMLDOMDocument *doc;
10144 HRESULT hr;
10145 BSTR str;
10146
10147 doc = create_document(&IID_IXMLDOMDocument);
10148
10149 hr = IXMLDOMDocument_get_nodeTypeString(doc, &str);
10150 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10151 ok(!lstrcmpW(str, L"document"), "got string %s\n", wine_dbgstr_w(str));
10153
10154 while (entry->type)
10155 {
10157 VARIANT var;
10158
10159 V_VT(&var) = VT_I4;
10160 V_I4(&var) = entry->type;
10161 hr = IXMLDOMDocument_createNode(doc, var, _bstr_("node"), NULL, &node);
10162 ok(hr == S_OK, "failed to create node, type %d\n", entry->type);
10163
10164 hr = IXMLDOMNode_get_nodeTypeString(node, NULL);
10165 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
10166
10167 hr = IXMLDOMNode_get_nodeTypeString(node, &str);
10168 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10169 ok(!lstrcmpW(str, _bstr_(entry->string)), "got string %s, expected %s. node type %d\n",
10170 wine_dbgstr_w(str), entry->string, entry->type);
10172 IXMLDOMNode_Release(node);
10173
10174 entry++;
10175 }
10176
10177 IXMLDOMDocument_Release(doc);
10178 free_bstrs();
10179}
10180
10181typedef struct _get_attributes_t {
10185
10188 { NODE_TEXT, S_FALSE },
10192 { NODE_COMMENT, S_FALSE },
10194 { 0 }
10195};
10196
10197static void test_get_attributes(void)
10198{
10199 const WCHAR *namespaces[] =
10200 {
10201 L"xmlns:oslc_am",
10202 L"xmlns:rdf",
10203 L"xmlns:dcterms",
10204 L"xmlns:foaf"
10205 };
10208 IXMLDOMDocument *doc, *doc2;
10209 IXMLDOMNode *node, *node2;
10212 HRESULT hr;
10213 VARIANT v;
10214 BSTR str;
10215 LONG length, i;
10216
10217 doc = create_document(&IID_IXMLDOMDocument);
10218
10219 hr = IXMLDOMDocument_loadXML(doc, _bstr_(complete4A), &b);
10220 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10221
10222 hr = IXMLDOMDocument_get_attributes(doc, NULL);
10223 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
10224
10225 map = (void*)0xdeadbeef;
10226 hr = IXMLDOMDocument_get_attributes(doc, &map);
10227 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
10228 ok(map == NULL, "got %p\n", map);
10229
10230 /* first child is <?xml ?> */
10231 hr = IXMLDOMDocument_get_firstChild(doc, &node);
10232 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10233
10234 hr = IXMLDOMNode_get_attributes(node, &map);
10235 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10236
10237 node2 = (void*)0xdeadbeef;
10238 hr = IXMLDOMNamedNodeMap_getNamedItem(map, _bstr_("attr"), &node2);
10239 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
10240 ok(node2 == NULL, "got %p\n", node2);
10241
10242 length = -1;
10243 hr = IXMLDOMNamedNodeMap_get_length(map, &length);
10244 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10245 todo_wine ok(length == 1, "got %ld\n", length);
10246
10247 if (hr == S_OK && length == 1)
10248 {
10251 VARIANT v;
10252
10253 node2 = NULL;
10254 hr = IXMLDOMNamedNodeMap_get_item(map, 0, &node2);
10255 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10256 ok(node != NULL, "got %p\n", node2);
10257
10258 hr = IXMLDOMNode_get_nodeName(node2, &str);
10259 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10260 ok(!lstrcmpW(str, L"version"), "got %s\n", wine_dbgstr_w(str));
10262
10263 length = -1;
10264 hr = IXMLDOMNamedNodeMap_get_length(map, &length);
10265 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10266 ok(length == 1, "got %ld\n", length);
10267
10268 type = -1;
10269 hr = IXMLDOMNode_get_nodeType(node2, &type);
10270 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10271 ok(type == NODE_ATTRIBUTE, "got %d\n", type);
10272
10273 hr = IXMLDOMNode_get_xml(node, &str);
10274 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10275 ok(!lstrcmpW(str, L"<?xml version=\"1.0\"?>"), "got %s\n", wine_dbgstr_w(str));
10277
10278 hr = IXMLDOMNode_get_text(node, &str);
10279 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10280 ok(!lstrcmpW(str, L"version=\"1.0\""), "got %s\n", wine_dbgstr_w(str));
10282
10283 hr = IXMLDOMNamedNodeMap_removeNamedItem(map, _bstr_("version"), NULL);
10284 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10285
10286 length = -1;
10287 hr = IXMLDOMNamedNodeMap_get_length(map, &length);
10288 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10289 ok(length == 0, "got %ld\n", length);
10290
10291 hr = IXMLDOMNode_get_xml(node, &str);
10292 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10293 ok(!lstrcmpW(str, L"<?xml version=\"1.0\"?>"), "got %s\n", wine_dbgstr_w(str));
10295
10296 hr = IXMLDOMNode_get_text(node, &str);
10297 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10298 ok(!lstrcmpW(str, L""), "got %s\n", wine_dbgstr_w(str));
10300
10301 IXMLDOMNamedNodeMap_Release(map);
10302
10303 hr = IXMLDOMNode_get_attributes(node, &map);
10304 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10305
10306 length = -1;
10307 hr = IXMLDOMNamedNodeMap_get_length(map, &length);
10308 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10309 ok(length == 0, "got %ld\n", length);
10310
10311 hr = IXMLDOMDocument_createAttribute(doc, _bstr_("encoding"), &attr);
10312 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10313
10314 V_VT(&v) = VT_BSTR;
10315 V_BSTR(&v) = _bstr_("UTF-8");
10316 hr = IXMLDOMAttribute_put_nodeValue(attr, v);
10317 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10318
10319 EXPECT_REF(attr, 2);
10320 hr = IXMLDOMNamedNodeMap_setNamedItem(map, (IXMLDOMNode*)attr, NULL);
10321 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10322 EXPECT_REF(attr, 2);
10323
10324 hr = IXMLDOMNode_get_attributes(node, &map);
10325 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10326
10327 length = -1;
10328 hr = IXMLDOMNamedNodeMap_get_length(map, &length);
10329 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10330 ok(length == 1, "got %ld\n", length);
10331
10332 hr = IXMLDOMNode_get_xml(node, &str);
10333 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10334 ok(!lstrcmpW(str, L"<?xml version=\"1.0\"?>"), "got %s\n", wine_dbgstr_w(str));
10336
10337 hr = IXMLDOMNode_get_text(node, &str);
10338 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10339 ok(!lstrcmpW(str, L"encoding=\"UTF-8\""), "got %s\n", wine_dbgstr_w(str));
10341
10342 IXMLDOMNamedNodeMap_Release(map);
10343 IXMLDOMNode_Release(node2);
10344 }
10345
10346 IXMLDOMNode_Release(node);
10347
10348 /* last child is element */
10349 EXPECT_REF(doc, 1);
10350 hr = IXMLDOMDocument_get_lastChild(doc, &node);
10351 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10352 EXPECT_REF(doc, 1);
10353
10354 EXPECT_REF(node, 1);
10355 hr = IXMLDOMNode_get_attributes(node, &map);
10356 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10357 EXPECT_REF(node, 1);
10358 EXPECT_REF(doc, 1);
10359
10360 EXPECT_REF(map, 1);
10361 hr = IXMLDOMNamedNodeMap_get_item(map, 0, &node2);
10362 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10363 EXPECT_REF(node, 1);
10364 EXPECT_REF(node2, 1);
10365 EXPECT_REF(map, 1);
10366 EXPECT_REF(doc, 1);
10367 IXMLDOMNode_Release(node2);
10368
10369 /* release node before map release, map still works */
10370 IXMLDOMNode_Release(node);
10371
10372 length = 0;
10373 hr = IXMLDOMNamedNodeMap_get_length(map, &length);
10374 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10375 ok(length == 1, "got %ld\n", length);
10376
10377 node2 = NULL;
10378 hr = IXMLDOMNamedNodeMap_get_item(map, 0, &node2);
10379 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10380 EXPECT_REF(node2, 1);
10381 IXMLDOMNode_Release(node2);
10382
10383 IXMLDOMNamedNodeMap_Release(map);
10384
10385 /* append created element a different document, map still works */
10386 hr = IXMLDOMDocument_createElement(doc, _bstr_("test"), &elem);
10387 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10388
10389 V_VT(&v) = VT_I4;
10390 V_I4(&v) = 1;
10391 hr = IXMLDOMElement_setAttribute(elem, _bstr_("testattr"), v);
10392 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10393
10394 hr = IXMLDOMElement_get_attributes(elem, &map);
10395 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10396
10397 length = 0;
10398 hr = IXMLDOMNamedNodeMap_get_length(map, &length);
10399 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10400 ok(length == 1, "got %ld\n", length);
10401
10402 doc2 = create_document(&IID_IXMLDOMDocument);
10403
10404 hr = IXMLDOMDocument_appendChild(doc2, (IXMLDOMNode*)elem, &node);
10405 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10406 ok(node == (IXMLDOMNode*)elem, "node != elem\n");
10407 IXMLDOMNode_Release(node);
10408 IXMLDOMElement_Release(elem);
10409 IXMLDOMDocument_Release(doc2);
10410
10411 length = 0;
10412 hr = IXMLDOMNamedNodeMap_get_length(map, &length);
10413 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10414 ok(length == 1, "got %ld\n", length);
10415
10416 IXMLDOMNamedNodeMap_Release(map);
10417
10418 while (entry->type)
10419 {
10420 VARIANT var;
10421
10422 node = NULL;
10423
10424 V_VT(&var) = VT_I4;
10425 V_I4(&var) = entry->type;
10426 hr = IXMLDOMDocument_createNode(doc, var, _bstr_("node"), NULL, &node);
10427 ok(hr == S_OK, "failed to create node, type %d\n", entry->type);
10428
10429 hr = IXMLDOMNode_get_attributes(node, NULL);
10430 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
10431
10432 map = (void*)0xdeadbeef;
10433 hr = IXMLDOMNode_get_attributes(node, &map);
10434 ok(hr == entry->hr, "Unexpected hr %#lx, expected %#lx. node type %d\n",
10435 hr, entry->hr, entry->type);
10436 ok(map == NULL, "got %p\n", map);
10437
10438 IXMLDOMNode_Release(node);
10439
10440 entry++;
10441 }
10442
10443 IXMLDOMDocument_Release(doc);
10444
10445 str = SysAllocString(L"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
10446 L"<rdf:RDF xmlns:oslc_am=\"http://open-services.net/ns/am#\""
10447 L" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\""
10448 L" xmlns:dcterms=\"http://purl.org/dc/terms/\""
10449 L" xmlns:foaf=\"http://xmlns.com/foaf/0.1/\" >"
10450 L"</rdf:RDF>");
10451
10452 doc = create_document(&IID_IXMLDOMDocument2);
10453
10454 hr = IXMLDOMDocument_loadXML(doc, str, &b);
10455 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10456 ok(b == VARIANT_TRUE, "got %d\n", b);
10457
10458 hr = IXMLDOMDocument_get_documentElement(doc, &elem);
10459 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10460
10461 hr = IXMLDOMElement_get_attributes(elem, &map);
10462 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10463
10464 length = -1;
10465 hr = IXMLDOMNamedNodeMap_get_length(map, &length);
10466 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10467 ok(length == 4, "length %#lx.\n", length);
10468
10469 for(i=0; i < length; i++)
10470 {
10471 hr = IXMLDOMNamedNodeMap_get_item(map, i, &node2);
10472 ok( hr == S_OK, "Unexpected hr %#lx (%ld).\n", hr, i);
10473
10474 hr = IXMLDOMNode_get_nodeName(node2, &str);
10475 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10476 ok(!lstrcmpW(str, namespaces[i]), "got %s\n", wine_dbgstr_w(str));
10478
10479 IXMLDOMNode_Release(node2);
10480 }
10481
10482 IXMLDOMNamedNodeMap_Release(map);
10483 IXMLDOMElement_Release(elem);
10484
10485 IXMLDOMDocument_Release(doc);
10486
10487 free_bstrs();
10488}
10489
10490static void test_selection(void)
10491{
10492 IXMLDOMSelection *selection, *selection2;
10493 IEnumVARIANT *enum1, *enum2, *enum3;
10495 IUnknown *unk1, *unk2;
10496 IXMLDOMDocument *doc;
10497 IDispatchEx *dispex;
10499 IDispatch *disp;
10501 VARIANT v[3];
10502 HRESULT hr;
10503 DISPID did;
10504 BSTR name;
10505 ULONG ret;
10506 LONG len;
10507
10508 doc = create_document(&IID_IXMLDOMDocument);
10509
10510 hr = IXMLDOMDocument_loadXML(doc, _bstr_(szExampleXML), &b);
10511 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10512
10513 hr = IXMLDOMDocument_selectNodes(doc, _bstr_("root"), &list);
10514 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10515
10516 hr = IXMLDOMNodeList_QueryInterface(list, &IID_IXMLDOMSelection, (void**)&selection);
10517 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10518 IXMLDOMSelection_Release(selection);
10519
10520 /* collection disp id */
10521 hr = IXMLDOMSelection_QueryInterface(selection, &IID_IDispatchEx, (void**)&dispex);
10522 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10523 did = 0;
10524 hr = IDispatchEx_GetDispID(dispex, _bstr_("0"), 0, &did);
10525 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10526 ok(did == DISPID_DOM_COLLECTION_BASE, "got %ld\n", did);
10527 len = 0;
10528 hr = IXMLDOMSelection_get_length(selection, &len);
10529 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10530 ok(len == 1, "got %ld\n", len);
10531 hr = IDispatchEx_GetDispID(dispex, _bstr_("10"), 0, &did);
10532 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10533 ok(did == DISPID_DOM_COLLECTION_BASE+10, "got %ld\n", did);
10534 IDispatchEx_Release(dispex);
10535
10536 /* IEnumVARIANT tests */
10537 enum1 = NULL;
10538 hr = IXMLDOMSelection_QueryInterface(selection, &IID_IEnumVARIANT, (void**)&enum1);
10539 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10540 ok(enum1 != NULL, "got %p\n", enum1);
10541 EXPECT_REF(enum1, 2);
10542
10544 hr = IXMLDOMSelection_QueryInterface(selection, &IID_IUnknown, (void**)&unk1);
10545 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10547 EXPECT_REF(enum1, 2);
10548
10549 /* enumerator and selection object return same IUnknown* */
10550 hr = IEnumVARIANT_QueryInterface(enum1, &IID_IUnknown, (void**)&unk2);
10551 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10553 EXPECT_REF(enum1, 2);
10554 ok(unk2 == unk1, "got %p, %p\n", unk1, unk2);
10555 IUnknown_Release(unk2);
10556
10558 IEnumVARIANT_AddRef(enum1);
10560 IEnumVARIANT_Release(enum1);
10561
10562 enum3 = NULL;
10563 hr = IXMLDOMSelection_QueryInterface(selection, &IID_IEnumVARIANT, (void**)&enum3);
10564 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10565 ok(enum3 != NULL, "got %p\n", enum3);
10566 ok(enum1 == enum3, "got %p and %p\n", enum1, enum3);
10567 EXPECT_REF(enum1, 3);
10568 IEnumVARIANT_Release(enum3);
10569
10571 EXPECT_REF(enum1, 2);
10572
10573 enum2 = NULL;
10574 hr = IXMLDOMSelection_get__newEnum(selection, (IUnknown**)&enum2);
10575 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10576 ok(enum2 != NULL, "got %p\n", enum2);
10577
10579 EXPECT_REF(enum1, 2);
10580 EXPECT_REF(enum2, 1);
10581
10582 ok(enum1 != enum2, "got %p, %p\n", enum1, enum2);
10583
10584 hr = IEnumVARIANT_QueryInterface(enum2, &IID_IUnknown, (void**)&unk2);
10585 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10587 EXPECT_REF(enum2, 2);
10588 ok(unk2 != unk1, "got %p, %p\n", unk1, unk2);
10589 IUnknown_Release(unk2);
10590 IUnknown_Release(unk1);
10591
10592 selection2 = NULL;
10593 hr = IEnumVARIANT_QueryInterface(enum1, &IID_IXMLDOMSelection, (void**)&selection2);
10594 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10595 ok(selection2 == selection, "got %p and %p\n", selection, selection2);
10597 EXPECT_REF(enum1, 2);
10598
10599 IXMLDOMSelection_Release(selection2);
10600
10601 hr = IEnumVARIANT_QueryInterface(enum1, &IID_IDispatch, (void**)&disp);
10602 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10604 IDispatch_Release(disp);
10605
10606 hr = IEnumVARIANT_QueryInterface(enum1, &IID_IEnumVARIANT, (void**)&enum3);
10607 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10608 ok(enum3 == enum1, "got %p and %p\n", enum3, enum1);
10610 EXPECT_REF(enum1, 3);
10611
10612 IEnumVARIANT_Release(enum1);
10613 IEnumVARIANT_Release(enum2);
10614 IEnumVARIANT_Release(enum3);
10615
10616 enum1 = NULL;
10617 hr = IXMLDOMSelection_get__newEnum(selection, (IUnknown**)&enum1);
10618 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10619 ok(enum1 != NULL, "got %p\n", enum1);
10620 EXPECT_REF(enum1, 1);
10622
10623 enum2 = NULL;
10624 hr = IXMLDOMSelection_get__newEnum(selection, (IUnknown**)&enum2);
10625 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10626 ok(enum2 != NULL, "got %p\n", enum2);
10627 EXPECT_REF(enum2, 1);
10629
10630 ok(enum1 != enum2, "got %p, %p\n", enum1, enum2);
10631
10632 IEnumVARIANT_AddRef(enum1);
10634 EXPECT_REF(enum1, 2);
10635 EXPECT_REF(enum2, 1);
10636 IEnumVARIANT_Release(enum1);
10637
10638 IEnumVARIANT_Release(enum1);
10639 IEnumVARIANT_Release(enum2);
10640
10642
10643 IXMLDOMNodeList_Release(list);
10644
10645 hr = IXMLDOMDocument_get_childNodes(doc, &list);
10646 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10647
10648 hr = IXMLDOMNodeList_QueryInterface(list, &IID_IXMLDOMSelection, (void**)&selection);
10649 ok(hr == E_NOINTERFACE, "Unexpected hr %#lx.\n", hr);
10650
10651 IXMLDOMNodeList_Release(list);
10652
10653 /* test if IEnumVARIANT touches selection context */
10654 hr = IXMLDOMDocument_loadXML(doc, _bstr_(xpath_simple_list), &b);
10655 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10656
10657 hr = IXMLDOMDocument_selectNodes(doc, _bstr_("root/*"), &list);
10658 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10659
10660 hr = IXMLDOMNodeList_QueryInterface(list, &IID_IXMLDOMSelection, (void**)&selection);
10661 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10662
10663 len = 0;
10664 hr = IXMLDOMSelection_get_length(selection, &len);
10665 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10666 ok(len == 4, "got %ld\n", len);
10667
10668 enum1 = NULL;
10669 hr = IXMLDOMSelection_get__newEnum(selection, (IUnknown**)&enum1);
10670 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10671
10672 /* no-op if zero count */
10673 V_VT(&v[0]) = VT_I2;
10674 hr = IEnumVARIANT_Next(enum1, 0, &v[0], NULL);
10675 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10676 ok(V_VT(&v[0]) == VT_I2, "got var type %d\n", V_VT(&v[0]));
10677
10678 /* positive count, null array pointer */
10679 hr = IEnumVARIANT_Next(enum1, 1, NULL, NULL);
10680 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
10681
10682 hr = IEnumVARIANT_Next(enum1, 1, NULL, &ret);
10683 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
10684 ok(ret == 0, "got %ld\n", ret);
10685
10686 V_VT(&v[0]) = VT_I2;
10687 hr = IEnumVARIANT_Next(enum1, 1, &v[0], NULL);
10688 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10689 ok(V_VT(&v[0]) == VT_DISPATCH, "got var type %d\n", V_VT(&v[0]));
10690
10691 hr = IDispatch_QueryInterface(V_DISPATCH(&v[0]), &IID_IXMLDOMNode, (void**)&node);
10692 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10693 hr = IXMLDOMNode_get_nodeName(node, &name);
10694 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10695 ok(!lstrcmpW(name, L"a"), "got node name %s\n", wine_dbgstr_w(name));
10697 IXMLDOMNode_Release(node);
10698 VariantClear(&v[0]);
10699
10700 /* list cursor is updated */
10701 hr = IXMLDOMSelection_nextNode(selection, &node);
10702 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10703 hr = IXMLDOMNode_get_nodeName(node, &name);
10704 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10705 ok(!lstrcmpW(name, L"c"), "got node name %s\n", wine_dbgstr_w(name));
10706 IXMLDOMNode_Release(node);
10708
10709 V_VT(&v[0]) = VT_I2;
10710 hr = IEnumVARIANT_Next(enum1, 1, &v[0], NULL);
10711 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10712 ok(V_VT(&v[0]) == VT_DISPATCH, "got var type %d\n", V_VT(&v[0]));
10713 hr = IDispatch_QueryInterface(V_DISPATCH(&v[0]), &IID_IXMLDOMNode, (void**)&node);
10714 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10715 hr = IXMLDOMNode_get_nodeName(node, &name);
10716 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10717 ok(!lstrcmpW(name, L"b"), "got node name %s\n", wine_dbgstr_w(name));
10719 IXMLDOMNode_Release(node);
10720 VariantClear(&v[0]);
10721
10722 hr = IXMLDOMSelection_nextNode(selection, &node);
10723 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10724 hr = IXMLDOMNode_get_nodeName(node, &name);
10725 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10726 ok(!lstrcmpW(name, L"d"), "got node name %s\n", wine_dbgstr_w(name));
10727 IXMLDOMNode_Release(node);
10729
10730 hr = IEnumVARIANT_Reset(enum1);
10731 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10732
10733 /* getting multiple elements */
10734 V_VT(&v[1]) = VT_EMPTY;
10735 V_VT(&v[0]) = VT_EMPTY;
10736 hr = IEnumVARIANT_Next(enum1, 2, v, &ret);
10737 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10738 ok(ret == 2, "got %ld, expected 2\n", ret);
10739 ok(V_VT(&v[0]) == VT_DISPATCH, "got var type %d\n", V_VT(&v[0]));
10740 ok(V_VT(&v[1]) == VT_DISPATCH, "got var type %d\n", V_VT(&v[1]));
10741
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"a"), "got node name %s\n", wine_dbgstr_w(name));
10748 IXMLDOMNode_Release(node);
10749
10750 hr = IDispatch_QueryInterface(V_DISPATCH(&v[1]), &IID_IXMLDOMNode, (void**)&node);
10751 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10752 hr = IXMLDOMNode_get_nodeName(node, &name);
10753 ok(!lstrcmpW(name, L"b"), "got node name %s\n", wine_dbgstr_w(name));
10755 IXMLDOMNode_Release(node);
10756
10757 VariantClear(&v[1]);
10758 VariantClear(&v[0]);
10759
10760 /* IEnumVARIANT_Next makes the IXMLDOMSelection cursor advance one step more */
10761 hr = IXMLDOMSelection_nextNode(selection, &node);
10762 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10763 hr = IXMLDOMNode_get_nodeName(node, &name);
10764 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10765 ok(!lstrcmpW(name, L"d"), "got node name %s\n", wine_dbgstr_w(name));
10767 IXMLDOMNode_Release(node);
10768
10769 /* The IEnumVARIANT cursor is still at position '2', */
10770 /* therefore attempting to fetch 4 elements yields 'c' and 'd' */
10771 V_VT(&v[2]) = VT_NULL;
10772 V_VT(&v[1]) = VT_EMPTY;
10773 V_VT(&v[0]) = VT_EMPTY;
10774 hr = IEnumVARIANT_Next(enum1, 4, v, &ret);
10775 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
10776 ok(ret == 2, "got %ld, expected 2\n", ret);
10777
10778 ok(V_VT(&v[0]) == VT_DISPATCH, "got var type %d\n", V_VT(&v[0]));
10779 hr = IDispatch_QueryInterface(V_DISPATCH(&v[0]), &IID_IXMLDOMNode, (void**)&node);
10780 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10781 hr = IXMLDOMNode_get_nodeName(node, &name);
10782 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10783 ok(!lstrcmpW(name, L"c"), "got node name %s\n", wine_dbgstr_w(name));
10785 IXMLDOMNode_Release(node);
10786
10787 ok(V_VT(&v[1]) == VT_DISPATCH, "got var type %d\n", V_VT(&v[1]));
10788 hr = IDispatch_QueryInterface(V_DISPATCH(&v[1]), &IID_IXMLDOMNode, (void**)&node);
10789 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10790 hr = IXMLDOMNode_get_nodeName(node, &name);
10791 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10792 ok(!lstrcmpW(name, L"d"), "got node name %s\n", wine_dbgstr_w(name));
10794 IXMLDOMNode_Release(node);
10795
10796 ok(V_VT(&v[2]) == VT_EMPTY, "got var type %d, expected %d (VT_EMPTY)\n", V_VT(&v[2]), VT_EMPTY);
10797
10798 VariantClear(&v[1]);
10799 VariantClear(&v[0]);
10800
10801 IEnumVARIANT_Release(enum1);
10802
10803 IXMLDOMSelection_Release(selection);
10804 IXMLDOMNodeList_Release(list);
10805 IXMLDOMDocument_Release(doc);
10806
10807 free_bstrs();
10808}
10809
10810static void write_to_file(const char *name, const char *data)
10811{
10812 DWORD written;
10813 HANDLE hfile;
10814 BOOL ret;
10815
10817 ok(hfile != INVALID_HANDLE_VALUE, "failed to create test file: %s\n", name);
10818
10819 ret = WriteFile(hfile, data, strlen(data), &written, NULL);
10820 ok(ret, "WriteFile failed: %s, %ld\n", name, GetLastError());
10821
10822 CloseHandle(hfile);
10823}
10824
10825#define TEST_DOC_LOAD_FROM_PATH(doc,path,expected_hr, expected_ret) \
10826 _test_doc_load_from_path(doc, path, expected_hr, expected_ret, __LINE__)
10827static void _test_doc_load_from_path(IXMLDOMDocument *doc, const char *path,
10828 HRESULT expected_hr, VARIANT_BOOL expected_ret, int line)
10829{
10830 IXMLDOMDocument *doc2;
10832 BSTR url, url2;
10834 VARIANT src;
10835 HRESULT hr;
10836
10837 url = _bstr_(path);
10838
10839 V_VT(&src) = VT_BSTR;
10840 V_BSTR(&src) = url;
10841 hr = IXMLDOMDocument_load(doc, src, &b);
10842 ok_(__FILE__, line)(hr == expected_hr, "Failed to load document, %#lx.\n", hr);
10843 ok_(__FILE__, line)(b == expected_ret, "got %d\n", b);
10844
10845 V_VT(&src) = VT_BSTR | VT_BYREF;
10846 V_BSTRREF(&src) = &url;
10847 hr = IXMLDOMDocument_load(doc, src, &b);
10848 ok_(__FILE__, line)(hr == expected_hr, "Failed to load document, %#lx.\n", hr);
10849 ok_(__FILE__, line)(b == expected_ret, "got %d\n", b);
10850
10851 if (expected_hr != S_OK)
10852 return;
10853
10854 url = NULL;
10855 hr = IXMLDOMDocument_get_url(doc, &url);
10856 ok_(__FILE__, line)(hr == S_OK, "Failed to get document url, hr %#lx.\n", hr);
10857
10858 hr = IXMLDOMDocument_get_documentElement(doc, &elem);
10859 ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10860
10861 /* Create another instance for the same document, check url */
10862 hr = IXMLDOMElement_get_ownerDocument(elem, &doc2);
10863 ok_(__FILE__, line)(hr == S_OK, "Failed to get owner document, hr %#lx.\n", hr);
10864
10865 hr = IXMLDOMDocument_get_url(doc2, &url2);
10866 ok_(__FILE__, line)(hr == S_OK, "Failed to get document url, hr %#lx.\n", hr);
10867 ok_(__FILE__, line)(!lstrcmpW(url, url2), "Unexpected url %s.\n", wine_dbgstr_w(url2));
10868
10869 IXMLDOMDocument_Release(doc2);
10870 IXMLDOMElement_Release(elem);
10873}
10874
10875static void url_forward_slash(char *url)
10876{
10877 char *p = url;
10878
10879 while (*p)
10880 {
10881 if (*p == '\\')
10882 *p = '/';
10883 p++;
10884 }
10885}
10886
10887static void test_load(void)
10888{
10889 char path[MAX_PATH], path2[MAX_PATH];
10891 IXMLDOMDocument *doc;
10892 BSTR bstr1, bstr2;
10893 IStream *stream;
10895 VARIANT src;
10896 HRESULT hr;
10897 void* ptr;
10898 int n;
10899 struct encoding_test
10900 {
10901 const char *xml;
10902 HRESULT expected_hr;
10903 VARIANT_BOOL expected_ret;
10904 } encoding_tests[] =
10905 {
10906 { gbkxml, S_OK, VARIANT_TRUE },
10907 { iso8859_1_xml, S_OK, VARIANT_TRUE },
10908 { win1252xml, S_OK, VARIANT_TRUE },
10909 { win936xml, S_FALSE, VARIANT_FALSE },
10910 };
10911
10912
10914 strcat(path, "winetest.xml");
10915
10916 /* prepare a file */
10918
10919 doc = create_document(&IID_IXMLDOMDocument);
10920
10921 /* null pointer as input */
10922 V_VT(&src) = VT_UNKNOWN;
10923 V_UNKNOWN(&src) = NULL;
10924 hr = IXMLDOMDocument_load(doc, src, &b);
10925 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
10926 ok(b == VARIANT_FALSE, "got %d\n", b);
10927
10928 /* "file://" url */
10929 strcpy(path2, "file://");
10930 strcat(path2, path);
10931 TEST_DOC_LOAD_FROM_PATH(doc, path2, S_OK, VARIANT_TRUE);
10932
10933 /* file:// url, forward slashes */
10935 TEST_DOC_LOAD_FROM_PATH(doc, path2, S_OK, VARIANT_TRUE);
10936
10937 /* "file:/" url */
10938 strcpy(path2, "file:/");
10939 strcat(path2, path);
10940 TEST_DOC_LOAD_FROM_PATH(doc, path, S_OK, VARIANT_TRUE);
10941
10942 /* file:/ with forward slashes. */
10944 TEST_DOC_LOAD_FROM_PATH(doc, path2, S_OK, VARIANT_TRUE);
10945
10946 /* Regular local path. */
10947 TEST_DOC_LOAD_FROM_PATH(doc, path, S_OK, VARIANT_TRUE);
10948
10949 /* load from a path: VT_BSTR|VT_BYREF, null ptr */
10950 V_VT(&src) = VT_BSTR | VT_BYREF;
10951 V_BSTRREF(&src) = NULL;
10952 hr = IXMLDOMDocument_load(doc, src, &b);
10953 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
10954 ok(b == VARIANT_FALSE, "got %d\n", b);
10955
10956 bstr1 = NULL;
10957 hr = IXMLDOMDocument_get_url(doc, &bstr1);
10958 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
10959 SysFreeString(bstr1);
10960
10961 /* Regular local path with some URL encoded characters. */
10962 strcpy(path2, path);
10963 n = strlen(path2);
10964 strcpy(&path2[n-1], "%6C"); /* C:\path\to\winetest.xm%6C */
10965 TEST_DOC_LOAD_FROM_PATH(doc, path2, S_OK, VARIANT_TRUE);
10966
10967 /* Both spaces and %20s work. */
10969 strcat(path2, "wine test.xml");
10971 TEST_DOC_LOAD_FROM_PATH(doc, path2, S_OK, VARIANT_TRUE);
10973 strcat(path2, "wine%20test.xml");
10974 TEST_DOC_LOAD_FROM_PATH(doc, path2, S_OK, VARIANT_TRUE);
10976
10978
10979 /* load from existing path, no xml content */
10981
10982 V_VT(&src) = VT_BSTR;
10983 V_BSTR(&src) = _bstr_(path);
10984 b = VARIANT_TRUE;
10985 hr = IXMLDOMDocument_load(doc, src, &b);
10986 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
10987 ok(b == VARIANT_FALSE, "got %d\n", b);
10988
10989 bstr1 = (void *)0xdeadbeef;
10990 hr = IXMLDOMDocument_get_url(doc, &bstr1);
10991 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
10992 ok(bstr1 == NULL, "got %p\n", bstr1);
10993
10995 IXMLDOMDocument_Release(doc);
10996
10997 doc = create_document(&IID_IXMLDOMDocument);
10998
10999 hr = IXMLDOMDocument_loadXML(doc, _bstr_(szExampleXML), &b);
11000 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11001 ok(b == VARIANT_TRUE, "got %d\n", b);
11002
11003 hr = IXMLDOMDocument_selectNodes(doc, _bstr_("//*"), &list);
11004 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11005 bstr1 = _bstr_(list_to_string(list));
11006
11007 hr = IXMLDOMNodeList_reset(list);
11008 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11009
11010 IXMLDOMDocument_Release(doc);
11011
11012 doc = create_document(&IID_IXMLDOMDocument);
11013
11014 VariantInit(&src);
11016 V_VT(&src) = VT_ARRAY|VT_UI1;
11017 ok(V_ARRAY(&src) != NULL, "SafeArrayCreateVector() returned NULL\n");
11018 ptr = NULL;
11020 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11021 ok(ptr != NULL, "SafeArrayAccessData() returned NULL\n");
11022
11025 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11026
11027 hr = IXMLDOMDocument_load(doc, src, &b);
11028 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11029 ok(b == VARIANT_TRUE, "got %d\n", b);
11030
11031 hr = IXMLDOMDocument_selectNodes(doc, _bstr_("//*"), &list);
11032 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11033 bstr2 = _bstr_(list_to_string(list));
11034
11035 hr = IXMLDOMNodeList_reset(list);
11036 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11037
11038 ok(lstrcmpW(bstr1, bstr2) == 0, "strings not equal: %s : %s\n",
11039 wine_dbgstr_w(bstr1), wine_dbgstr_w(bstr2));
11040
11041 IXMLDOMDocument_Release(doc);
11042 IXMLDOMNodeList_Release(list);
11043 VariantClear(&src);
11044
11045 /* UTF-16 isn't accepted */
11046 doc = create_document(&IID_IXMLDOMDocument);
11047
11049 V_VT(&src) = VT_ARRAY|VT_UI1;
11050 ok(V_ARRAY(&src) != NULL, "SafeArrayCreateVector() returned NULL\n");
11051 ptr = NULL;
11053 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11054 ok(ptr != NULL, "SafeArrayAccessData() returned NULL\n");
11055
11058 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11059
11060 hr = IXMLDOMDocument_load(doc, src, &b);
11061 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
11062 ok(b == VARIANT_FALSE, "got %d\n", b);
11063
11064 VariantClear(&src);
11065
11066 /* it doesn't like it as a VT_ARRAY|VT_UI2 either */
11068 V_VT(&src) = VT_ARRAY|VT_UI2;
11069 ok(V_ARRAY(&src) != NULL, "SafeArrayCreateVector() returned NULL\n");
11070 ptr = NULL;
11072 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11073 ok(ptr != NULL, "SafeArrayAccessData() returned NULL\n");
11074
11077 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11078
11079 hr = IXMLDOMDocument_load(doc, src, &b);
11080 todo_wine ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
11081 ok(b == VARIANT_FALSE, "got %d\n", b);
11082
11083 VariantClear(&src);
11084
11085 /* test istream with empty content */
11087 V_VT(&src) = VT_UNKNOWN;
11089 b = VARIANT_TRUE;
11090 hr = IXMLDOMDocument_load(doc, src, &b);
11091 todo_wine ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
11092 ok(b == VARIANT_FALSE, "got %d\n", b);
11094 VariantClear(&src);
11095
11096 /* test istream with valid xml */
11098 V_VT(&src) = VT_UNKNOWN;
11100 b = VARIANT_FALSE;
11101 hr = IXMLDOMDocument_load(doc, src, &b);
11102 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11103 ok(b == VARIANT_TRUE, "got %d\n", b);
11105 VariantClear(&src);
11106
11107 IXMLDOMDocument_Release(doc);
11108
11109 /* Encoding tests. */
11110 for (n = 0; n < ARRAY_SIZE(encoding_tests); n++)
11111 {
11113 strcat(path, "codepage_test.xml");
11114 write_to_file(path, encoding_tests[n].xml);
11115 doc = create_document(&IID_IXMLDOMDocument);
11116 TEST_DOC_LOAD_FROM_PATH(doc, path, encoding_tests[n].expected_hr, encoding_tests[n].expected_ret);
11118 IXMLDOMDocument_Release(doc);
11119 }
11120
11121 free_bstrs();
11122}
11123
11125{
11127 IDispatchEx *dispex;
11128 IUnknown *unk;
11129 DWORD props;
11130 UINT ticnt;
11131 HRESULT hr;
11132 BSTR name;
11133
11134 hr = IUnknown_QueryInterface(obj, &IID_IDispatchEx, (void**)&dispex);
11135 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11136 if (FAILED(hr)) return;
11137
11138 ticnt = 0;
11139 hr = IDispatchEx_GetTypeInfoCount(dispex, &ticnt);
11140 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11141 ok(ticnt == 1, "ticnt=%u\n", ticnt);
11142
11143 name = SysAllocString(L"*");
11144 hr = IDispatchEx_DeleteMemberByName(dispex, name, fdexNameCaseSensitive);
11145 ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr);
11147
11148 hr = IDispatchEx_DeleteMemberByDispID(dispex, dispid);
11149 ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr);
11150
11151 props = 0;
11152 hr = IDispatchEx_GetMemberProperties(dispex, dispid, grfdexPropCanAll, &props);
11153 ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr);
11154 ok(props == 0, "expected 0 got %ld\n", props);
11155
11156 hr = IDispatchEx_GetMemberName(dispex, dispid, &name);
11157 ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr);
11159
11160 hr = IDispatchEx_GetNextDispID(dispex, fdexEnumDefault, DISPID_XMLDOM_NODELIST_RESET, &dispid);
11161 ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr);
11162
11163 unk = (IUnknown*)0xdeadbeef;
11164 hr = IDispatchEx_GetNameSpaceParent(dispex, &unk);
11165 ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr);
11166 ok(unk == (IUnknown*)0xdeadbeef, "got %p\n", unk);
11167
11168 name = SysAllocString(L"testprop");
11169 hr = IDispatchEx_GetDispID(dispex, name, fdexNameEnsure, &dispid);
11170 ok(hr == DISP_E_UNKNOWNNAME, "Unexpected hr %#lx.\n", hr);
11172
11173 IDispatchEx_Release(dispex);
11174}
11175
11177{
11178 static const char xmluriA[] = "http://www.w3.org/XML/1998/namespace";
11179 IMXNamespacePrefixes *prefixes;
11180 IVBMXNamespaceManager *mgr2;
11181 IMXNamespaceManager *nsmgr;
11182 IUnknown *unk1, *unk2;
11183 WCHAR buffW[250];
11184 IUnknown *unk;
11185 HRESULT hr;
11186 INT len;
11187
11188 hr = CoCreateInstance(&CLSID_MXNamespaceManager40, NULL, CLSCTX_INPROC_SERVER,
11189 &IID_IMXNamespaceManager, (void**)&nsmgr);
11190 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11191
11193 check_interface(nsmgr, &IID_IDispatchEx, TRUE);
11194 check_interface(nsmgr, &IID_IMXNamespaceManager, TRUE);
11195 check_interface(nsmgr, &IID_IVBMXNamespaceManager, TRUE);
11196
11197 hr = IMXNamespaceManager_QueryInterface(nsmgr, &IID_IVBMXNamespaceManager, (void**)&mgr2);
11198 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11199
11200 EXPECT_REF(nsmgr, 2);
11201 EXPECT_REF(mgr2, 2);
11202 prefixes = NULL;
11203 hr = IVBMXNamespaceManager_getDeclaredPrefixes(mgr2, &prefixes);
11204 todo_wine
11205 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11206 if (hr == S_OK)
11207 {
11208 IDispatchEx *dispex;
11209 VARIANT arg, ret;
11210 DISPPARAMS dispparams;
11211
11212 ok(prefixes != NULL, "got %p\n", prefixes);
11213 EXPECT_REF(nsmgr, 2);
11214 EXPECT_REF(mgr2, 2);
11215 EXPECT_REF(prefixes, 1);
11216
11217 IVBMXNamespaceManager_QueryInterface(mgr2, &IID_IUnknown, (void**)&unk1);
11218 IMXNamespacePrefixes_QueryInterface(prefixes, &IID_IUnknown, (void**)&unk2);
11219
11220 EXPECT_REF(mgr2, 3);
11221 EXPECT_REF(prefixes, 2);
11222
11223 IUnknown_Release(unk1);
11224 IUnknown_Release(unk2);
11225
11226 hr = IMXNamespacePrefixes_QueryInterface(prefixes, &IID_IDispatchEx, (void**)&dispex);
11227 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11228
11229 V_VT(&arg) = VT_I4;
11230 V_I4(&arg) = 0;
11231 dispparams.cArgs = 1;
11232 dispparams.cNamedArgs = 0;
11233 dispparams.rgdispidNamedArgs = NULL;
11234 dispparams.rgvarg = &arg;
11235
11236 V_VT(&ret) = VT_EMPTY;
11237 V_DISPATCH(&ret) = (void*)0x1;
11238 hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_METHOD, &dispparams, &ret, NULL, NULL);
11239 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11240 ok(V_VT(&ret) == VT_BSTR, "got %d\n", V_VT(&ret));
11241 ok(V_BSTR(&ret) != NULL, "got %p\n", V_BSTR(&ret));
11242 VariantClear(&ret);
11243
11244 IDispatchEx_Release(dispex);
11245 IMXNamespacePrefixes_Release(prefixes);
11246 }
11247 IVBMXNamespaceManager_Release(mgr2);
11248
11249 hr = IMXNamespaceManager_declarePrefix(nsmgr, NULL, NULL);
11250 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11251
11252 /* prefix already added */
11253 hr = IMXNamespaceManager_declarePrefix(nsmgr, NULL, _bstr_("ns0 uri"));
11254 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
11255
11256 hr = IMXNamespaceManager_declarePrefix(nsmgr, _bstr_("ns0"), NULL);
11257 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
11258
11259 /* "xml" and "xmlns" are not allowed here */
11260 hr = IMXNamespaceManager_declarePrefix(nsmgr, _bstr_("xml"), _bstr_("uri1"));
11261 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
11262
11263 hr = IMXNamespaceManager_declarePrefix(nsmgr, _bstr_("xmlns"), _bstr_("uri1"));
11264 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
11265todo_wine {
11266 hr = IMXNamespaceManager_getDeclaredPrefix(nsmgr, -1, NULL, NULL);
11267 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
11268}
11269 hr = IMXNamespaceManager_getDeclaredPrefix(nsmgr, 0, NULL, NULL);
11270 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
11271
11272 len = -1;
11273 hr = IMXNamespaceManager_getDeclaredPrefix(nsmgr, 0, NULL, &len);
11274 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11275 ok(len == 3, "got %d\n", len);
11276
11277 len = -1;
11278 buffW[0] = 0x1;
11279 hr = IMXNamespaceManager_getDeclaredPrefix(nsmgr, 0, buffW, &len);
11280 ok(hr == E_XML_BUFFERTOOSMALL, "Unexpected hr %#lx.\n", hr);
11281 ok(len == -1, "got %d\n", len);
11282 ok(buffW[0] == 0x1, "got %x\n", buffW[0]);
11283
11284 len = 10;
11285 buffW[0] = 0x1;
11286 hr = IMXNamespaceManager_getDeclaredPrefix(nsmgr, 0, buffW, &len);
11287 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11288 ok(len == 3, "got %d\n", len);
11289 ok(!lstrcmpW(buffW, L"xml"), "got prefix %s\n", wine_dbgstr_w(buffW));
11290
11291 /* getURI */
11292 hr = IMXNamespaceManager_getURI(nsmgr, NULL, NULL, NULL, NULL);
11293 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
11294
11295 len = -1;
11296 hr = IMXNamespaceManager_getURI(nsmgr, NULL, NULL, NULL, &len);
11297 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
11298 ok(len == -1, "got %d\n", len);
11299
11300 hr = IMXNamespaceManager_getURI(nsmgr, _bstr_("xml"), NULL, NULL, NULL);
11301 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
11302
11303 len = -1;
11304 hr = IMXNamespaceManager_getURI(nsmgr, _bstr_("xml"), NULL, NULL, &len);
11305 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11306 /* length of "xml" uri is constant */
11307 ok(len == strlen(xmluriA), "got %d\n", len);
11308
11309 len = 100;
11310 hr = IMXNamespaceManager_getURI(nsmgr, _bstr_("xml"), NULL, buffW, &len);
11311 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11312 ok(len == strlen(xmluriA), "got %d\n", len);
11313 ok(!lstrcmpW(buffW, _bstr_(xmluriA)), "got prefix %s\n", wine_dbgstr_w(buffW));
11314
11315 len = strlen(xmluriA)-1;
11316 buffW[0] = 0x1;
11317 hr = IMXNamespaceManager_getURI(nsmgr, _bstr_("xml"), NULL, buffW, &len);
11318 ok(hr == E_XML_BUFFERTOOSMALL, "Unexpected hr %#lx.\n", hr);
11319 ok(len == strlen(xmluriA)-1, "got %d\n", len);
11320 ok(buffW[0] == 0x1, "got %x\n", buffW[0]);
11321
11322 /* prefix xml1 not defined */
11323 len = -1;
11324 hr = IMXNamespaceManager_getURI(nsmgr, _bstr_("xml1"), NULL, NULL, &len);
11325 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
11326 ok(len == 0, "got %d\n", len);
11327
11328 len = 100;
11329 buffW[0] = 0x1;
11330 hr = IMXNamespaceManager_getURI(nsmgr, _bstr_("xml1"), NULL, buffW, &len);
11331 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
11332 ok(buffW[0] == 0, "got %x\n", buffW[0]);
11333 ok(len == 0, "got %d\n", len);
11334
11335 /* IDispatchEx tests */
11336 hr = IMXNamespaceManager_QueryInterface(nsmgr, &IID_IUnknown, (void**)&unk);
11337 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11338 test_domobj_dispex(unk);
11339 IUnknown_Release(unk);
11340
11341 IMXNamespaceManager_Release(nsmgr);
11342
11343 /* ::getPrefix() */
11344 hr = CoCreateInstance(&CLSID_MXNamespaceManager40, NULL, CLSCTX_INPROC_SERVER,
11345 &IID_IMXNamespaceManager, (void**)&nsmgr);
11346 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11347
11348 hr = IMXNamespaceManager_getPrefix(nsmgr, NULL, 0, NULL, NULL);
11349 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
11350
11351 len = -1;
11352 hr = IMXNamespaceManager_getPrefix(nsmgr, NULL, 0, NULL, &len);
11353 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
11354 ok(len == -1, "got %d\n", len);
11355
11356 len = 100;
11357 buffW[0] = 0x1;
11358 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("ns0 uri"), 0, buffW, &len);
11359 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
11360 ok(buffW[0] == 0x1, "got %x\n", buffW[0]);
11361 ok(len == 100, "got %d\n", len);
11362
11363 len = 0;
11364 buffW[0] = 0x1;
11365 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("ns0 uri"), 0, buffW, &len);
11366 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
11367 ok(buffW[0] == 0x1, "got %x\n", buffW[0]);
11368 ok(len == 0, "got %d\n", len);
11369
11370 hr = IMXNamespaceManager_declarePrefix(nsmgr, _bstr_("ns1"), _bstr_("ns1 uri"));
11371 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11372
11373 len = 100;
11374 buffW[0] = 0x1;
11375 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("ns1 uri"), 0, buffW, &len);
11376 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11377 ok(!lstrcmpW(buffW, L"ns1"), "got %s\n", wine_dbgstr_w(buffW));
11378 ok(len == 3, "got %d\n", len);
11379
11380 len = 100;
11381 buffW[0] = 0x1;
11382 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("http://www.w3.org/XML/1998/namespace"), 0, buffW, &len);
11383 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11384 ok(!lstrcmpW(buffW, L"xml"), "got %s\n", wine_dbgstr_w(buffW));
11385 ok(len == 3, "got %d\n", len);
11386
11387 /* with null buffer it's possible to get required length */
11388 len = 100;
11389 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("http://www.w3.org/XML/1998/namespace"), 0, NULL, &len);
11390 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11391 ok(len == 3, "got %d\n", len);
11392
11393 len = 0;
11394 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("http://www.w3.org/XML/1998/namespace"), 0, NULL, &len);
11395 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11396 ok(len == 3, "got %d\n", len);
11397
11398 len = 100;
11399 buffW[0] = 0x1;
11400 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("ns1 uri"), 1, buffW, &len);
11401 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
11402 ok(buffW[0] == 0x1, "got %x\n", buffW[0]);
11403 ok(len == 100, "got %d\n", len);
11404
11405 len = 100;
11406 buffW[0] = 0x1;
11407 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("ns1 uri"), 2, buffW, &len);
11408 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
11409 ok(buffW[0] == 0x1, "got %x\n", buffW[0]);
11410 ok(len == 100, "got %d\n", len);
11411
11412 len = 100;
11413 buffW[0] = 0x1;
11414 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_(""), 0, buffW, &len);
11415 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
11416 ok(buffW[0] == 0x1, "got %x\n", buffW[0]);
11417 ok(len == 100, "got %d\n", len);
11418
11419 len = 100;
11420 buffW[0] = 0x1;
11421 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_(""), 1, buffW, &len);
11422 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
11423 ok(buffW[0] == 0x1, "got %x\n", buffW[0]);
11424 ok(len == 100, "got %d\n", len);
11425
11426 len = 100;
11427 buffW[0] = 0x1;
11428 hr = IMXNamespaceManager_getPrefix(nsmgr, NULL, 0, buffW, &len);
11429 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
11430 ok(buffW[0] == 0x1, "got %x\n", buffW[0]);
11431 ok(len == 100, "got %d\n", len);
11432
11433 len = 100;
11434 buffW[0] = 0x1;
11435 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("ns0 uri"), 1, buffW, &len);
11436 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
11437 ok(buffW[0] == 0x1, "got %x\n", buffW[0]);
11438 ok(len == 100, "got %d\n", len);
11439
11440 len = 100;
11441 buffW[0] = 0x1;
11442 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_(""), 1, buffW, &len);
11443 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
11444 ok(buffW[0] == 0x1, "got %x\n", buffW[0]);
11445 ok(len == 100, "got %d\n", len);
11446
11447 /* declare another one, indices are shifted */
11448 hr = IMXNamespaceManager_declarePrefix(nsmgr, _bstr_("ns2"), _bstr_("ns2 uri"));
11449 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11450
11451 len = 100;
11452 buffW[0] = 0x1;
11453 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("ns1 uri"), 0, buffW, &len);
11454 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11455 ok(!lstrcmpW(buffW, L"ns1"), "got %s\n", wine_dbgstr_w(buffW));
11456 ok(len == 3, "got %d\n", len);
11457
11458 len = 100;
11459 buffW[0] = 0x1;
11460 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("ns2 uri"), 0, buffW, &len);
11461 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11462 ok(!lstrcmpW(buffW, L"ns2"), "got %s\n", wine_dbgstr_w(buffW));
11463 ok(len == 3, "got %d\n", len);
11464
11465 len = 100;
11466 buffW[0] = 0x1;
11467 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("ns2 uri"), 1, buffW, &len);
11468 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
11469 ok(buffW[0] == 0x1, "got %x\n", buffW[0]);
11470 ok(len == 100, "got %d\n", len);
11471
11472 len = 100;
11473 buffW[0] = 0x1;
11474 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_(""), 1, buffW, &len);
11475 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
11476 ok(buffW[0] == 0x1, "got %x\n", buffW[0]);
11477 ok(len == 100, "got %d\n", len);
11478
11479 IMXNamespaceManager_Release(nsmgr);
11480
11481 /* push/pop tests */
11482 hr = CoCreateInstance(&CLSID_MXNamespaceManager40, NULL, CLSCTX_INPROC_SERVER,
11483 &IID_IMXNamespaceManager, (void**)&nsmgr);
11484 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11485
11486 /* pop with empty stack */
11487 hr = IMXNamespaceManager_popContext(nsmgr);
11488 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
11489
11490 hr = IMXNamespaceManager_declarePrefix(nsmgr, _bstr_("ns1"), _bstr_("ns1 uri"));
11491 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11492
11493 len = 100;
11494 buffW[0] = 0x1;
11495 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("ns1 uri"), 0, buffW, &len);
11496 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11497 ok(!lstrcmpW(buffW, L"ns1"), "got %s\n", wine_dbgstr_w(buffW));
11498 ok(len == 3, "got %d\n", len);
11499
11500 hr = IMXNamespaceManager_pushContext(nsmgr);
11501 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11502
11503 len = 100;
11504 buffW[0] = 0x1;
11505 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("ns1 uri"), 0, buffW, &len);
11506 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11507 ok(!lstrcmpW(buffW, L"ns1"), "got %s\n", wine_dbgstr_w(buffW));
11508 ok(len == 3, "got %d\n", len);
11509
11510 hr = IMXNamespaceManager_declarePrefix(nsmgr, _bstr_("ns2"), _bstr_("ns2 uri"));
11511 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11512
11513 len = 100;
11514 buffW[0] = 0x1;
11515 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("ns2 uri"), 0, buffW, &len);
11516 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11517 ok(!lstrcmpW(buffW, L"ns2"), "got %s\n", wine_dbgstr_w(buffW));
11518 ok(len == 3, "got %d\n", len);
11519
11520 hr = IMXNamespaceManager_pushContext(nsmgr);
11521 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11522 hr = IMXNamespaceManager_declarePrefix(nsmgr, _bstr_("ns3"), _bstr_("ns3 uri"));
11523 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11524
11525 len = 100;
11526 buffW[0] = 0x1;
11527 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("ns2 uri"), 0, buffW, &len);
11528 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11529 ok(!lstrcmpW(buffW, L"ns2"), "got %s\n", wine_dbgstr_w(buffW));
11530 ok(len == 3, "got %d\n", len);
11531
11532 len = 100;
11533 buffW[0] = 0x1;
11534 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("ns1 uri"), 0, buffW, &len);
11535 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11536 ok(!lstrcmpW(buffW, L"ns1"), "got %s\n", wine_dbgstr_w(buffW));
11537 ok(len == 3, "got %d\n", len);
11538
11539 hr = IMXNamespaceManager_popContext(nsmgr);
11540 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11541
11542 hr = IMXNamespaceManager_popContext(nsmgr);
11543 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11544
11545 len = 100;
11546 buffW[0] = 0x1;
11547 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("ns2 uri"), 0, buffW, &len);
11548 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
11549 ok(buffW[0] == 0x1, "got %x\n", buffW[0]);
11550 ok(len == 100, "got %d\n", len);
11551
11552 len = 100;
11553 buffW[0] = 0x1;
11554 hr = IMXNamespaceManager_getPrefix(nsmgr, _bstr_("ns1 uri"), 0, buffW, &len);
11555 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11556 ok(!lstrcmpW(buffW, L"ns1"), "got %s\n", wine_dbgstr_w(buffW));
11557 ok(len == 3, "got %d\n", len);
11558
11559 IMXNamespaceManager_Release(nsmgr);
11560
11561 free_bstrs();
11562}
11563
11565{
11566 IMXNamespaceManager *nsmgr;
11567 WCHAR buffW[250];
11569 HRESULT hr;
11570 INT len;
11571
11572 hr = CoCreateInstance(&CLSID_MXNamespaceManager40, NULL, CLSCTX_INPROC_SERVER,
11573 &IID_IMXNamespaceManager, (void**)&nsmgr);
11574 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11575
11576 len = ARRAY_SIZE(buffW);
11577 buffW[0] = 0;
11578 hr = IMXNamespaceManager_getDeclaredPrefix(nsmgr, 0, buffW, &len);
11579 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11580 ok(!lstrcmpW(buffW, L"xml"), "got prefix %s\n", wine_dbgstr_w(buffW));
11581
11582 len = ARRAY_SIZE(buffW);
11583 buffW[0] = 0;
11584 hr = IMXNamespaceManager_getDeclaredPrefix(nsmgr, 1, buffW, &len);
11585 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
11586
11587 hr = IMXNamespaceManager_getAllowOverride(nsmgr, NULL);
11588 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
11589
11590 b = VARIANT_FALSE;
11591 hr = IMXNamespaceManager_getAllowOverride(nsmgr, &b);
11592 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11593 ok(b == VARIANT_TRUE, "got %d\n", b);
11594
11595 hr = IMXNamespaceManager_putAllowOverride(nsmgr, VARIANT_FALSE);
11596 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11597
11598 hr = IMXNamespaceManager_declarePrefix(nsmgr, NULL, _bstr_("ns0 uri"));
11599 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11600
11601 len = ARRAY_SIZE(buffW);
11602 buffW[0] = 0;
11603 hr = IMXNamespaceManager_getURI(nsmgr, _bstr_(""), NULL, buffW, &len);
11604 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11605 ok(!lstrcmpW(buffW, L"ns0 uri"), "got uri %s\n", wine_dbgstr_w(buffW));
11606
11607 hr = IMXNamespaceManager_declarePrefix(nsmgr, _bstr_("ns0"), _bstr_("ns0 uri"));
11608 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11609
11610 len = ARRAY_SIZE(buffW);
11611 buffW[0] = 0;
11612 hr = IMXNamespaceManager_getDeclaredPrefix(nsmgr, 0, buffW, &len);
11613 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11614 ok(!lstrcmpW(buffW, L"xml"), "got prefix %s\n", wine_dbgstr_w(buffW));
11615
11616 len = ARRAY_SIZE(buffW);
11617 buffW[0] = 0;
11618 hr = IMXNamespaceManager_getDeclaredPrefix(nsmgr, 1, buffW, &len);
11619 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11620 ok(!lstrcmpW(buffW, L"ns0"), "got prefix %s\n", wine_dbgstr_w(buffW));
11621
11622 len = ARRAY_SIZE(buffW);
11623 buffW[0] = 0;
11624 hr = IMXNamespaceManager_getDeclaredPrefix(nsmgr, 2, buffW, &len);
11625 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11626 ok(!lstrcmpW(buffW, L""), "got prefix %s\n", wine_dbgstr_w(buffW));
11627
11628 /* new prefix placed at index 1 always */
11629 hr = IMXNamespaceManager_declarePrefix(nsmgr, _bstr_("ns1"), _bstr_("ns1 uri"));
11630 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11631
11632 len = ARRAY_SIZE(buffW);
11633 buffW[0] = 0;
11634 hr = IMXNamespaceManager_getDeclaredPrefix(nsmgr, 1, buffW, &len);
11635 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11636 ok(!lstrcmpW(buffW, L"ns1"), "got prefix %s\n", wine_dbgstr_w(buffW));
11637
11638 hr = IMXNamespaceManager_declarePrefix(nsmgr, _bstr_(""), NULL);
11639 todo_wine ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
11640
11641 hr = IMXNamespaceManager_declarePrefix(nsmgr, NULL, NULL);
11642 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
11643
11644 hr = IMXNamespaceManager_declarePrefix(nsmgr, NULL, _bstr_("ns0 uri"));
11645 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
11646
11647 hr = IMXNamespaceManager_putAllowOverride(nsmgr, VARIANT_TRUE);
11648 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11649
11650 hr = IMXNamespaceManager_declarePrefix(nsmgr, NULL, _bstr_("ns0 uri override"));
11651 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
11652
11653 len = ARRAY_SIZE(buffW);
11654 buffW[0] = 0;
11655 hr = IMXNamespaceManager_getURI(nsmgr, _bstr_(""), NULL, buffW, &len);
11656 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11657 ok(!lstrcmpW(buffW, L"ns0 uri override"), "got uri %s\n", wine_dbgstr_w(buffW));
11658
11659 len = ARRAY_SIZE(buffW);
11660 buffW[0] = 0;
11661 hr = IMXNamespaceManager_getDeclaredPrefix(nsmgr, 3, buffW, &len);
11662 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11663 ok(!lstrcmpW(buffW, L""), "got prefix %s\n", wine_dbgstr_w(buffW));
11664
11665 IMXNamespaceManager_Release(nsmgr);
11666
11667 free_bstrs();
11668}
11669
11671{
11674 NODE_TEXT,
11681};
11682
11683static void test_dispex(void)
11684{
11687 IXMLDOMNodeList *node_list;
11690 IXSLProcessor *processor;
11691 IXSLTemplate *template;
11692 IXMLDOMDocument *doc;
11693 IXMLHTTPRequest *req;
11695 IDispatchEx *dispex;
11696 DISPPARAMS dispparams;
11698 VARIANT arg, ret;
11700 IUnknown *unk;
11701 HRESULT hr;
11702 DISPID did;
11703
11704 doc = create_document(&IID_IXMLDOMDocument);
11705
11706 hr = IXMLDOMDocument_QueryInterface(doc, &IID_IUnknown, (void**)&unk);
11707 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11708 test_domobj_dispex(unk);
11709 IUnknown_Release(unk);
11710
11711 for(; *type != NODE_INVALID; type++)
11712 {
11714 VARIANT v;
11715
11716 V_VT(&v) = VT_I2;
11717 V_I2(&v) = *type;
11718
11719 hr = IXMLDOMDocument_createNode(doc, v, _bstr_("name"), NULL, &node);
11720 ok(hr == S_OK, "failed to create node type %d\n", *type);
11721
11722 IXMLDOMNode_QueryInterface(node, &IID_IUnknown, (void**)&unk);
11723
11724 test_domobj_dispex(unk);
11725 IUnknown_Release(unk);
11726 IXMLDOMNode_Release(node);
11727 }
11728
11729 /* IXMLDOMNodeList */
11730 hr = IXMLDOMDocument_getElementsByTagName(doc, _bstr_("*"), &node_list);
11731 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11732 hr = IXMLDOMNodeList_QueryInterface(node_list, &IID_IUnknown, (void**)&unk);
11733 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11734 test_domobj_dispex(unk);
11735 IUnknown_Release(unk);
11736 IXMLDOMNodeList_Release(node_list);
11737
11738 /* IXMLDOMNodeList for children list */
11739 hr = IXMLDOMDocument_get_childNodes(doc, &node_list);
11740 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11741 hr = IXMLDOMNodeList_QueryInterface(node_list, &IID_IUnknown, (void**)&unk);
11742 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11743 test_domobj_dispex(unk);
11744 IUnknown_Release(unk);
11745
11746 /* collection dispex test, empty collection */
11747 hr = IXMLDOMNodeList_QueryInterface(node_list, &IID_IDispatchEx, (void**)&dispex);
11748 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11749 did = 0;
11750 hr = IDispatchEx_GetDispID(dispex, _bstr_("0"), 0, &did);
11751 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11752 ok(did == DISPID_DOM_COLLECTION_BASE, "Unexpected value %ld.\n", did);
11753 hr = IDispatchEx_GetDispID(dispex, _bstr_("1"), 0, &did);
11754 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11755 ok(did == DISPID_DOM_COLLECTION_BASE+1, "Unexpected value %ld.\n", did);
11756 IDispatchEx_Release(dispex);
11757
11758 did = -1;
11759 hr = IDispatchEx_GetDispID(dispex, _bstr_("item"), 0, &did);
11760 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11761 ok(did == DISPID_VALUE, "got %ld\n", did);
11762
11763 V_VT(&arg) = VT_I4;
11764 V_I4(&arg) = 0;
11765 dispparams.cArgs = 0;
11766 dispparams.cNamedArgs = 0;
11767 dispparams.rgdispidNamedArgs = NULL;
11768 dispparams.rgvarg = &arg;
11769
11770 V_VT(&ret) = VT_EMPTY;
11771 V_DISPATCH(&ret) = (void*)0x1;
11772 hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_METHOD, &dispparams, &ret, NULL, NULL);
11773 ok(hr == DISP_E_BADPARAMCOUNT, "Unexpected hr %#lx.\n", hr);
11774 ok(V_VT(&ret) == VT_EMPTY, "got %d\n", V_VT(&ret));
11775 todo_wine
11776 ok(broken(V_DISPATCH(&ret) == (void*)0x1) || (V_DISPATCH(&ret) == NULL), "got %p\n", V_DISPATCH(&ret));
11777
11778 V_VT(&arg) = VT_I4;
11779 V_I4(&arg) = 0;
11780 dispparams.cArgs = 2;
11781 dispparams.cNamedArgs = 0;
11782 dispparams.rgdispidNamedArgs = NULL;
11783 dispparams.rgvarg = &arg;
11784
11785 V_VT(&ret) = VT_EMPTY;
11786 V_DISPATCH(&ret) = (void*)0x1;
11787 hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_METHOD, &dispparams, &ret, NULL, NULL);
11788 ok(hr == DISP_E_BADPARAMCOUNT, "Unexpected hr %#lx.\n", hr);
11789 ok(V_VT(&ret) == VT_EMPTY, "got %d\n", V_VT(&ret));
11790 todo_wine
11791 ok(broken(V_DISPATCH(&ret) == (void*)0x1) || (V_DISPATCH(&ret) == NULL), "got %p\n", V_DISPATCH(&ret));
11792
11793 V_VT(&arg) = VT_I4;
11794 V_I4(&arg) = 0;
11795 dispparams.cArgs = 1;
11796 dispparams.cNamedArgs = 0;
11797 dispparams.rgdispidNamedArgs = NULL;
11798 dispparams.rgvarg = &arg;
11799
11800 V_VT(&ret) = VT_EMPTY;
11801 V_DISPATCH(&ret) = (void*)0x1;
11802 hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_METHOD, &dispparams, &ret, NULL, NULL);
11803 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11804 ok(V_VT(&ret) == VT_DISPATCH, "got %d\n", V_VT(&ret));
11805 ok(V_DISPATCH(&ret) == NULL, "got %p\n", V_DISPATCH(&ret));
11806
11807 V_VT(&ret) = VT_EMPTY;
11808 V_DISPATCH(&ret) = (void*)0x1;
11809 hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dispparams, &ret, NULL, NULL);
11810 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11811 ok(V_VT(&ret) == VT_DISPATCH, "got %d\n", V_VT(&ret));
11812 ok(V_DISPATCH(&ret) == NULL, "got %p\n", V_DISPATCH(&ret));
11813
11814 V_VT(&ret) = VT_EMPTY;
11815 V_DISPATCH(&ret) = (void*)0x1;
11816 hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dispparams, &ret, NULL, NULL);
11817 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11818 ok(V_VT(&ret) == VT_DISPATCH, "got %d\n", V_VT(&ret));
11819 ok(V_DISPATCH(&ret) == NULL, "got %p\n", V_DISPATCH(&ret));
11820
11821 dispparams.cArgs = 0;
11822 dispparams.cNamedArgs = 0;
11823 dispparams.rgdispidNamedArgs = NULL;
11824 dispparams.rgvarg = NULL;
11825
11826 V_VT(&ret) = VT_EMPTY;
11827 V_I4(&ret) = 1;
11828 hr = IDispatchEx_Invoke(dispex, DISPID_DOM_NODELIST_LENGTH, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dispparams, &ret, NULL, NULL);
11829 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11830 ok(V_VT(&ret) == VT_I4, "got %d\n", V_VT(&ret));
11831 ok(V_I4(&ret) == 0, "got %ld\n", V_I4(&ret));
11832
11833 dispparams.cArgs = 0;
11834 dispparams.cNamedArgs = 0;
11835 dispparams.rgdispidNamedArgs = NULL;
11836 dispparams.rgvarg = NULL;
11837
11838 V_VT(&ret) = VT_EMPTY;
11839 V_I4(&ret) = 1;
11840 hr = IDispatchEx_Invoke(dispex, DISPID_DOM_NODELIST_LENGTH, &IID_NULL, 0, DISPATCH_METHOD, &dispparams, &ret, NULL, NULL);
11841 ok(hr == DISP_E_MEMBERNOTFOUND, "Unexpected hr %#lx.\n", hr);
11842 ok(V_VT(&ret) == VT_EMPTY, "got %d\n", V_VT(&ret));
11843 todo_wine
11844 ok(broken(V_I4(&ret) == 1) || (V_I4(&ret) == 0), "got %ld\n", V_I4(&ret));
11845
11846 IXMLDOMNodeList_Release(node_list);
11847
11848 /* IXMLDOMParseError */
11849 hr = IXMLDOMDocument_get_parseError(doc, &error);
11850 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11851 IXMLDOMParseError_QueryInterface(error, &IID_IUnknown, (void**)&unk);
11852 test_domobj_dispex(unk);
11853
11854 hr = IXMLDOMParseError_QueryInterface(error, &IID_IDispatchEx, (void**)&dispex);
11855 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11856
11857 V_VT(&arg) = VT_I4;
11858 V_I4(&arg) = 0;
11859 dispparams.cArgs = 1;
11860 dispparams.cNamedArgs = 0;
11861 dispparams.rgdispidNamedArgs = NULL;
11862 dispparams.rgvarg = &arg;
11863
11864 V_VT(&ret) = VT_EMPTY;
11865 V_DISPATCH(&ret) = (void*)0x1;
11866 hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_METHOD, &dispparams, &ret, NULL, NULL);
11867 ok(hr == DISP_E_MEMBERNOTFOUND, "Unexpected hr %#lx.\n", hr);
11868 ok(V_VT(&ret) == VT_EMPTY, "got %d\n", V_VT(&ret));
11869 todo_wine
11870 ok(broken(V_DISPATCH(&ret) == (void*)0x1) || (V_DISPATCH(&ret) == NULL), "got %p\n", V_DISPATCH(&ret));
11871
11872 IDispatchEx_Release(dispex);
11873
11874 IUnknown_Release(unk);
11875 IXMLDOMParseError_Release(error);
11876
11877 /* IXMLDOMNamedNodeMap */
11878 hr = IXMLDOMDocument_loadXML(doc, _bstr_(xpath_simple_list), &b);
11879 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11880
11881 hr = IXMLDOMDocument_selectNodes(doc, _bstr_("root/a"), &node_list);
11882 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11883 hr = IXMLDOMNodeList_get_item(node_list, 0, &node);
11884 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11885 IXMLDOMNodeList_Release(node_list);
11886
11887 hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMElement, (void**)&elem);
11888 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11889 IXMLDOMNode_Release(node);
11890 hr = IXMLDOMElement_get_attributes(elem, &map);
11891 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11892 IXMLDOMNamedNodeMap_QueryInterface(map, &IID_IUnknown, (void**)&unk);
11893 test_domobj_dispex(unk);
11894 IUnknown_Release(unk);
11895 /* collection dispex test */
11896 hr = IXMLDOMNamedNodeMap_QueryInterface(map, &IID_IDispatchEx, (void**)&dispex);
11897 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11898 did = 0;
11899 hr = IDispatchEx_GetDispID(dispex, _bstr_("0"), 0, &did);
11900 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11901 ok(did == DISPID_DOM_COLLECTION_BASE, "Unexpected value %ld.\n", did);
11902 IDispatchEx_Release(dispex);
11903 IXMLDOMNamedNodeMap_Release(map);
11904
11905 hr = IXMLDOMDocument_selectNodes(doc, _bstr_("root/b"), &node_list);
11906 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11907 hr = IXMLDOMNodeList_get_item(node_list, 0, &node);
11908 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11909 IXMLDOMNodeList_Release(node_list);
11910 hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMElement, (void**)&elem);
11911 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11912 IXMLDOMNode_Release(node);
11913 hr = IXMLDOMElement_get_attributes(elem, &map);
11914 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11915 /* collection dispex test, empty collection */
11916 hr = IXMLDOMNamedNodeMap_QueryInterface(map, &IID_IDispatchEx, (void**)&dispex);
11917 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11918 did = 0;
11919 hr = IDispatchEx_GetDispID(dispex, _bstr_("0"), 0, &did);
11920 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11921 ok(did == DISPID_DOM_COLLECTION_BASE, "Unexpected value %ld\n", did);
11922 hr = IDispatchEx_GetDispID(dispex, _bstr_("1"), 0, &did);
11923 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11924 ok(did == DISPID_DOM_COLLECTION_BASE+1, "Unexpected value %ld.\n", did);
11925 IXMLDOMNamedNodeMap_Release(map);
11926
11927 did = -1;
11928 hr = IDispatchEx_GetDispID(dispex, _bstr_("item"), 0, &did);
11929 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11930 ok(did == DISPID_VALUE, "got %ld\n", did);
11931
11932 V_VT(&arg) = VT_I4;
11933 V_I4(&arg) = 0;
11934 dispparams.cArgs = 0;
11935 dispparams.cNamedArgs = 0;
11936 dispparams.rgdispidNamedArgs = NULL;
11937 dispparams.rgvarg = &arg;
11938
11939 V_VT(&ret) = VT_EMPTY;
11940 V_DISPATCH(&ret) = (void*)0x1;
11941 hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_METHOD, &dispparams, &ret, NULL, NULL);
11942todo_wine {
11943 ok(hr == DISP_E_BADPARAMCOUNT, "Unexpected hr %#lx.\n", hr);
11944 ok(V_VT(&ret) == VT_EMPTY, "got %d\n", V_VT(&ret));
11945}
11946 ok(broken(V_DISPATCH(&ret) == (void*)0x1) || (V_DISPATCH(&ret) == NULL), "got %p\n", V_DISPATCH(&ret));
11947
11948 V_VT(&arg) = VT_I4;
11949 V_I4(&arg) = 0;
11950 dispparams.cArgs = 2;
11951 dispparams.cNamedArgs = 0;
11952 dispparams.rgdispidNamedArgs = NULL;
11953 dispparams.rgvarg = &arg;
11954
11955 V_VT(&ret) = VT_EMPTY;
11956 V_DISPATCH(&ret) = (void*)0x1;
11957 hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_METHOD, &dispparams, &ret, NULL, NULL);
11958todo_wine {
11959 ok(hr == DISP_E_BADPARAMCOUNT, "Unexpected hr %#lx.\n", hr);
11960 ok(V_VT(&ret) == VT_EMPTY, "got %d\n", V_VT(&ret));
11961}
11962 ok(broken(V_DISPATCH(&ret) == (void*)0x1) || (V_DISPATCH(&ret) == NULL), "got %p\n", V_DISPATCH(&ret));
11963
11964 V_VT(&arg) = VT_I4;
11965 V_I4(&arg) = 0;
11966 dispparams.cArgs = 1;
11967 dispparams.cNamedArgs = 0;
11968 dispparams.rgdispidNamedArgs = NULL;
11969 dispparams.rgvarg = &arg;
11970
11971 V_VT(&ret) = VT_EMPTY;
11972 V_DISPATCH(&ret) = (void*)0x1;
11973 hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_METHOD, &dispparams, &ret, NULL, NULL);
11974 todo_wine
11975 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11976 ok(V_VT(&ret) == VT_DISPATCH, "got %d\n", V_VT(&ret));
11977 ok(V_DISPATCH(&ret) == NULL, "got %p\n", V_DISPATCH(&ret));
11978
11979 V_VT(&ret) = VT_EMPTY;
11980 V_DISPATCH(&ret) = (void*)0x1;
11981 hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dispparams, &ret, NULL, NULL);
11982 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11983 ok(V_VT(&ret) == VT_DISPATCH, "got %d\n", V_VT(&ret));
11984 ok(V_DISPATCH(&ret) == NULL, "got %p\n", V_DISPATCH(&ret));
11985
11986 V_VT(&ret) = VT_EMPTY;
11987 V_DISPATCH(&ret) = (void*)0x1;
11988 hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dispparams, &ret, NULL, NULL);
11989 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
11990 ok(V_VT(&ret) == VT_DISPATCH, "got %d\n", V_VT(&ret));
11991 ok(V_DISPATCH(&ret) == NULL, "got %p\n", V_DISPATCH(&ret));
11992
11993 dispparams.cArgs = 0;
11994 dispparams.cNamedArgs = 0;
11995 dispparams.rgdispidNamedArgs = NULL;
11996 dispparams.rgvarg = NULL;
11997
11998 V_VT(&ret) = VT_EMPTY;
11999 V_I4(&ret) = 1;
12000 hr = IDispatchEx_Invoke(dispex, DISPID_DOM_NODELIST_LENGTH, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dispparams, &ret, NULL, NULL);
12001 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12002 ok(V_VT(&ret) == VT_I4, "got %d\n", V_VT(&ret));
12003 ok(V_I4(&ret) == 0, "got %ld\n", V_I4(&ret));
12004
12005 dispparams.cArgs = 0;
12006 dispparams.cNamedArgs = 0;
12007 dispparams.rgdispidNamedArgs = NULL;
12008 dispparams.rgvarg = NULL;
12009
12010 V_VT(&ret) = VT_EMPTY;
12011 V_I4(&ret) = 1;
12012 hr = IDispatchEx_Invoke(dispex, DISPID_DOM_NODELIST_LENGTH, &IID_NULL, 0, DISPATCH_METHOD, &dispparams, &ret, NULL, NULL);
12013 ok(hr == DISP_E_MEMBERNOTFOUND, "Unexpected hr %#lx.\n", hr);
12014 todo_wine
12015 ok(V_VT(&ret) == VT_EMPTY, "got %d\n", V_VT(&ret));
12016 ok(broken(V_I4(&ret) == 1) || (V_I4(&ret) == 0), "got %ld\n", V_I4(&ret));
12017
12018 IDispatchEx_Release(dispex);
12019 IXMLDOMElement_Release(elem);
12020
12021 /* IXMLDOMImplementation */
12022 hr = IXMLDOMDocument_get_implementation(doc, &impl);
12023 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12024
12025 hr = IXMLDOMImplementation_QueryInterface(impl, &IID_IDispatchEx, (void**)&dispex);
12026 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12027 IDispatchEx_Release(dispex);
12028 IXMLDOMImplementation_Release(impl);
12029
12030 IXMLDOMDocument_Release(doc);
12031
12032 /* IXMLHTTPRequest */
12033 hr = CoCreateInstance(&CLSID_XMLHTTPRequest, NULL, CLSCTX_INPROC_SERVER,
12034 &IID_IXMLHttpRequest, (void**)&req);
12035 if (hr == S_OK)
12036 {
12037 hr = IXMLHTTPRequest_QueryInterface(req, &IID_IDispatchEx, (void**)&dispex);
12038 ok(hr == E_NOINTERFACE, "Unexpected hr %#lx.\n", hr);
12039 IXMLHTTPRequest_Release(req);
12040 }
12041
12042 /* IXSLTemplate */
12043 template = create_xsltemplate(&IID_IXSLTemplate);
12044 hr = IXSLTemplate_QueryInterface(template, &IID_IDispatchEx, (void**)&dispex);
12045 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12046 hr = IDispatchEx_QueryInterface(dispex, &IID_IUnknown, (void**)&unk);
12047 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12048 test_domobj_dispex(unk);
12049 IUnknown_Release(unk);
12050 IDispatchEx_Release(dispex);
12051
12052 /* IXSLProcessor */
12053 hr = CoCreateInstance(&CLSID_FreeThreadedDOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (void**)&doc);
12054 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12055 b = VARIANT_FALSE;
12056 hr = IXMLDOMDocument_loadXML(doc, _bstr_(szTransformSSXML), &b);
12057 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12058 ok(b == VARIANT_TRUE, "got %d\n", b);
12059
12060 hr = IXSLTemplate_putref_stylesheet(template, (IXMLDOMNode*)doc);
12061 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12062 IXMLDOMDocument_Release(doc);
12063
12064 hr = IXSLTemplate_createProcessor(template, &processor);
12065 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12066 hr = IXSLProcessor_QueryInterface(processor, &IID_IDispatchEx, (void**)&dispex);
12067 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12068 hr = IDispatchEx_QueryInterface(dispex, &IID_IUnknown, (void**)&unk);
12069 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12070 test_domobj_dispex(unk);
12071 IUnknown_Release(unk);
12072 IDispatchEx_Release(dispex);
12073
12074 IXSLProcessor_Release(processor);
12075 IXSLTemplate_Release(template);
12076
12077 if (is_clsid_supported(&CLSID_DOMDocument60, &IID_IXMLDOMDocument))
12078 {
12079 doc = create_document_version(60, &IID_IXMLDOMDocument);
12081 IXMLDOMDocument_Release(doc);
12082 }
12083
12084 free_bstrs();
12085}
12086
12087static void test_parseerror(void)
12088{
12091 IXMLDOMDocument *doc;
12092 HRESULT hr;
12093
12094 doc = create_document(&IID_IXMLDOMDocument);
12095
12096 hr = IXMLDOMDocument_get_parseError(doc, &error);
12097 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12098
12099 hr = IXMLDOMParseError_get_line(error, NULL);
12100 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
12101
12102 hr = IXMLDOMParseError_get_srcText(error, NULL);
12103 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
12104
12105 hr = IXMLDOMParseError_get_linepos(error, NULL);
12106 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
12107
12108 IXMLDOMParseError_Release(error);
12109 IXMLDOMDocument_Release(doc);
12110
12111 if (!is_clsid_supported(&CLSID_DOMDocument60, &IID_IXMLDOMDocument)) return;
12112 doc = create_document_version(60, &IID_IXMLDOMDocument);
12113
12114 hr = IXMLDOMDocument_get_parseError(doc, &error);
12115 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12116 hr = IXMLDOMParseError_QueryInterface(error, &IID_IXMLDOMParseError2, (void**)&error2);
12117 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12118 IXMLDOMParseError2_Release(error2);
12119 IXMLDOMParseError_Release(error);
12120 IXMLDOMDocument_Release(doc);
12121}
12122
12123static void test_getAttributeNode(void)
12124{
12126 IXMLDOMDocument *doc;
12129 HRESULT hr;
12130 BSTR str;
12131
12132 doc = create_document(&IID_IXMLDOMDocument);
12133
12134 hr = IXMLDOMDocument_loadXML(doc, _bstr_(szExampleXML), &v);
12135 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12136
12137 hr = IXMLDOMDocument_get_documentElement(doc, &elem);
12138 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12139
12141 hr = IXMLDOMElement_getAttributeNode(elem, str, NULL);
12142 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
12143
12144 attr = (IXMLDOMAttribute*)0xdeadbeef;
12145 hr = IXMLDOMElement_getAttributeNode(elem, str, &attr);
12146 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
12147 ok(attr == NULL, "got %p\n", attr);
12149
12150 str = SysAllocString(L"nonExistingAttribute");
12151 hr = IXMLDOMElement_getAttributeNode(elem, str, NULL);
12152 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
12153
12154 attr = (IXMLDOMAttribute*)0xdeadbeef;
12155 hr = IXMLDOMElement_getAttributeNode(elem, str, &attr);
12156 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
12157 ok(attr == NULL, "got %p\n", attr);
12159
12160 hr = IXMLDOMElement_getAttributeNode(elem, _bstr_("foo:b"), &attr);
12161 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12162 IXMLDOMAttribute_Release(attr);
12163
12164 hr = IXMLDOMElement_getAttributeNode(elem, _bstr_("b"), &attr);
12165 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
12166
12167 hr = IXMLDOMElement_getAttributeNode(elem, _bstr_("a"), &attr);
12168 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12169 IXMLDOMAttribute_Release(attr);
12170
12171 IXMLDOMElement_Release(elem);
12172 IXMLDOMDocument_Release(doc);
12173 free_bstrs();
12174}
12175
12176static void test_getAttribute(void)
12177{
12178 IXMLDOMDocument *doc;
12181 VARIANT var;
12182 HRESULT hr;
12183
12184 doc = create_document(&IID_IXMLDOMDocument);
12185
12186 hr = IXMLDOMDocument_loadXML(doc, _bstr_(szExampleXML), &v);
12187 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12188
12189 hr = IXMLDOMDocument_get_documentElement(doc, &elem);
12190 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12191
12192 VariantInit(&var);
12193 hr = IXMLDOMElement_getAttribute( elem, _bstr_("xmlns:foo"), &var );
12194 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12195 ok( V_VT(&var) == VT_BSTR, "vt = %x\n", V_VT(&var));
12196 ok(!lstrcmpW(V_BSTR(&var), L"urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29"), "wrong attr value: %s\n", wine_dbgstr_w(V_BSTR(&var)));
12197 VariantClear(&var);
12198
12199 hr = IXMLDOMElement_getAttribute( elem, _bstr_("a"), &var );
12200 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12201 ok( V_VT(&var) == VT_BSTR, "vt = %x\n", V_VT(&var));
12202 ok(!lstrcmpW(V_BSTR(&var), L"attr a"), "wrong attr value: %s\n", wine_dbgstr_w(V_BSTR(&var)));
12203 VariantClear(&var);
12204
12205 hr = IXMLDOMElement_getAttribute( elem, _bstr_("foo:b"), &var );
12206 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12207 ok( V_VT(&var) == VT_BSTR, "vt = %x\n", V_VT(&var));
12208 ok(!lstrcmpW(V_BSTR(&var), L"attr b"), "wrong attr value: %s\n", wine_dbgstr_w(V_BSTR(&var)));
12209 VariantClear(&var);
12210
12211 hr = IXMLDOMElement_getAttribute( elem, _bstr_("b"), &var );
12212 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
12213 ok( V_VT(&var) == VT_NULL, "vt = %x\n", V_VT(&var));
12214 VariantClear(&var);
12215
12216 hr = IXMLDOMElement_getAttribute( elem, _bstr_("non-existent"), &var );
12217 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
12218 ok( V_VT(&var) == VT_NULL, "vt = %x\n", V_VT(&var));
12219 VariantClear(&var);
12220
12221 IXMLDOMElement_Release(elem);
12222 IXMLDOMDocument_Release(doc);
12223 free_bstrs();
12224}
12225
12226typedef struct {
12228 const char *name;
12229 REFIID iids[3];
12231
12233 { NODE_ELEMENT, "element", { &IID_IXMLDOMNode, &IID_IXMLDOMElement } },
12234 { NODE_ATTRIBUTE, "attribute", { &IID_IXMLDOMNode, &IID_IXMLDOMAttribute } },
12235 { NODE_CDATA_SECTION, "cdata", { &IID_IXMLDOMNode, &IID_IXMLDOMCDATASection } },
12236 { NODE_ENTITY_REFERENCE, "entityref", { &IID_IXMLDOMNode, &IID_IXMLDOMEntityReference } },
12237 { NODE_PROCESSING_INSTRUCTION, "pi", { &IID_IXMLDOMNode, &IID_IXMLDOMProcessingInstruction } },
12238 { NODE_COMMENT, "comment", { &IID_IXMLDOMNode, &IID_IXMLDOMComment } },
12239 { NODE_DOCUMENT_FRAGMENT, "fragment", { &IID_IXMLDOMNode, &IID_IXMLDOMDocumentFragment } },
12240 { NODE_INVALID }
12241};
12242
12243static void test_supporterrorinfo(void)
12244{
12245 static REFIID iids[5] = { &IID_IXMLDOMNode, &IID_IXMLDOMDocument,
12246 &IID_IXMLDOMDocument2, &IID_IXMLDOMDocument3 };
12248 ISupportErrorInfo *errorinfo, *info2;
12249 IXMLDOMSchemaCollection *schemacache;
12250 IXMLDOMNamedNodeMap *map, *map2;
12251 IXMLDOMDocument *doc;
12254 IUnknown *unk;
12255 REFIID *iid;
12256 void *dummy;
12257 HRESULT hr;
12258
12259 if (!is_clsid_supported(&CLSID_DOMDocument60, &IID_IXMLDOMDocument3)) return;
12260 doc = create_document_version(60, &IID_IXMLDOMDocument3);
12261
12262 EXPECT_REF(doc, 1);
12263 hr = IXMLDOMDocument_QueryInterface(doc, &IID_ISupportErrorInfo, (void**)&errorinfo);
12264 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12265 EXPECT_REF(doc, 1);
12266 ISupportErrorInfo_AddRef(errorinfo);
12267 EXPECT_REF(errorinfo, 2);
12268 EXPECT_REF(doc, 1);
12269 ISupportErrorInfo_Release(errorinfo);
12270
12271 hr = IXMLDOMDocument_QueryInterface(doc, &IID_ISupportErrorInfo, (void**)&info2);
12272 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12273 ok(errorinfo != info2, "got %p, %p\n", info2, errorinfo);
12274
12275 /* error interface can't be queried back for DOM interface */
12276 hr = ISupportErrorInfo_QueryInterface(info2, &IID_IXMLDOMDocument, &dummy);
12277 ok(hr == E_NOINTERFACE, "Unexpected hr %#lx.\n", hr);
12278 hr = ISupportErrorInfo_QueryInterface(info2, &IID_IXMLDOMNode, &dummy);
12279 ok(hr == E_NOINTERFACE, "Unexpected hr %#lx.\n", hr);
12280
12281 ISupportErrorInfo_Release(info2);
12282
12283 iid = iids;
12284 while (*iid)
12285 {
12286 hr = IXMLDOMDocument_QueryInterface(doc, *iid, (void**)&unk);
12287 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12288 if (hr == S_OK)
12289 {
12290 hr = ISupportErrorInfo_InterfaceSupportsErrorInfo(errorinfo, *iid);
12291 ok(hr == S_OK, "Unexpected hr %#lx. for %s\n", hr, wine_dbgstr_guid(*iid));
12292 IUnknown_Release(unk);
12293 }
12294
12295 iid++;
12296 }
12297
12298 ISupportErrorInfo_Release(errorinfo);
12299
12300 while (ptr->type != NODE_INVALID)
12301 {
12303 VARIANT type;
12304
12305 V_VT(&type) = VT_I1;
12306 V_I1(&type) = ptr->type;
12307
12308 hr = IXMLDOMDocument_createNode(doc, type, _bstr_(ptr->name), NULL, &node);
12309 ok(hr == S_OK, "%d: Unexpected hr %#lx.\n", ptr->type, hr);
12310
12311 EXPECT_REF(node, 1);
12312 hr = IXMLDOMNode_QueryInterface(node, &IID_ISupportErrorInfo, (void**)&errorinfo);
12313 ok(hr == S_OK, "%d: Unexpected hr %#lx.\n", ptr->type, hr);
12314 EXPECT_REF(node, 1);
12315
12316 hr = ISupportErrorInfo_QueryInterface(errorinfo, &IID_IXMLDOMNode, &dummy);
12317 ok(hr == E_NOINTERFACE, "%d: Unexpected hr %#lx.\n", ptr->type, hr);
12318
12319 iid = ptr->iids;
12320
12321 while (*iid)
12322 {
12323 hr = IXMLDOMNode_QueryInterface(node, *iid, (void**)&unk);
12324 if (hr == S_OK)
12325 {
12326 hr = ISupportErrorInfo_InterfaceSupportsErrorInfo(errorinfo, *iid);
12327 ok(hr == S_OK, "%d: unexpected hr %#lx for %s\n", ptr->type, hr, wine_dbgstr_guid(*iid));
12328 IUnknown_Release(unk);
12329 }
12330
12331 iid++;
12332 }
12333
12334 ISupportErrorInfo_Release(errorinfo);
12335 IXMLDOMNode_Release(node);
12336 ptr++;
12337 }
12338
12339 /* IXMLDOMNamedNodeMap */
12340 b = VARIANT_FALSE;
12341 hr = IXMLDOMDocument_loadXML(doc, _bstr_(complete4A), &b);
12342 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12343 ok(b == VARIANT_TRUE, "got %d\n", b);
12344
12345 hr = IXMLDOMDocument_get_documentElement(doc, &elem);
12346 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12347
12348 hr = IXMLDOMElement_get_attributes(elem, &map);
12349 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12350
12351 EXPECT_REF(map, 1);
12352 hr = IXMLDOMNamedNodeMap_QueryInterface(map, &IID_ISupportErrorInfo, (void**)&errorinfo);
12353 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12354 EXPECT_REF(map, 2);
12355
12356 hr = ISupportErrorInfo_InterfaceSupportsErrorInfo(errorinfo, &IID_IXMLDOMNamedNodeMap);
12357 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12358
12359 hr = ISupportErrorInfo_QueryInterface(errorinfo, &IID_IXMLDOMNamedNodeMap, (void**)&map2);
12360 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12361 ok(map == map2, "got %p\n", map2);
12362 IXMLDOMNamedNodeMap_Release(map2);
12363
12364 EXPECT_REF(errorinfo, 2);
12365 hr = ISupportErrorInfo_QueryInterface(errorinfo, &IID_IUnknown, (void**)&unk);
12366 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12367 EXPECT_REF(errorinfo, 3);
12368 EXPECT_REF(map, 3);
12369 IUnknown_Release(unk);
12370
12371 ISupportErrorInfo_Release(errorinfo);
12372 IXMLDOMNamedNodeMap_Release(map);
12373 IXMLDOMElement_Release(elem);
12374
12375 IXMLDOMDocument_Release(doc);
12376
12377 /* IXMLDOMSchemaCollection */
12378 hr = CoCreateInstance(&CLSID_XMLSchemaCache, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMSchemaCollection, (void**)&schemacache);
12379 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12380
12381 hr = IXMLDOMSchemaCollection_QueryInterface(schemacache, &IID_ISupportErrorInfo, (void**)&errorinfo);
12382 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12383
12384 hr = ISupportErrorInfo_InterfaceSupportsErrorInfo(errorinfo, &IID_IXMLDOMSchemaCollection);
12385 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12386
12387 ISupportErrorInfo_Release(errorinfo);
12388 IXMLDOMSchemaCollection_Release(schemacache);
12389
12390 free_bstrs();
12391}
12392
12393typedef struct {
12395 const char *name;
12396 const char *put_content;
12400} node_value_t;
12401
12403 { NODE_ELEMENT, "element", "", E_FAIL, VT_NULL, S_FALSE },
12404 { NODE_ATTRIBUTE, "attr", "value", S_OK, VT_BSTR, S_OK },
12405 { NODE_TEXT, "text", "textdata", S_OK, VT_BSTR, S_OK },
12406 { NODE_CDATA_SECTION , "cdata", "cdata data", S_OK, VT_BSTR, S_OK },
12407 { NODE_ENTITY_REFERENCE, "entityref", "ref", E_FAIL, VT_NULL, S_FALSE },
12408 { NODE_PROCESSING_INSTRUCTION, "pi", "instr", S_OK, VT_BSTR, S_OK },
12409 { NODE_COMMENT, "comment", "comment data", S_OK, VT_BSTR, S_OK },
12410 { NODE_DOCUMENT_FRAGMENT, "docfrag", "", E_FAIL, VT_NULL, S_FALSE },
12411 { NODE_INVALID }
12412};
12413
12414static void test_nodeValue(void)
12415{
12417 IXMLDOMDocument *doc;
12418 HRESULT hr;
12419
12420 doc = create_document(&IID_IXMLDOMDocument);
12421
12422 while (ptr->type != NODE_INVALID)
12423 {
12425 VARIANT v;
12426
12427 V_VT(&v) = VT_I2;
12428 V_I2(&v) = ptr->type;
12429
12430 hr = IXMLDOMDocument_createNode(doc, v, _bstr_(ptr->name), NULL, &node);
12431 ok(hr == S_OK, "failed to create node type %d\n", ptr->type);
12432
12433 hr = IXMLDOMNode_get_nodeValue(node, NULL);
12434 ok(hr == E_INVALIDARG, "%d: unexpected hr %#lx\n", ptr->type, hr);
12435
12436 V_VT(&v) = VT_BSTR;
12437 V_BSTR(&v) = _bstr_(ptr->put_content);
12438 hr = IXMLDOMNode_put_nodeValue(node, v);
12439 ok(hr == ptr->put_hr, "%d: unexpected hr %#lx\n", ptr->type, hr);
12440
12441 V_VT(&v) = VT_EMPTY;
12442 hr = IXMLDOMNode_get_nodeValue(node, &v);
12443 ok(hr == ptr->get_hr, "%d: unexpected hr %#lx, expected %#lx.\n", ptr->type, hr, ptr->get_hr);
12444 ok(V_VT(&v) == ptr->get_vt, "%d: got %d, expected %d\n", ptr->type, V_VT(&v), ptr->get_vt);
12445 if (hr == S_OK)
12446 ok(!lstrcmpW(V_BSTR(&v), _bstr_(ptr->put_content)), "%d: got %s\n", ptr->type,
12448 VariantClear(&v);
12449
12450 IXMLDOMNode_Release(node);
12451
12452 ptr++;
12453 }
12454
12455 IXMLDOMDocument_Release(doc);
12456}
12457
12458static void test_xmlns_attribute(void)
12459{
12460 BSTR str;
12461 IXMLDOMDocument *doc;
12463 IXMLDOMAttribute *pAttribute;
12465 HRESULT hr;
12466 VARIANT v;
12467
12468 doc = create_document(&IID_IXMLDOMDocument);
12469
12470 hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing"), &root);
12471 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12472
12473 hr = IXMLDOMDocument_appendChild(doc, (IXMLDOMNode*)root, NULL);
12474 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12475
12476 hr = IXMLDOMDocument_createAttribute(doc, _bstr_("xmlns:dt"), &pAttribute);
12477 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
12478
12479 V_VT(&v) = VT_BSTR;
12480 V_BSTR(&v) = _bstr_("urn:schemas-microsoft-com:datatypes");
12481 hr = IXMLDOMAttribute_put_nodeValue(pAttribute, v);
12482 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
12483
12484 hr = IXMLDOMElement_setAttributeNode(root, pAttribute, NULL);
12485 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
12486
12487 hr = IXMLDOMNode_put_dataType((IXMLDOMNode*)root, _bstr_("bin.base64"));
12488 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
12489
12490 hr = IXMLDOMDocument_get_documentElement(doc, &elem);
12491 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12492
12493 str = NULL;
12494 hr = IXMLDOMElement_get_xml(elem, &str);
12495 ok( hr == S_OK, "Unexpected hr %#lx.\n", hr);
12496 todo_wine ok(lstrcmpW(str, L"<Testing xmlns:dt=\"urn:schemas-microsoft-com:datatypes\" dt:dt=\"bin.base64\"/>") == 0,
12497 "got %s\n", wine_dbgstr_w(str));
12499
12500 IXMLDOMElement_Release(elem);
12501 IXMLDOMAttribute_Release( pAttribute);
12502
12503 IXMLDOMDocument_Release(doc);
12504
12505 free_bstrs();
12506}
12507
12508static const char namespacesA[] =
12509"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"
12510" <ns1:elem1 xmlns:ns1=\"http://blah.org\" b='1' >"
12511" <ns2:elem2 xmlns:ns2=\"http://blah.org\"/>"
12512" <ns1:elem3/>"
12513" <ns1:elem4/>"
12514" <elem5 xmlns=\"http://blahblah.org\"/>"
12515" <ns1:elem6>true</ns1:elem6>"
12516" </ns1:elem1>";
12517
12518static const char xsd_schema1_uri[] = "x-schema:test1.xsd";
12519static const char xsd_schema1_xml[] =
12520"<?xml version='1.0'?>"
12521"<schema xmlns='http://www.w3.org/2001/XMLSchema'"
12522" targetNamespace='x-schema:test1.xsd'>"
12523" <element name='root'>"
12524" <complexType>"
12525" <sequence maxOccurs='unbounded'>"
12526" <any/>"
12527" </sequence>"
12528" </complexType>"
12529" </element>"
12530"</schema>";
12531
12532static void test_get_namespaces(void)
12533{
12534 IXMLDOMSchemaCollection *collection, *collection2;
12535 IXMLDOMDocument2 *doc, *doc2;
12536 IEnumVARIANT *enumv, *enum2;
12537 IUnknown *unk1, *unk2;
12540 ULONG fetched;
12541 VARIANT v[2];
12542 HRESULT hr;
12543 LONG len;
12544 BSTR s;
12545
12546 if (!is_clsid_supported(&CLSID_DOMDocument2, &IID_IXMLDOMDocument2)) return;
12547 doc = create_document(&IID_IXMLDOMDocument2);
12548
12549 /* null pointer */
12550 hr = IXMLDOMDocument2_get_namespaces(doc, NULL);
12551 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
12552
12553 /* no document loaded */
12554 collection = (void*)0xdeadbeef;
12555 hr = IXMLDOMDocument2_get_namespaces(doc, &collection);
12556 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12557 if (hr != S_OK)
12558 {
12559 IXMLDOMDocument2_Release(doc);
12560 return;
12561 }
12563
12564 collection2 = (void*)0xdeadbeef;
12565 hr = IXMLDOMDocument2_get_namespaces(doc, &collection2);
12566 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12567 ok(collection == collection2, "got %p\n", collection2);
12569 IXMLDOMSchemaCollection_Release(collection);
12570
12571 len = -1;
12572 hr = IXMLDOMSchemaCollection_get_length(collection, &len);
12573 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12574 ok(len == 0, "got %ld\n", len);
12575 IXMLDOMSchemaCollection_Release(collection);
12576
12577 /* now with document */
12578 hr = IXMLDOMDocument2_loadXML(doc, _bstr_(namespacesA), &b);
12579 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12580
12581 hr = IXMLDOMDocument2_get_namespaces(doc, &collection);
12582 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12583
12584 len = -1;
12585 hr = IXMLDOMSchemaCollection_get_length(collection, &len);
12586 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12587 ok(len == 2, "got %ld\n", len);
12588
12589 /* try to lookup some uris */
12590 node = (void*)0xdeadbeef;
12591 hr = IXMLDOMSchemaCollection_get(collection, _bstr_("http://blah.org"), &node);
12592 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12593 ok(node == NULL, "got %p\n", node);
12594
12595 node = (void*)0xdeadbeef;
12596 hr = IXMLDOMSchemaCollection_get(collection, _bstr_("http://blah1.org"), &node);
12597 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12598 ok(node == NULL, "got %p\n", node);
12599
12600 /* load schema and try to add it */
12601 doc2 = create_document(&IID_IXMLDOMDocument2);
12602 hr = IXMLDOMDocument2_loadXML(doc2, _bstr_(xsd_schema1_xml), &b);
12603 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12604
12605 V_VT(&v[0]) = VT_DISPATCH;
12606 V_DISPATCH(&v[0]) = (IDispatch*)doc2;
12607 hr = IXMLDOMSchemaCollection_add(collection, _bstr_(xsd_schema1_uri), v[0]);
12608 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
12609
12610 hr = IXMLDOMSchemaCollection_get_namespaceURI(collection, 0, &s);
12611 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12612 ok(!lstrcmpW(s, L"http://blah.org"), "got %s\n", wine_dbgstr_w(s));
12614
12615 hr = IXMLDOMSchemaCollection_get_namespaceURI(collection, 1, &s);
12616 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12617 ok(!lstrcmpW(s, L"http://blahblah.org"), "got %s\n", wine_dbgstr_w(s));
12619
12620 s = (void*)0xdeadbeef;
12621 hr = IXMLDOMSchemaCollection_get_namespaceURI(collection, 2, &s);
12622 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
12623 ok(s == (void*)0xdeadbeef, "got %p\n", s);
12624
12625 /* enumerate */
12626 enumv = (void*)0xdeadbeef;
12628 hr = IXMLDOMSchemaCollection_get__newEnum(collection, (IUnknown**)&enumv);
12629 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12631 ok(enumv != NULL, "got %p\n", enumv);
12632
12633 hr = IXMLDOMSchemaCollection_QueryInterface(collection, &IID_IUnknown, (void**)&unk1);
12634 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12635 hr = IEnumVARIANT_QueryInterface(enumv, &IID_IUnknown, (void**)&unk2);
12636 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12637 ok(unk1 != unk2, "got %p, %p\n", unk1, unk2);
12638 IUnknown_Release(unk1);
12639 IUnknown_Release(unk2);
12640
12641 hr = IXMLDOMSchemaCollection_QueryInterface(collection, &IID_IEnumVARIANT, (void**)&enum2);
12642 ok(hr == E_NOINTERFACE, "Unexpected hr %#lx.\n", hr);
12643
12644 V_VT(&v[0]) = VT_EMPTY;
12645 hr = IEnumVARIANT_Next(enumv, 1, &v[0], NULL);
12646 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12647 ok(V_VT(&v[0]) == VT_BSTR, "got %d\n", V_VT(&v[0]));
12648 ok(!lstrcmpW(V_BSTR(&v[0]), L"http://blah.org"), "got %s\n", wine_dbgstr_w(V_BSTR(&v[0])));
12649 VariantClear(&v[0]);
12650
12651 V_VT(&v[0]) = VT_EMPTY;
12652 hr = IEnumVARIANT_Next(enumv, 1, &v[0], &fetched);
12653 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12654 ok(fetched == 1, "got %ld, expected 1\n", fetched);
12655 ok(V_VT(&v[0]) == VT_BSTR, "got %d\n", V_VT(&v[0]));
12656 ok(!lstrcmpW(V_BSTR(&v[0]), L"http://blahblah.org"), "got %s\n", wine_dbgstr_w(V_BSTR(&v[0])));
12657 VariantClear(&v[0]);
12658
12659 V_VT(&v[0]) = VT_NULL;
12660 hr = IEnumVARIANT_Next(enumv, 1, &v[0], &fetched);
12661 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
12662 ok(fetched == 0, "got %ld, expected 0\n", fetched);
12663 ok(V_VT(&v[0]) == VT_EMPTY, "got %d\n", V_VT(&v[0]));
12664
12665 hr = IEnumVARIANT_Reset(enumv);
12666 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12667
12668 V_VT(&v[1]) = VT_EMPTY;
12669 V_VT(&v[0]) = VT_EMPTY;
12670 hr = IEnumVARIANT_Next(enumv, 2, v, &fetched);
12671 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12672 ok(fetched == 2, "got %ld, expected 2\n", fetched);
12673 ok(V_VT(&v[0]) == VT_BSTR, "got %d\n", V_VT(&v[0]));
12674 ok(V_VT(&v[1]) == VT_BSTR, "got %d\n", V_VT(&v[1]));
12675 ok(!lstrcmpW(V_BSTR(&v[0]), L"http://blah.org"), "got %s\n", wine_dbgstr_w(V_BSTR(&v[0])));
12676 ok(!lstrcmpW(V_BSTR(&v[1]), L"http://blahblah.org"), "got %s\n", wine_dbgstr_w(V_BSTR(&v[1])));
12677 VariantClear(&v[1]);
12678 VariantClear(&v[0]);
12679
12680 V_VT(&v[0]) = VT_NULL;
12681 hr = IEnumVARIANT_Next(enumv, 1, v, &fetched);
12682 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
12683 ok(fetched == 0, "got %ld, expected 0\n", fetched);
12684 ok(V_VT(&v[0]) == VT_EMPTY, "got %d\n", V_VT(&v[0]));
12685
12686 IEnumVARIANT_Release(enumv);
12687 IXMLDOMSchemaCollection_Release(collection);
12688 IXMLDOMDocument2_Release(doc);
12689
12690 /* now with CLSID_DOMDocument60 */
12691 if (!is_clsid_supported(&CLSID_DOMDocument60, &IID_IXMLDOMDocument2)) return;
12692 doc = create_document_version(60, &IID_IXMLDOMDocument2);
12693
12694 /* null pointer */
12695 hr = IXMLDOMDocument2_get_namespaces(doc, NULL);
12696 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
12697
12698 /* no document loaded */
12699 collection = (void*)0xdeadbeef;
12700 hr = IXMLDOMDocument2_get_namespaces(doc, &collection);
12701 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12702 if (hr != S_OK)
12703 {
12704 IXMLDOMDocument2_Release(doc);
12705 return;
12706 }
12708
12709 collection2 = (void*)0xdeadbeef;
12710 hr = IXMLDOMDocument2_get_namespaces(doc, &collection2);
12711 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12712 ok(collection == collection2, "got %p\n", collection2);
12714 IXMLDOMSchemaCollection_Release(collection);
12715
12716 len = -1;
12717 hr = IXMLDOMSchemaCollection_get_length(collection, &len);
12718 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12719 ok(len == 0, "got %ld\n", len);
12720 IXMLDOMSchemaCollection_Release(collection);
12721
12722 /* now with document */
12723 hr = IXMLDOMDocument2_loadXML(doc, _bstr_(namespacesA), &b);
12724 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12725
12726 hr = IXMLDOMDocument2_get_namespaces(doc, &collection);
12727 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12728
12729 len = -1;
12730 hr = IXMLDOMSchemaCollection_get_length(collection, &len);
12731 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12732 ok(len == 2, "got %ld\n", len);
12733
12734 /* try to lookup some uris */
12735 node = (void*)0xdeadbeef;
12736 hr = IXMLDOMSchemaCollection_get(collection, _bstr_("http://blah.org"), &node);
12737 ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr);
12738 ok(broken(node == (void*)0xdeadbeef) || (node == NULL), "got %p\n", node);
12739
12740 /* load schema and try to add it */
12741 doc2 = create_document(&IID_IXMLDOMDocument2);
12742 hr = IXMLDOMDocument2_loadXML(doc2, _bstr_(xsd_schema1_xml), &b);
12743 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12744
12745 V_VT(&v[0]) = VT_DISPATCH;
12746 V_DISPATCH(&v[0]) = (IDispatch*)doc2;
12747 hr = IXMLDOMSchemaCollection_add(collection, _bstr_(xsd_schema1_uri), v[0]);
12748 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
12749 IXMLDOMDocument2_Release(doc2);
12750
12751 hr = IXMLDOMSchemaCollection_get_namespaceURI(collection, 0, &s);
12752 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12753 ok(!lstrcmpW(s, L"http://blah.org"), "got %s\n", wine_dbgstr_w(s));
12755
12756 hr = IXMLDOMSchemaCollection_get_namespaceURI(collection, 1, &s);
12757 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12758 ok(!lstrcmpW(s, L"http://blahblah.org"), "got %s\n", wine_dbgstr_w(s));
12760
12761 s = (void*)0xdeadbeef;
12762 hr = IXMLDOMSchemaCollection_get_namespaceURI(collection, 2, &s);
12763 ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
12764 ok(broken(s == (void*)0xdeadbeef) || (s == NULL), "got %p\n", s);
12765
12766 /* enumerate */
12767 enumv = (void*)0xdeadbeef;
12768 hr = IXMLDOMSchemaCollection_get__newEnum(collection, (IUnknown**)&enumv);
12769 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12770 ok(enumv != NULL, "got %p\n", enumv);
12771
12772 V_VT(&v[0]) = VT_EMPTY;
12773 hr = IEnumVARIANT_Next(enumv, 1, &v[0], NULL);
12774 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12775 ok(V_VT(&v[0]) == VT_BSTR, "got %d\n", V_VT(&v[0]));
12776 ok(!lstrcmpW(V_BSTR(&v[0]), L"http://blah.org"), "got %s\n", wine_dbgstr_w(V_BSTR(&v[0])));
12777 VariantClear(&v[0]);
12778
12779 V_VT(&v[0]) = VT_EMPTY;
12780 hr = IEnumVARIANT_Next(enumv, 1, &v[0], NULL);
12781 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12782 ok(V_VT(&v[0]) == VT_BSTR, "got %d\n", V_VT(&v[0]));
12783 ok(!lstrcmpW(V_BSTR(&v[0]), L"http://blahblah.org"), "got %s\n", wine_dbgstr_w(V_BSTR(&v[0])));
12784 VariantClear(&v[0]);
12785
12786 V_VT(&v[0]) = VT_NULL;
12787 hr = IEnumVARIANT_Next(enumv, 1, &v[0], NULL);
12788 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
12789 ok(V_VT(&v[0]) == VT_EMPTY, "got %d\n", V_VT(&v[0]));
12790
12791 hr = IEnumVARIANT_Reset(enumv);
12792 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12793
12794 V_VT(&v[1]) = VT_EMPTY;
12795 V_VT(&v[0]) = VT_EMPTY;
12796 hr = IEnumVARIANT_Next(enumv, 2, v, &fetched);
12797 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12798 ok(fetched == 2, "got %ld, expected 2\n", fetched);
12799 ok(V_VT(&v[0]) == VT_BSTR, "got %d\n", V_VT(&v[0]));
12800 ok(V_VT(&v[1]) == VT_BSTR, "got %d\n", V_VT(&v[1]));
12801 ok(!lstrcmpW(V_BSTR(&v[0]), L"http://blah.org"), "got %s\n", wine_dbgstr_w(V_BSTR(&v[0])));
12802 ok(!lstrcmpW(V_BSTR(&v[1]), L"http://blahblah.org"), "got %s\n", wine_dbgstr_w(V_BSTR(&v[0])));
12803 VariantClear(&v[1]);
12804 VariantClear(&v[0]);
12805
12806 V_VT(&v[0]) = VT_NULL;
12807 hr = IEnumVARIANT_Next(enumv, 1, v, &fetched);
12808 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
12809 ok(fetched == 0, "got %ld, expected 0\n", fetched);
12810 ok(V_VT(&v[0]) == VT_EMPTY, "got %d\n", V_VT(&v[0]));
12811
12812 IEnumVARIANT_Release(enumv);
12813 IXMLDOMSchemaCollection_Release(collection);
12814 IXMLDOMDocument2_Release(doc);
12815 free_bstrs();
12816}
12817
12818static const DOMNodeType put_data_types[] = {
12819 NODE_TEXT,
12824};
12825
12826static void test_put_data(void)
12827{
12828 WCHAR buff[100], *data;
12829 IXMLDOMDocument *doc;
12830 const DOMNodeType *type;
12833 VARIANT v;
12834 BSTR get_data;
12835 HRESULT hr;
12836
12837 doc = create_document(&IID_IXMLDOMDocument);
12838
12839 memcpy(&buff[2], L"test node data", 15 * sizeof(WCHAR));
12840 /* just a big length */
12841 *(DWORD*)buff = 0xf0f0;
12842 data = &buff[2];
12843
12845 while (*type != NODE_INVALID)
12846 {
12847 V_VT(&v) = VT_I2;
12848 V_I2(&v) = *type;
12849
12850 hr = IXMLDOMDocument_createNode(doc, v, _bstr_("name"), NULL, &node);
12851 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12852
12853 /* put_data() is interface-specific */
12854 switch (*type)
12855 {
12856 case NODE_TEXT:
12857 {
12858 hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMText, (void**)&text);
12859 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12860 hr = IXMLDOMText_put_data(text, data);
12861 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12862
12863 hr = IXMLDOMText_get_data(text, &get_data);
12864 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12865
12866 IXMLDOMText_Release(text);
12867 break;
12868 }
12869 case NODE_CDATA_SECTION:
12870 {
12871 IXMLDOMCDATASection *cdata;
12872
12873 hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMCDATASection, (void**)&cdata);
12874 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12875 hr = IXMLDOMCDATASection_put_data(cdata, data);
12876 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12877
12878 hr = IXMLDOMCDATASection_get_data(cdata, &get_data);
12879 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12880
12881 IXMLDOMCDATASection_Release(cdata);
12882 break;
12883 }
12885 {
12887
12888 hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMProcessingInstruction, (void**)&pi);
12889 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12890 hr = IXMLDOMProcessingInstruction_put_data(pi, data);
12891 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12892
12893 hr = IXMLDOMProcessingInstruction_get_data(pi, &get_data);
12894 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12895
12896 IXMLDOMProcessingInstruction_Release(pi);
12897 break;
12898 }
12899 case NODE_COMMENT:
12900 {
12902
12903 hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMComment, (void**)&comment);
12904 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12905 hr = IXMLDOMComment_put_data(comment, data);
12906 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12907
12908 hr = IXMLDOMComment_get_data(comment, &get_data);
12909 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12910
12911 IXMLDOMComment_Release(comment);
12912 break;
12913 }
12914 default:
12915 get_data = NULL;
12916 break;
12917 }
12918
12919 /* compare */
12920 ok(!lstrcmpW(data, get_data), "%d: got wrong data %s, expected %s\n", *type, wine_dbgstr_w(get_data),
12922 SysFreeString(get_data);
12923
12924 IXMLDOMNode_Release(node);
12925 type++;
12926 }
12927
12928 IXMLDOMDocument_Release(doc);
12929 free_bstrs();
12930}
12931
12933{
12935 IXMLDOMDocument *doc;
12938 VARIANT v;
12940 BSTR s;
12941 HRESULT hr;
12942 LONG length;
12943
12944 V_VT(&v) = VT_I2;
12945 V_I2(&v) = NODE_TEXT;
12946
12947 while (table->clsid)
12948 {
12949 if (!is_clsid_supported(table->clsid, &IID_IXMLDOMDocument))
12950 {
12951 table++;
12952 continue;
12953 }
12954
12955 hr = CoCreateInstance(table->clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (void**)&doc);
12956 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12957
12958 hr = IXMLDOMDocument_createNode(doc, v, _bstr_("name"), NULL, &node);
12959 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12960
12961 IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMText, (void**)&text);
12962
12963 /* \r\n is normalized to \n and back to \r\n */
12964
12965 hr = IXMLDOMText_put_data(text, _bstr_("\r\n"));
12966 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12967
12968 hr = IXMLDOMText_get_data(text, &s);
12969 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12970 ok(!lstrcmpW(s, L"\n"), "got %s\n", wine_dbgstr_w(s));
12972
12973 hr = IXMLDOMText_get_length(text, &length);
12974 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12975 ok(length == 1, "got %ld, expected 1\n", length);
12976
12977 hr = IXMLDOMText_get_xml(text, &s);
12978 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12979 ok(!lstrcmpW(s, L"\r\n"), "got %s\n", wine_dbgstr_w(s));
12981
12982 /* \r\r\n is normalized to \n\n and back to \r\n\r\n */
12983
12984 hr = IXMLDOMText_put_data(text, _bstr_("\r\r\n"));
12985 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12986
12987 hr = IXMLDOMText_get_data(text, &s);
12988 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12989 ok(!lstrcmpW(s, L"\n\n"), "got %s\n", wine_dbgstr_w(s));
12991
12992 hr = IXMLDOMText_get_length(text, &length);
12993 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12994 ok(length == 2, "got %ld, expected 2\n", length);
12995
12996 hr = IXMLDOMText_get_xml(text, &s);
12997 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
12998 ok(!lstrcmpW(s, L"\r\n\r\n"), "got %s\n", wine_dbgstr_w(s));
13000
13001 /* the same normalizations are applied when loading a document as a whole */
13002
13003 hr = IXMLDOMDocument_loadXML(doc, _bstr_("<?xml version=\"1.0\"?><root>foo\n\r\n\r\r\nbar</root>"), &b);
13004 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13005
13006 hr = IXMLDOMDocument_get_text(doc, &s);
13007 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13008 ok(!lstrcmpW(s, L"foo\n\n\n\nbar"), "got %s\n", wine_dbgstr_w(s));
13010
13011 hr = IXMLDOMDocument_get_xml(doc, &s);
13012 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13013 ok(!lstrcmpW(s, L"<?xml version=\"1.0\"?>\r\n<root>foo\r\n\r\n\r\n\r\nbar</root>\r\n"),
13014 "got %s\n", wine_dbgstr_w(s));
13016
13017 /* even if xml:space="preserve" */
13018
13019 hr = IXMLDOMDocument_loadXML(doc, _bstr_("<?xml version=\"1.0\"?>"
13020 "<root xml:space=\"preserve\">foo\n\r\n\r\r\nbar</root>"), &b);
13021 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13022
13023 hr = IXMLDOMDocument_get_text(doc, &s);
13024 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13025 ok(!lstrcmpW(s, L"foo\n\n\n\nbar"), "got %s\n", wine_dbgstr_w(s));
13027
13028 hr = IXMLDOMDocument_get_xml(doc, &s);
13029 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13030 ok(!lstrcmpW(s, _bstr_("<?xml version=\"1.0\"?>\r\n"
13031 "<root xml:space=\"preserve\">foo\r\n\r\n\r\n\r\nbar</root>\r\n")),
13032 "got %s\n", wine_dbgstr_w(s));
13034
13035 /* or preserveWhiteSpace is set */
13036
13037 hr = IXMLDOMDocument_put_preserveWhiteSpace(doc, VARIANT_TRUE);
13038 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13039
13040 hr = IXMLDOMDocument_loadXML(doc, _bstr_("<?xml version=\"1.0\"?><root>foo\n\r\n\r\r\nbar</root>"), &b);
13041 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13042
13043 hr = IXMLDOMDocument_get_text(doc, &s);
13044 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13045 ok(!lstrcmpW(s, L"foo\n\n\n\nbar"), "got %s\n", wine_dbgstr_w(s));
13047
13048 hr = IXMLDOMDocument_get_xml(doc, &s);
13049 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13050 if (IsEqualGUID(table->clsid, &CLSID_DOMDocument60))
13051 {
13052 /* DOMDocument60 does the newline normalization but does not insert line breaks around the root node */
13053 todo_wine
13054 ok(!lstrcmpW(s, L"<?xml version=\"1.0\"?><root>foo\r\n\r\n\r\n\r\nbar</root>"),
13055 "got %s\n", wine_dbgstr_w(s));
13056 }
13057 else
13058 {
13059 ok(!lstrcmpW(s, L"<?xml version=\"1.0\"?>\r\n<root>foo\r\n\r\n\r\n\r\nbar</root>\r\n"),
13060 "got %s\n", wine_dbgstr_w(s));
13061 }
13063
13064 IXMLDOMText_Release(text);
13065 IXMLDOMNode_Release(node);
13066 IXMLDOMDocument_Release(doc);
13067 free_bstrs();
13068 table++;
13069 }
13070}
13071
13072static void test_putref_schemas(void)
13073{
13075 IXMLDOMDocument2 *doc;
13077 HRESULT hr;
13078
13079 if (!is_clsid_supported(&CLSID_DOMDocument2, &IID_IXMLDOMDocument2)) return;
13080 if (!is_clsid_supported(&CLSID_XMLSchemaCache, &IID_IXMLDOMSchemaCollection)) return;
13081
13082 doc = create_document(&IID_IXMLDOMDocument2);
13083 cache = create_cache(&IID_IXMLDOMSchemaCollection);
13084
13085 /* set to NULL iface when no schema is set */
13088 hr = IXMLDOMDocument2_putref_schemas(doc, schema);
13089 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13090
13092 V_UNKNOWN(&schema) = NULL;
13093 hr = IXMLDOMDocument2_putref_schemas(doc, schema);
13094 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13095
13096 /* set as VT_DISPATCH, reset with it */
13099 hr = IXMLDOMDocument2_putref_schemas(doc, schema);
13100 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13101
13103 hr = IXMLDOMDocument2_get_schemas(doc, &schema);
13104 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13105 ok(V_DISPATCH(&schema) == (IDispatch*)cache, "got %p\n", V_DISPATCH(&schema));
13106
13109 hr = IXMLDOMDocument2_putref_schemas(doc, schema);
13110 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13111
13112 V_DISPATCH(&schema) = (IDispatch*)0xdeadbeef;
13113 V_VT(&schema) = VT_I2;
13114 hr = IXMLDOMDocument2_get_schemas(doc, &schema);
13115 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
13116 ok(V_DISPATCH(&schema) == NULL, "got %p\n", V_DISPATCH(&schema));
13117 ok(V_VT(&schema) == VT_NULL, "got %d\n", V_VT(&schema));
13118
13119 /* set as VT_UNKNOWN, reset with it */
13122 hr = IXMLDOMDocument2_putref_schemas(doc, schema);
13123 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13124
13126 hr = IXMLDOMDocument2_get_schemas(doc, &schema);
13127 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13128 ok(V_DISPATCH(&schema) == (IDispatch*)cache, "got %p\n", V_DISPATCH(&schema));
13129
13131 V_UNKNOWN(&schema) = NULL;
13132 hr = IXMLDOMDocument2_putref_schemas(doc, schema);
13133 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13134
13135 V_DISPATCH(&schema) = (IDispatch*)0xdeadbeef;
13136 V_VT(&schema) = VT_I2;
13137 hr = IXMLDOMDocument2_get_schemas(doc, &schema);
13138 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
13139 ok(V_DISPATCH(&schema) == NULL, "got %p\n", V_DISPATCH(&schema));
13140 ok(V_VT(&schema) == VT_NULL, "got %d\n", V_VT(&schema));
13141
13142 IXMLDOMSchemaCollection_Release(cache);
13143 IXMLDOMDocument2_Release(doc);
13144}
13145
13146static void test_namedmap_newenum(void)
13147{
13148 IEnumVARIANT *enum1, *enum2, *enum3;
13150 IUnknown *unk1, *unk2;
13151 IXMLDOMDocument *doc;
13155 ULONG fetched;
13156 VARIANT v[3];
13157 HRESULT hr;
13158 BSTR str;
13159
13160 doc = create_document(&IID_IXMLDOMDocument);
13161
13162 hr = IXMLDOMDocument_loadXML(doc, _bstr_(attributes_map), &b);
13163 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13164
13165 hr = IXMLDOMDocument_get_documentElement(doc, &elem);
13166 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13167
13168 hr = IXMLDOMElement_get_attributes(elem, &map);
13169 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13170 IXMLDOMElement_Release(elem);
13171
13172 enum1 = NULL;
13173 EXPECT_REF(map, 1);
13174 hr = IXMLDOMNamedNodeMap_QueryInterface(map, &IID_IEnumVARIANT, (void**)&enum1);
13175 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13176 ok(enum1 != NULL, "got %p\n", enum1);
13177 EXPECT_REF(map, 1);
13178 EXPECT_REF(enum1, 2);
13179
13180 enum2 = NULL;
13181 hr = IXMLDOMNamedNodeMap_QueryInterface(map, &IID_IEnumVARIANT, (void**)&enum2);
13182 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13183 ok(enum2 == enum1, "got %p\n", enum2);
13184
13185 IEnumVARIANT_Release(enum2);
13186
13187 EXPECT_REF(map, 1);
13188 hr = IXMLDOMNamedNodeMap__newEnum(map, (IUnknown**)&enum2);
13189 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13190 EXPECT_REF(map, 2);
13191 EXPECT_REF(enum2, 1);
13192 ok(enum2 != enum1, "got %p, %p\n", enum2, enum1);
13193
13194 IEnumVARIANT_Release(enum1);
13195
13196 /* enumerator created with _newEnum() doesn't share IUnknown* with main object */
13197 hr = IXMLDOMNamedNodeMap_QueryInterface(map, &IID_IUnknown, (void**)&unk1);
13198 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13199 hr = IEnumVARIANT_QueryInterface(enum2, &IID_IUnknown, (void**)&unk2);
13200 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13201 EXPECT_REF(map, 3);
13202 EXPECT_REF(enum2, 2);
13203 ok(unk1 != unk2, "got %p, %p\n", unk1, unk2);
13204 IUnknown_Release(unk1);
13205 IUnknown_Release(unk2);
13206
13207 hr = IXMLDOMNamedNodeMap__newEnum(map, (IUnknown**)&enum3);
13208 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13209 ok(enum2 != enum3, "got %p, %p\n", enum2, enum3);
13210 IEnumVARIANT_Release(enum3);
13211
13212 /* iteration tests */
13213 hr = IXMLDOMNamedNodeMap_get_item(map, 0, &node);
13214 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13215 hr = IXMLDOMNode_get_nodeName(node, &str);
13216 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13217 ok(!lstrcmpW(str, L"attr1"), "got %s\n", wine_dbgstr_w(str));
13219 IXMLDOMNode_Release(node);
13220
13221 hr = IXMLDOMNamedNodeMap_nextNode(map, &node);
13222 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13223 hr = IXMLDOMNode_get_nodeName(node, &str);
13224 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13225 ok(!lstrcmpW(str, L"attr1"), "got %s\n", wine_dbgstr_w(str));
13227 IXMLDOMNode_Release(node);
13228
13229 V_VT(&v[0]) = VT_EMPTY;
13230 hr = IEnumVARIANT_Next(enum2, 1, &v[0], NULL);
13231 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13232 ok(V_VT(&v[0]) == VT_DISPATCH, "got var type %d\n", V_VT(&v[0]));
13233 hr = IDispatch_QueryInterface(V_DISPATCH(&v[0]), &IID_IXMLDOMNode, (void**)&node);
13234 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13235 hr = IXMLDOMNode_get_nodeName(node, &str);
13236 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13237 ok(!lstrcmpW(str, L"attr1"), "got node name %s\n", wine_dbgstr_w(str));
13239 IXMLDOMNode_Release(node);
13240 VariantClear(&v[0]);
13241
13242 hr = IXMLDOMNamedNodeMap_nextNode(map, &node);
13243 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13244 hr = IXMLDOMNode_get_nodeName(node, &str);
13245 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13246 ok(!lstrcmpW(str, L"attr2"), "got %s\n", wine_dbgstr_w(str));
13248 IXMLDOMNode_Release(node);
13249
13250 hr = IEnumVARIANT_Reset(enum2);
13251 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13252
13253 V_VT(&v[1]) = VT_EMPTY;
13254 V_VT(&v[0]) = VT_EMPTY;
13255 hr = IEnumVARIANT_Next(enum2, 2, v, &fetched);
13256 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13257 ok(fetched == 2, "got %ld, expected 2\n", fetched);
13258 ok(V_VT(&v[0]) == VT_DISPATCH, "got var type %d\n", V_VT(&v[0]));
13259 ok(V_VT(&v[1]) == VT_DISPATCH, "got var type %d\n", V_VT(&v[1]));
13260 hr = IDispatch_QueryInterface(V_DISPATCH(&v[0]), &IID_IXMLDOMNode, (void**)&node);
13261 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13262 hr = IXMLDOMNode_get_nodeName(node, &str);
13263 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13264 ok(!lstrcmpW(str, L"attr1"), "got node name %s\n", wine_dbgstr_w(str));
13266 IXMLDOMNode_Release(node);
13267 hr = IDispatch_QueryInterface(V_DISPATCH(&v[1]), &IID_IXMLDOMNode, (void**)&node);
13268 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13269 hr = IXMLDOMNode_get_nodeName(node, &str);
13270 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13271 ok(!lstrcmpW(str, L"attr2"), "got node name %s\n", wine_dbgstr_w(str));
13273 IXMLDOMNode_Release(node);
13274 VariantClear(&v[1]);
13275 VariantClear(&v[0]);
13276
13277 V_VT(&v[2]) = VT_NULL;
13278 V_VT(&v[1]) = VT_EMPTY;
13279 V_VT(&v[0]) = VT_EMPTY;
13280 hr = IEnumVARIANT_Next(enum2, 3, v, &fetched);
13281 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
13282 ok(fetched == 2, "got %ld, expected 2\n", fetched);
13283 ok(V_VT(&v[0]) == VT_DISPATCH, "got var type %d\n", V_VT(&v[0]));
13284 ok(V_VT(&v[1]) == VT_DISPATCH, "got var type %d\n", V_VT(&v[1]));
13285 ok(V_VT(&v[2]) == VT_EMPTY, "got var type %d\n", V_VT(&v[2]));
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"attr3"), "got node name %s\n", wine_dbgstr_w(str));
13292 IXMLDOMNode_Release(node);
13293 hr = IDispatch_QueryInterface(V_DISPATCH(&v[1]), &IID_IXMLDOMNode, (void**)&node);
13294 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13295 hr = IXMLDOMNode_get_nodeName(node, &str);
13296 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13297 ok(!lstrcmpW(str, L"attr4"), "got node name %s\n", wine_dbgstr_w(str));
13299 IXMLDOMNode_Release(node);
13300 VariantClear(&v[1]);
13301 VariantClear(&v[0]);
13302 IEnumVARIANT_Release(enum2);
13303
13304 IXMLDOMNamedNodeMap_Release(map);
13305 IXMLDOMDocument_Release(doc);
13306}
13307
13308static const char xsltext_xsl[] =
13309"<?xml version=\"1.0\"?>"
13310"<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" >"
13311"<xsl:output method=\"html\" encoding=\"us-ascii\"/>"
13312"<xsl:template match=\"/\">"
13313" <xsl:choose>"
13314" <xsl:when test=\"testkey\">"
13315" <xsl:text>testdata</xsl:text>"
13316" </xsl:when>"
13317" </xsl:choose>"
13318"</xsl:template>"
13319"</xsl:stylesheet>";
13320
13321static const char omitxmldecl_xsl[] =
13322"<?xml version=\"1.0\"?>"
13323"<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" >"
13324"<xsl:output method=\"xml\" omit-xml-declaration=\"yes\"/>"
13325"<xsl:template match=\"/\">"
13326" <xsl:for-each select=\"/a/item\">"
13327" <xsl:element name=\"node\">"
13328" <xsl:value-of select=\"@name\"/>"
13329" </xsl:element>"
13330" </xsl:for-each>"
13331"</xsl:template>"
13332"</xsl:stylesheet>";
13333
13334static const char omitxmldecl_doc[] =
13335"<?xml version=\"1.0\"?>"
13336"<a>"
13337" <item name=\"item1\"/>"
13338" <item name=\"item2\"/>"
13339"</a>";
13340
13341static void test_xsltext(void)
13342{
13343 IXMLDOMDocument *doc, *doc2;
13345 HRESULT hr;
13346 BSTR ret;
13347
13348 doc = create_document(&IID_IXMLDOMDocument);
13349 doc2 = create_document(&IID_IXMLDOMDocument);
13350
13351 hr = IXMLDOMDocument_loadXML(doc, _bstr_(xsltext_xsl), &b);
13352 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13353
13354 hr = IXMLDOMDocument_loadXML(doc2, _bstr_("<testkey/>"), &b);
13355 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13356
13357 hr = IXMLDOMDocument_transformNode(doc2, (IXMLDOMNode*)doc, &ret);
13358 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13359 ok(!lstrcmpW(ret, L"testdata"), "transform result %s\n", wine_dbgstr_w(ret));
13361
13362 /* omit-xml-declaration */
13363 hr = IXMLDOMDocument_loadXML(doc, _bstr_(omitxmldecl_xsl), &b);
13364 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13365 hr = IXMLDOMDocument_loadXML(doc2, _bstr_(omitxmldecl_doc), &b);
13366 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13367
13368 hr = IXMLDOMDocument_transformNode(doc2, (IXMLDOMNode*)doc, &ret);
13369 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13370 ok(!lstrcmpW(ret, L"<node>item1</node><node>item2</node>"), "transform result %s\n", wine_dbgstr_w(ret));
13372
13373 IXMLDOMDocument_Release(doc2);
13374 IXMLDOMDocument_Release(doc);
13375 free_bstrs();
13376}
13377
13379 const char *name;
13380 const char *uri;
13381 const char *prefix;
13382 const char *href;
13383};
13384
13385static struct attrtest_t attrtests[] = {
13386 { "xmlns", "http://www.w3.org/2000/xmlns/", "xmlns", "xmlns" },
13387 { "xmlns", "nondefaulturi", "xmlns", "xmlns" },
13388 { "c", "http://www.w3.org/2000/xmlns/", NULL, "http://www.w3.org/2000/xmlns/" },
13389 { "c", "nsref1", NULL, "nsref1" },
13390 { "ns:c", "nsref1", "ns", "nsref1" },
13391 { "xmlns:c", "http://www.w3.org/2000/xmlns/", "xmlns", "" },
13392 { "xmlns:c", "nondefaulturi", "xmlns", "" },
13393 { 0 }
13394};
13395
13396/* see dlls/msxml[46]/tests/domdoc.c */
13397static void test_create_attribute(void)
13398{
13399 struct attrtest_t *ptr = attrtests;
13400 IXMLDOMElement *el;
13401 IXMLDOMDocument *doc;
13402 IXMLDOMNode *node, *node2;
13403 VARIANT var;
13404 HRESULT hr;
13405 int i = 0;
13406 BSTR str;
13407
13408 doc = create_document(&IID_IXMLDOMDocument);
13409
13410 while (ptr->name)
13411 {
13412 V_VT(&var) = VT_I1;
13414 hr = IXMLDOMDocument_createNode(doc, var, _bstr_(ptr->name), _bstr_(ptr->uri), &node);
13415 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13416
13417 str = NULL;
13418 hr = IXMLDOMNode_get_prefix(node, &str);
13419 if (ptr->prefix)
13420 {
13421 ok(hr == S_OK, "%d: unexpected hr %#lx\n", i, hr);
13422 ok(!lstrcmpW(str, _bstr_(ptr->prefix)), "%d: got prefix %s, expected %s\n", i, wine_dbgstr_w(str), ptr->prefix);
13423 }
13424 else
13425 {
13426 ok(hr == S_FALSE, "%d: unexpected hr %#lx\n", i, hr);
13427 ok(str == NULL, "%d: got prefix %s\n", i, wine_dbgstr_w(str));
13428 }
13430
13431 str = NULL;
13432 hr = IXMLDOMNode_get_namespaceURI(node, &str);
13433 ok(hr == S_OK, "%d: unexpected hr %#lx\n", i, hr);
13434 ok(!lstrcmpW(str, _bstr_(ptr->href)), "%d: got uri %s, expected %s\n", i, wine_dbgstr_w(str), ptr->href);
13436
13437 IXMLDOMNode_Release(node);
13438 free_bstrs();
13439
13440 i++;
13441 ptr++;
13442 }
13443
13444 V_VT(&var) = VT_I1;
13445 V_I1(&var) = NODE_ELEMENT;
13446 hr = IXMLDOMDocument_createNode(doc, var, _bstr_("e"), NULL, &node2);
13447 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13448
13449 hr = IXMLDOMNode_QueryInterface(node2, &IID_IXMLDOMElement, (void**)&el);
13450 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13451 IXMLDOMNode_Release(node2);
13452
13453 V_VT(&var) = VT_I1;
13455 hr = IXMLDOMDocument_createNode(doc, var, _bstr_("xmlns:a"), _bstr_("http://www.w3.org/2000/xmlns/"), &node);
13456 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13457
13458 hr = IXMLDOMElement_setAttributeNode(el, (IXMLDOMAttribute*)node, NULL);
13459 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13460
13461 /* for some reason default namespace uri is not reported */
13462 hr = IXMLDOMNode_get_namespaceURI(node, &str);
13463 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13464 ok(!lstrcmpW(str, L""), "got uri %s\n", wine_dbgstr_w(str));
13466
13467 IXMLDOMNode_Release(node);
13468 IXMLDOMElement_Release(el);
13469 IXMLDOMDocument_Release(doc);
13470 free_bstrs();
13471}
13472
13473static void test_url(void)
13474{
13475 IXMLDOMDocument *doc;
13476 HRESULT hr;
13477 BSTR s;
13478
13479 doc = create_document(&IID_IXMLDOMDocument);
13480
13481 hr = IXMLDOMDocument_get_url(doc, NULL);
13482 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
13483
13484 s = (void *)0xdeadbeef;
13485 hr = IXMLDOMDocument_get_url(doc, &s);
13486 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
13487 ok(s == NULL, "got %s\n", wine_dbgstr_w(s));
13488
13489 IXMLDOMDocument_Release(doc);
13490}
13491
13492static void test_merging_text(void)
13493{
13494 IXMLDOMText *nodetext;
13495 IXMLDOMText *newtext;
13497 IXMLDOMDocument *doc;
13499 HRESULT hr;
13500 VARIANT v;
13501 BSTR str;
13502 int i;
13503
13504 doc = create_document(&IID_IXMLDOMDocument);
13505
13506 hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing"), &root);
13507 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13508
13509 hr = IXMLDOMDocument_appendChild(doc, (IXMLDOMNode*)root, NULL);
13510 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13511
13512 /* test xmlAddChild */
13513 for (i = 0; i < 10; i++)
13514 {
13515 str = SysAllocString(L"str1");
13516 hr = IXMLDOMDocument_createTextNode(doc, str, &nodetext);
13518 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13519
13520 newtext = NULL;
13521 hr = IXMLDOMElement_appendChild(root, (IXMLDOMNode*)nodetext, (IXMLDOMNode**)&newtext);
13522 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13523 ok(nodetext == newtext, "expected %p, got %p\n", nodetext, newtext);
13524
13525 IXMLDOMText_Release(newtext);
13526 IXMLDOMText_Release(nodetext);
13527 }
13528
13529 /* test xmlAddPrevSibling */
13530 hr = IXMLDOMElement_get_firstChild(root, &first);
13531 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13532 V_VT(&v) = VT_UNKNOWN;
13533 V_UNKNOWN(&v) = (IUnknown*)first;
13534 for (i = 0; i < 10; i++)
13535 {
13536 str = SysAllocString(L"str2");
13537 hr = IXMLDOMDocument_createTextNode(doc, str, &nodetext);
13539 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13540
13541 newtext = NULL;
13542 hr = IXMLDOMElement_insertBefore(root, (IXMLDOMNode*)nodetext, v, (IXMLDOMNode**)&newtext);
13543 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13544 ok(nodetext == newtext, "expected %p, got %p\n", nodetext, newtext);
13545
13546 IXMLDOMText_Release(newtext);
13547 IXMLDOMText_Release(nodetext);
13548 }
13549
13550 IXMLDOMNode_Release(first);
13551 IXMLDOMElement_Release(root);
13552 IXMLDOMDocument_Release(doc);
13553
13554 free_bstrs();
13555}
13556
13558{
13559 BOOL known_iid = IsEqualIID(riid, &IID_IHTMLObjectElement) ||
13560 IsEqualIID(riid, &IID_transformdest_unknown) ||
13561 IsEqualIID(riid, &IID_IServiceProvider) ||
13562 IsEqualIID(riid, &IID_IStream) ||
13563 IsEqualIID(riid, &IID_ISequentialStream) ||
13564 IsEqualIID(riid, &IID_IResponse);
13565
13566 todo_wine_if(IsEqualIID(riid, &IID_IXMLDOMDocument))
13567 ok(known_iid, "Unexpected riid %s\n", wine_dbgstr_guid(riid));
13568
13569 return E_NOINTERFACE;
13570}
13571
13573{
13574 return 2;
13575}
13576
13578{
13579 return 1;
13580}
13581
13582static const IUnknownVtbl transformdestvtbl =
13583{
13587};
13588
13590{
13591 IUnknown transformdest = { &transformdestvtbl };
13592 IXMLDOMDocument *doc, *doc2, *doc3;
13593 ISequentialStream *sstream;
13594 LARGE_INTEGER off;
13595 WCHAR buffer[256];
13598 ULONG nread;
13599 HRESULT hr;
13600 VARIANT v;
13601
13602 doc = create_document(&IID_IXMLDOMDocument);
13603 doc2 = create_document(&IID_IXMLDOMDocument);
13604 doc3 = create_document(&IID_IXMLDOMDocument);
13605
13606 hr = IXMLDOMDocument_loadXML(doc, _bstr_(szTransformXML), &b);
13607 ok(hr == S_OK, "Failed to load document, hr %#lx.\n", hr);
13608 hr = IXMLDOMDocument_loadXML(doc2, _bstr_(szTransformSSXML), &b);
13609 ok(hr == S_OK, "Failed to load document, hr %#lx.\n", hr);
13610
13611 V_VT(&v) = VT_UNKNOWN;
13612 V_UNKNOWN(&v) = &transformdest;
13613 hr = IXMLDOMDocument_transformNodeToObject(doc, (IXMLDOMNode *)doc2, v);
13614 ok(hr == E_INVALIDARG, "Failed to transform node, hr %#lx.\n", hr);
13615
13616 V_VT(&v) = VT_UNKNOWN;
13617 V_UNKNOWN(&v) = NULL;
13618 hr = IXMLDOMDocument_transformNodeToObject(doc, (IXMLDOMNode *)doc2, v);
13619 ok(hr == E_INVALIDARG, "Failed to transform node, hr %#lx.\n", hr);
13620
13621 V_VT(&v) = VT_DISPATCH;
13622 V_DISPATCH(&v) = NULL;
13623 hr = IXMLDOMDocument_transformNodeToObject(doc, (IXMLDOMNode *)doc2, v);
13624 ok(hr == E_INVALIDARG, "Failed to transform node, hr %#lx.\n", hr);
13625
13626 V_VT(&v) = VT_DISPATCH;
13627 V_DISPATCH(&v) = (IDispatch *)doc3;
13628 hr = IXMLDOMDocument_transformNodeToObject(doc, (IXMLDOMNode *)doc2, v);
13629 ok(hr == S_OK, "Failed to transform node, hr %#lx.\n", hr);
13630
13631 /* IStream */
13633 V_VT(&v) = VT_UNKNOWN;
13634 V_UNKNOWN(&v) = (IUnknown *)istream;
13635 hr = IXMLDOMDocument_transformNodeToObject(doc, (IXMLDOMNode *)doc2, v);
13636 ok(hr == S_OK, "Failed to transform node, hr %#lx.\n", hr);
13637
13638 off.QuadPart = 0;
13639 hr = IStream_Seek(istream, off, STREAM_SEEK_SET, NULL);
13640 ok(hr == S_OK, "Failed to seek, hr %#lx.\n", hr);
13641
13642 nread = 0;
13643 memset(buffer, 0xcc, sizeof(buffer));
13644 hr = IStream_Read(istream, buffer, sizeof(buffer), &nread);
13645 ok(hr == S_OK, "Failed to read, hr %#lx.\n", hr);
13646 buffer[nread/2] = 0;
13647 ok(buffer[0] == 0xfeff, "got %x\n", buffer[0]);
13649 IStream_Release(istream);
13650
13651 /* ISequentialStream */
13653 sstream = NULL;
13654 hr = IStream_QueryInterface(istream, &IID_ISequentialStream, (void**)&sstream);
13655#ifdef __REACTOS__
13657 {
13658 ok(hr == E_NOINTERFACE, "Unexpected hr %#lx.\n", hr);
13659 }
13660 else
13661 {
13662#endif
13663 ok(hr == S_OK, "Failed to QI, hr %#lx.\n", hr);
13664
13665 V_VT(&v) = VT_UNKNOWN;
13666 V_UNKNOWN(&v) = (IUnknown *)sstream;
13667 hr = IXMLDOMDocument_transformNodeToObject(doc, (IXMLDOMNode *)doc2, v);
13668 ok(hr == S_OK, "Failed to transform node, hr %#lx.\n", hr);
13669
13670 off.QuadPart = 0;
13671 hr = IStream_Seek(istream, off, STREAM_SEEK_SET, NULL);
13672 ok(hr == S_OK, "Failed to seek, hr %#lx.\n", hr);
13673
13674 nread = 0;
13675 memset(buffer, 0xcc, sizeof(buffer));
13676 hr = ISequentialStream_Read(sstream, buffer, sizeof(buffer), &nread);
13677 ok(hr == S_OK, "Failed to read, hr %#lx.\n", hr);
13678 buffer[nread/2] = 0;
13679 ok(buffer[0] == 0xfeff, "got %x\n", buffer[0]);
13681 ISequentialStream_Release(sstream);
13682 IStream_Release(istream);
13683#ifdef __REACTOS__
13684 }
13685#endif
13686
13687 IXMLDOMDocument_Release(doc3);
13688 IXMLDOMDocument_Release(doc2);
13689 IXMLDOMDocument_Release(doc);
13690 free_bstrs();
13691}
13692
13694{
13695 IXMLDOMDocument2 *doc;
13696 VARIANT var;
13697 HRESULT hr;
13698
13699 if (!is_clsid_supported(&CLSID_DOMDocument60, &IID_IXMLDOMDocument2))
13700 {
13701 win_skip("NormalizeAttributeValues is not supported.\n");
13702 return;
13703 }
13704
13705 doc = create_document_version(60, &IID_IXMLDOMDocument2);
13706
13707 V_VT(&var) = VT_I2;
13708 V_I2(&var) = 10;
13709 hr = IXMLDOMDocument2_getProperty(doc, _bstr_("NormalizeAttributeValues"), &var);
13710todo_wine {
13711 ok(hr == S_OK, "Failed to get property value, hr %#lx.\n", hr);
13712 ok(V_VT(&var) == VT_BOOL, "Unexpected property value type, vt %d.\n", V_VT(&var));
13713 ok(V_BOOL(&var) == VARIANT_FALSE, "Unexpected property value.\n");
13714}
13715 V_VT(&var) = VT_BOOL;
13716 V_BOOL(&var) = VARIANT_TRUE;
13717 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("NormalizeAttributeValues"), var);
13718 ok(hr == S_OK, "Failed to set property, hr %#lx.\n", hr);
13719
13720 V_VT(&var) = VT_I2;
13721 V_I2(&var) = 10;
13722 hr = IXMLDOMDocument2_getProperty(doc, _bstr_("NormalizeAttributeValues"), &var);
13723todo_wine {
13724 ok(hr == S_OK, "Failed to get property value, hr %#lx.\n", hr);
13725 ok(V_VT(&var) == VT_BOOL, "Unexpected property value type, vt %d.\n", V_VT(&var));
13726 ok(V_BOOL(&var) == VARIANT_TRUE, "Unexpected property value.\n");
13727}
13728 IXMLDOMDocument2_Release(doc);
13729}
13730
13732{
13733 IXMLDOMDocument2 *doc;
13734 VARIANT var;
13735 HRESULT hr;
13736
13737 doc = create_document_version(60, &IID_IXMLDOMDocument2);
13738
13739 /* The default max element depth value should be 256. */
13740 V_VT(&var) = VT_UI4;
13741 V_UI4(&var) = 0xdeadbeef;
13742 hr = IXMLDOMDocument2_getProperty(doc, _bstr_("MaxElementDepth"), &var);
13743todo_wine {
13744 ok(hr == S_OK, "Failed to get property value, hr %#lx.\n", hr);
13745 ok(V_VT(&var) == VT_I4, "Unexpected property value type, vt %d.\n", V_VT(&var));
13746 ok(V_I4(&var) == 256, "Unexpected property value.\n");
13747}
13748
13749 /* Changes to the depth value should be observable when subsequently retrieved. */
13750 V_VT(&var) = VT_I4;
13751 V_I4(&var) = 32;
13752 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("MaxElementDepth"), var);
13753 ok(hr == S_OK, "Failed to set property, hr %#lx.\n", hr);
13754
13755 V_VT(&var) = VT_UI4;
13756 V_UI4(&var) = 0xdeadbeef;
13757 hr = IXMLDOMDocument2_getProperty(doc, _bstr_("MaxElementDepth"), &var);
13758todo_wine {
13759 ok(hr == S_OK, "Failed to get property value, hr %#lx.\n", hr);
13760 ok(V_VT(&var) == VT_I4, "Unexpected property value type, vt %d.\n", V_VT(&var));
13761 ok(V_I4(&var) == 32, "Unexpected property value.\n");
13762}
13763
13764 IXMLDOMDocument2_Release(doc);
13765}
13766
13768 const GUID *guid;
13769 const char *clsid;
13771
13773 { &CLSID_DOMDocument, "CLSID_DOMDocument" },
13774 { &CLSID_DOMDocument2, "CLSID_DOMDocument2" },
13775 { &CLSID_DOMDocument26, "CLSID_DOMDocument26" },
13776 { &CLSID_DOMDocument30, "CLSID_DOMDocument30" },
13777 { 0 }
13778};
13779
13780/* see dlls/msxml[46]/tests/domdoc.c */
13782{
13784 struct test {
13785 const char *xml;
13786 int explen;
13787 const char *names[3];
13788 const char *prefixes[3];
13789 const char *basenames[3];
13790 const char *uris[3];
13791 const char *texts[3];
13792 const char *xmls[3];
13793 };
13794 static const struct test tests[] = {
13795 {
13796 "<a ns:b=\"b attr\" d=\"d attr\" xmlns:ns=\"nshref\" />", 3,
13797 { "ns:b", "d", "xmlns:ns" }, /* nodeName */
13798 { "ns", NULL, "xmlns" }, /* prefix */
13799 { "b", "d", "ns" }, /* baseName */
13800 { "nshref", NULL, "" }, /* namespaceURI */
13801 { "b attr", "d attr", "nshref" }, /* text */
13802 { "ns:b=\"b attr\"", "d=\"d attr\"", "xmlns:ns=\"nshref\"" }, /* xml */
13803 },
13804 /* property only */
13805 {
13806 "<a d=\"d attr\" />", 1,
13807 { "d" }, /* nodeName */
13808 { NULL }, /* prefix */
13809 { "d" }, /* baseName */
13810 { NULL }, /* namespaceURI */
13811 { "d attr" }, /* text */
13812 { "d=\"d attr\"" }, /* xml */
13813 },
13814 /* namespace only */
13815 {
13816 "<a xmlns:ns=\"nshref\" />", 1,
13817 { "xmlns:ns" }, /* nodeName */
13818 { "xmlns" }, /* prefix */
13819 { "ns" }, /* baseName */
13820 { "" }, /* namespaceURI */
13821 { "nshref" }, /* text */
13822 { "xmlns:ns=\"nshref\"" }, /* xml */
13823 },
13824 /* default namespace */
13825 {
13826 "<a xmlns=\"nshref\" />", 1,
13827 { "xmlns" }, /* nodeName */
13828 { "xmlns" }, /* prefix */
13829 { "" }, /* baseName */
13830 { "" }, /* namespaceURI */
13831 { "nshref" }, /* text */
13832 { "xmlns=\"nshref\"" }, /* xml */
13833 },
13834 /* no properties or namespaces */
13835 {
13836 "<a />", 0,
13837 },
13838
13839 { NULL }
13840 };
13841 const struct test *test;
13844 IXMLDOMDocument *doc;
13846 LONG len, i;
13847 HRESULT hr;
13848 BSTR str;
13849
13850 while (entry->guid)
13851 {
13852 if (!is_clsid_supported(entry->guid, &IID_IXMLDOMDocument2))
13853 {
13854 entry++;
13855 continue;
13856 }
13857
13858 test = tests;
13859 while (test->xml) {
13860 hr = CoCreateInstance(entry->guid, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (void **)&doc);
13861 ok(hr == S_OK, "Unexpected hr %#lx for %s.\n", hr, wine_dbgstr_guid(entry->guid));
13862
13863 hr = IXMLDOMDocument_loadXML(doc, _bstr_(test->xml), &b);
13864 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13865
13866 node = NULL;
13867 hr = IXMLDOMDocument_selectSingleNode(doc, _bstr_("a"), &node);
13868 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13869
13870 hr = IXMLDOMNode_get_attributes(node, &map);
13871 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13872
13873 len = -1;
13874 hr = IXMLDOMNamedNodeMap_get_length(map, &len);
13875 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13876 ok(len == test->explen, "got %ld\n", len);
13877
13878 item = NULL;
13879 hr = IXMLDOMNamedNodeMap_get_item(map, test->explen+1, &item);
13880 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr);
13881 ok(!item, "Item should be NULL\n");
13882
13883 for (i = 0; i < len; i++)
13884 {
13885 item = NULL;
13886 hr = IXMLDOMNamedNodeMap_get_item(map, i, &item);
13887 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13888
13889 str = NULL;
13890 hr = IXMLDOMNode_get_nodeName(item, &str);
13891 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13892 ok(!lstrcmpW(str, _bstr_(test->names[i])), "got %s\n", wine_dbgstr_w(str));
13894
13895 str = NULL;
13896 hr = IXMLDOMNode_get_prefix(item, &str);
13897 if (test->prefixes[i])
13898 {
13899 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13900 ok(!lstrcmpW(str, _bstr_(test->prefixes[i])), "got %s\n", wine_dbgstr_w(str));
13902 }
13903 else
13904 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
13905
13906 str = NULL;
13907 hr = IXMLDOMNode_get_baseName(item, &str);
13908 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13909 ok(!lstrcmpW(str, _bstr_(test->basenames[i])), "got %s\n", wine_dbgstr_w(str));
13911
13912 str = NULL;
13913 hr = IXMLDOMNode_get_namespaceURI(item, &str);
13914 if (test->uris[i])
13915 {
13916 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13917 if (test->prefixes[i] && !strcmp(test->prefixes[i], "xmlns"))
13918 ok(!SysStringLen(str), "got %s\n", wine_dbgstr_w(str));
13919 else
13920 ok(!lstrcmpW(str, _bstr_(test->uris[i])), "got %s\n", wine_dbgstr_w(str));
13922 }
13923 else
13924 ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr );
13925
13926 str = NULL;
13927 hr = IXMLDOMNode_get_text(item, &str);
13928 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13929 ok(!lstrcmpW(str, _bstr_(test->texts[i])), "got %s\n", wine_dbgstr_w(str));
13931
13932 str = NULL;
13933 hr = IXMLDOMNode_get_xml(item, &str);
13934 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
13935 ok(!lstrcmpW(str, _bstr_(test->xmls[i])), "got %s\n", wine_dbgstr_w(str));
13937
13938 IXMLDOMNode_Release(item);
13939 }
13940
13941 IXMLDOMNamedNodeMap_Release(map);
13942 IXMLDOMNode_Release(node);
13943 IXMLDOMDocument_Release(doc);
13944
13945 test++;
13946 }
13947
13948 entry++;
13949 }
13950 free_bstrs();
13951}
13952
13953static const IID *qi_list[32];
13954static int qi_count;
13955
13957{
13958 int i;
13959
13960 for (i = 0; i < qi_count; i++)
13961 {
13962 if (IsEqualGUID(qi_list[i], iid))
13963 return TRUE;
13964 }
13965
13966 return FALSE;
13967}
13968
13970{
13971 int i;
13972
13973 for (i = 0; i < qi_count; i++)
13974 {
13975 if (IsEqualGUID(qi_list[i], service) && IsEqualGUID(qi_list[i + 1], iid))
13976 return TRUE;
13977 }
13978
13979 return FALSE;
13980}
13981
13983{
13985 qi_list[qi_count++] = iid;
13986 else
13987 ok(0, "qi_list overflow: %d\n", qi_count);
13988
13989 if (IsEqualGUID(iid, &IID_IUnknown) ||
13990 IsEqualGUID(iid, &IID_IServiceProvider))
13991 {
13992 *ppv = iface;
13993 return S_OK;
13994 }
13995
13996 *ppv = NULL;
13997 return E_NOINTERFACE;
13998}
13999
14001{
14002 return 2;
14003}
14004
14006{
14007 return 1;
14008}
14009
14011 REFIID iid, void **ppv)
14012{
14013 if (IsEqualGUID(service, &SID_SContainerDispatch) ||
14014 IsEqualGUID(service, &SID_SInternetHostSecurityManager))
14015 {
14016 if (qi_count + 1 < ARRAY_SIZE(qi_list))
14017 {
14018 qi_list[qi_count++] = service;
14019 qi_list[qi_count++] = iid;
14020 }
14021 else
14022 ok(0, "qi_list overflow: %d\n", qi_count);
14023 }
14024
14025 *ppv = NULL;
14026 return E_NOINTERFACE;
14027}
14028
14029static const IServiceProviderVtbl sp_vtbl =
14030{
14032 sp_AddRef,
14033 sp_Release,
14035};
14036
14038
14039static void test_load_with_site(void)
14040{
14041 char path[MAX_PATH];
14042 IXMLDOMDocument2 *doc;
14044 VARIANT var;
14046 HRESULT hr;
14047
14049 strcat(path, "winetest.xml");
14051
14052 doc = create_document(&IID_IXMLDOMDocument2);
14053
14054 hr = IXMLDOMDocument2_QueryInterface(doc, &IID_IObjectWithSite, (void **)&site);
14055 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
14056
14057 qi_count = 0;
14058 hr = IObjectWithSite_SetSite(site, (IUnknown *)&sp);
14059 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
14060 ok(qi_count != 0, "got %d QI calls\n", qi_count);
14061 todo_wine
14062 ok(qi_list_contains(&IID_IXMLDOMDocument), "QI(IID_IXMLDOMDocument) was not called\n");
14063 ok(qi_list_contains(&IID_IHTMLDocument2), "QI(IID_IHTMLDocument2) was not called\n");
14064 ok(qi_list_contains(&IID_IServiceProvider), "QI(IID_IServiceProvider) was not called\n");
14065 todo_wine
14066 ok(qi_list_contains(&IID_IOleClientSite), "QI(IID_IOleClientSite) was not called\n");
14067 ok(qi_list_contains_service(&SID_SContainerDispatch, &IID_IHTMLDocument2),
14068 "QI(SID_SContainerDispatch, IID_IHTMLDocument2) was not called\n");
14069 todo_wine
14070 ok(qi_list_contains_service(&SID_SInternetHostSecurityManager, &IID_IXMLDOMDocument),
14071 "QI(SID_SInternetHostSecurityManager, IID_IXMLDOMDocument) was not called\n");
14072
14073 qi_count = 0;
14074 V_VT(&var) = VT_BSTR;
14075 V_BSTR(&var) = _bstr_(path);
14076 hr = IXMLDOMDocument2_load(doc, var, &b);
14077 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
14078 ok(b == VARIANT_TRUE, "got %d\n", b);
14079 ok(qi_count == 0, "got %d QI calls\n", qi_count);
14080
14081 IXMLDOMDocument2_Release(doc);
14082
14084 free_bstrs();
14085}
14086
14088{
14089 const GUID *guid;
14090 const char *clsid;
14093
14095{
14096 { &CLSID_DOMDocument, "CLSID_DOMDocument" , E_FAIL },
14097 { &CLSID_DOMDocument2, "CLSID_DOMDocument2", E_FAIL },
14098 { &CLSID_DOMDocument26, "CLSID_DOMDocument26", E_FAIL },
14099 { &CLSID_DOMDocument30, "CLSID_DOMDocument30", E_FAIL },
14100 { &CLSID_DOMDocument40, "CLSID_DOMDocument40", S_OK },
14101 { &CLSID_DOMDocument60, "CLSID_DOMDocument60", S_OK },
14102 { 0 }
14103};
14104
14106{
14108 int i = 0;
14109
14110 while (entry->guid)
14111 {
14112 IXMLDOMDocument2 *doc, *doc_clone;
14114 VARIANT var, var_clone;
14116 HRESULT hr;
14117
14118 i++;
14119 if (!is_clsid_supported(entry->guid, &IID_IXMLDOMDocument2))
14120 {
14121 entry++;
14122 continue;
14123 }
14124
14125 hr = CoCreateInstance(entry->guid, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (void **)&doc);
14126 ok(hr == S_OK, "%d: got %#lx.\n", i, hr);
14127
14128 V_VT(&var) = VT_I2;
14129 V_I2(&var) = 0;
14130 hr = IXMLDOMDocument2_getProperty(doc, _bstr_("ValidateOnParse"), &var);
14131 ok(hr == entry->hr || broken(hr == E_FAIL) /* win8 */, "%d: got hr %#lx.\n", i, hr);
14132 if (SUCCEEDED(hr))
14133 {
14134 ok(V_VT(&var) == VT_BOOL, "%d: got property value type %d.\n", i, V_VT(&var));
14135 ok(V_BOOL(&var) == VARIANT_TRUE, "%d: got property value %d.\n", i, V_BOOL(&var));
14136 }
14137 else
14138 {
14139 ok(V_VT(&var) == VT_I2, "%d: got property value type %d.\n", i, V_VT(&var));
14140 ok(V_I2(&var) == 0, "%d: got property value %d.\n", i, V_I2(&var));
14141 if (IsEqualCLSID(entry->guid, &CLSID_DOMDocument40))
14142 {
14143 win_skip("Skip tests for CLSID_DOMDocument40 on Windows 8.\n");
14144 IXMLDOMDocument2_Release(doc);
14145 entry++;
14146 continue;
14147 }
14148 }
14149
14150 b = VARIANT_FALSE;
14151 hr = IXMLDOMDocument2_get_validateOnParse(doc, &b);
14152 ok(hr == S_OK, "%d: got hr %#lx.\n", i, hr);
14153 ok(b == VARIANT_TRUE, "%d: got property value %d.\n", i, b);
14154
14155 V_VT(&var) = VT_I2;
14156 V_I2(&var) = 0;
14157 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("ValidateOnParse"), var);
14158 ok(hr == entry->hr, "%d: got hr %#lx.\n", i, hr);
14159 V_VT(&var) = VT_I2;
14160 V_I2(&var) = 10;
14161 hr = IXMLDOMDocument2_getProperty(doc, _bstr_("ValidateOnParse"), &var);
14162 ok(hr == entry->hr, "%d: got hr %#lx.\n", i, hr);
14163 if (SUCCEEDED(hr))
14164 {
14165 ok(V_VT(&var) == VT_BOOL, "%d: got property value type %d.\n", i, V_VT(&var));
14166 ok(V_BOOL(&var) == VARIANT_FALSE, "%d: got property value %d.\n", i, V_BOOL(&var));
14167 }
14168
14169 V_VT(&var) = VT_BOOL;
14170 V_BOOL(&var) = VARIANT_TRUE;
14171 hr = IXMLDOMDocument2_setProperty(doc, _bstr_("ValidateOnParse"), var);
14172 ok(hr == entry->hr, "%d: got hr %#lx.\n", i, hr);
14173 b = VARIANT_FALSE;
14174 hr = IXMLDOMDocument2_get_validateOnParse(doc, &b);
14175 ok(hr == S_OK, "%d: got hr %#lx.\n", i, hr);
14176 ok(b == VARIANT_TRUE, "%d: got property value %d.\n", i, b);
14177
14178 V_VT(&var) = VT_I2;
14179 V_I2(&var) = 0;
14180 hr = IXMLDOMDocument2_getProperty(doc, _bstr_("ValidateOnParse"), &var);
14181 ok(hr == entry->hr, "%d: got hr %#lx.\n", i, hr);
14182 if (SUCCEEDED(hr))
14183 {
14184 ok(V_VT(&var) == VT_BOOL, "%d: got property value type %d.\n", i, V_VT(&var));
14185 ok(V_BOOL(&var) == VARIANT_TRUE, "%d: got property value %d.\n", i, V_BOOL(&var));
14186 }
14187
14188 b = VARIANT_FALSE;
14189 hr = IXMLDOMDocument2_put_validateOnParse(doc, b);
14190 ok(hr == S_OK, "%d: got hr %#lx.\n", i, hr);
14191 V_VT(&var) = VT_I2;
14192 V_I2(&var) = 10;
14193 hr = IXMLDOMDocument2_getProperty(doc, _bstr_("ValidateOnParse"), &var);
14194 ok(hr == entry->hr, "%d: got hr %#lx.\n", i, hr);
14195 if (SUCCEEDED(hr))
14196 {
14197 ok(V_VT(&var) == VT_BOOL, "%d: got property value type %d.\n", i, V_VT(&var));
14198 ok(V_BOOL(&var) == VARIANT_FALSE, "%d: got property value %d.\n", i, V_BOOL(&var));
14199 }
14200
14201 /* Cloned document inherits the property. */
14202 hr = IXMLDOMDocument2_cloneNode(doc, VARIANT_TRUE, &node_clone);
14203 ok(hr == S_OK, "%d: got hr %#lx.\n", i, hr);
14204 ok(node_clone != NULL, "%d: got node %p.\n", i, node_clone);
14205 hr = IXMLDOMNode_QueryInterface(node_clone, &IID_IXMLDOMDocument2, (void **)&doc_clone);
14206 ok(hr == S_OK, "%d: got hr %#lx.\n", i, hr);
14207 V_VT(&var) = VT_I2;
14208 V_I2(&var) = 10;
14209 hr = IXMLDOMDocument2_getProperty(doc, _bstr_("ValidateOnParse"), &var);
14210 ok(hr == entry->hr, "%d: got hr %#lx.\n", i, hr);
14211 if (SUCCEEDED(hr))
14212 {
14213 ok(V_VT(&var) == VT_BOOL, "%d: got property value type %d.\n", i, V_VT(&var));
14214 ok(V_BOOL(&var) == VARIANT_FALSE, "%d: got property value %d.\n", i, V_BOOL(&var));
14215 }
14216 V_VT(&var_clone) = VT_I2;
14217 V_I2(&var_clone) = 10;
14218 hr = IXMLDOMDocument2_getProperty(doc_clone, _bstr_("ValidateOnParse"), &var_clone);
14219 ok(hr == entry->hr, "%d: got hr %#lx.\n", i, hr);
14220 if (SUCCEEDED(hr))
14221 {
14222 ok(V_VT(&var_clone) == V_VT(&var), "%d: got property value type %d.\n", i, V_VT(&var_clone));
14223 ok(V_BOOL(&var_clone) == V_BOOL(&var), "%d: got property value %d.\n", i, V_BOOL(&var_clone));
14224 }
14225 b = VARIANT_TRUE;
14226 hr = IXMLDOMDocument2_get_validateOnParse(doc_clone, &b);
14227 ok(hr == S_OK, "%d: got hr %#lx.\n", i, hr);
14228 ok(b == VARIANT_FALSE, "%d: got property value %d.\n", i, b);
14229 IXMLDOMNode_Release(node_clone);
14230 IXMLDOMDocument2_Release(doc_clone);
14231
14232 IXMLDOMDocument2_Release(doc);
14233 entry++;
14234 }
14235}
14236
14237static void test_indent(void)
14238{
14239 HRESULT hr;
14240 VARIANT_BOOL b = VARIANT_FALSE;
14241 BSTR data, str;
14242 const WCHAR *data_expected;
14243 IXMLDOMDocument *doc;
14245
14246 str = SysAllocString(L"<?xml version='1.0' encoding='Windows-1252'?>\n"
14247 "<root>\n"
14248 "<a>\n"
14249 "<b/>\n"
14250 "</a>\n"
14251 "</root>\n");
14252 hr = CoCreateInstance(&CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (void **)&doc);
14253 ok(hr == S_OK, "Unable to create instance hr %#lx.\n", hr);
14254 hr = IXMLDOMDocument_loadXML(doc, str, &b);
14255 ok(hr == S_OK, "Unable to load XML hr %#lx.\n", hr);
14256 hr = IXMLDOMDocument_get_documentElement(doc, &element);
14257 ok(hr == S_OK, "Unable to get element hr %#lx.\n", hr);
14258 hr = IXMLDOMElement_get_xml(element, &data);
14259 ok(hr == S_OK, "Unable to get XML hr %#lx.\n", hr);
14260
14261 data_expected = L"<root>\r\n"
14262 "\t<a>\r\n"
14263 "\t\t<b/>\r\n"
14264 "\t</a>\r\n"
14265 "</root>";
14266 ok(!lstrcmpW(data, data_expected), "incorrect element string, got '%s'\n", wine_dbgstr_w(data));
14267
14269}
14270
14272{
14274 ok(hr == S_OK, "failed to init com\n");
14275 if (hr != S_OK) return 1;
14276
14277 test_indent();
14278
14280 return 0;
14281}
14282
14284{
14285 HRESULT hr;
14286 HANDLE thread;
14287
14288 hr = CoInitialize( NULL );
14289 ok( hr == S_OK, "failed to init com\n");
14290 if (hr != S_OK) return;
14291
14293 if (!is_clsid_supported(&CLSID_DOMDocument2, &IID_IXMLDOMDocument))
14294 {
14295 win_skip("DOMDocument2 is not supported. Skipping all tests.\n");
14297 return;
14298 }
14299
14302 test_domdoc();
14304 test_domnode();
14305 test_refs();
14306 test_create();
14308 test_get_text();
14317 test_XPath();
14320 test_xmlTypes();
14321 test_save();
14341 test_events();
14343 test_get_xml();
14352 test_load();
14353 test_dispex();
14360 test_put_data();
14365 test_url();
14372 test_xsltext();
14374
14375 if (is_clsid_supported(&CLSID_MXNamespaceManager40, &IID_IMXNamespaceManager))
14376 {
14379 }
14380
14381 /* We need to test test_indent in a seperate thread. This is to prevent regressions in multi-threaded
14382 applications where the default indentation is set (e.g. by setting xmlTreeIndentString) in the first
14383 thread but not for new threads, leading to the wrong indentation in subsequent threads. */
14387
14389}
basic_istream< char, char_traits< char > > istream
Definition: _iosfwd.h:120
#define isspace(c)
Definition: acclib.h:69
#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
#define assert(_expr)
Definition: assert.h:32
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:1972
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2802
_ACRTIMP size_t __cdecl strlen(const char *)
Definition: string.c:1592
_ACRTIMP int __cdecl strcmp(const char *, const char *)
Definition: string.c:3319
@ 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
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
struct _entityref entityref
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 PROCESS_INFORMATION pi
Definition: debugger.c:2303
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:13953
static void test_put_data(void)
Definition: domdoc.c:12826
static HRESULT WINAPI istream_Commit(IStream *iface, DWORD flags)
Definition: domdoc.c:318
static void test_xmlns_attribute(void)
Definition: domdoc.c:12458
static void test_get_xml(void)
Definition: domdoc.c:9217
static void test_put_nodeValue(void)
Definition: domdoc.c:7405
static int g_expectedcall
Definition: domdoc.c:71
#define create_cache(iid)
Definition: domdoc.c:1218
static const char namespacesA[]
Definition: domdoc.c:12508
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:8155
static HRESULT WINAPI response_get_Status(IResponse *iface, BSTR *pbstrStatusRet)
Definition: domdoc.c:480
static void test_getQualifiedItem(void)
Definition: domdoc.c:7967
static const CHAR szTransformXML[]
Definition: domdoc.c:884
static IResponse testresponse
Definition: domdoc.c:672
static void test_whitespace(void)
Definition: domdoc.c:4794
static const char win936xml[]
Definition: domdoc.c:797
static HRESULT WINAPI sp_QueryService(IServiceProvider *iface, REFGUID service, REFIID iid, void **ppv)
Definition: domdoc.c:14010
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:8591
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:7947
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:9986
#define expect_node(node, expstr)
Definition: domdoc.c:1395
static void test_appendChild(void)
Definition: domdoc.c:9941
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:14000
static void test_getAttribute(void)
Definition: domdoc.c:12176
static const CHAR szEmailXML_0D[]
Definition: domdoc.c:1014
static const node_value_t nodevalue_test[]
Definition: domdoc.c:12402
#define helper_expect_list_and_release(list, expstr)
Definition: domdoc.c:4646
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:10085
static const IResponseVtbl testresponsevtbl
Definition: domdoc.c:630
static void test_save(void)
Definition: domdoc.c:6591
static void _test_IObjectSafety_set(unsigned line, IObjectSafety *safety, HRESULT result, HRESULT result2, DWORD set, DWORD mask, DWORD expected, DWORD expected2)
Definition: domdoc.c:4189
static const property_test_t properties_test_data[]
Definition: domdoc.c:7526
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:12532
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:14029
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:10810
static HRESULT WINAPI response_put_CodePage(IResponse *iface, LONG codepage)
Definition: domdoc.c:612
static void test_get_ownerDocument(void)
Definition: domdoc.c:8225
static void test_setAttributeNode(void)
Definition: domdoc.c:8357
static void test_refs(void)
Definition: domdoc.c:2645
static const struct namespaces_change_t namespaces_change_test_data[]
Definition: domdoc.c:6813
static HRESULT WINAPI sp_QueryInterface(IServiceProvider *iface, REFIID iid, void **ppv)
Definition: domdoc.c:13982
#define helper_ole_check_ver(expr)
Definition: domdoc.c:4641
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:7636
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:14271
#define create_document_version(v, iid)
Definition: domdoc.c:1217
static void test_validate_on_parse_values(void)
Definition: domdoc.c:14105
static ULONG WINAPI sp_Release(IServiceProvider *iface)
Definition: domdoc.c:14005
static char * list_to_string(IXMLDOMNodeList *list)
Definition: domdoc.c:1365
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:11124
static int get_node_position(IXMLDOMNode *node)
Definition: domdoc.c:1295
static void test_nodeValue(void)
Definition: domdoc.c:12414
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:8704
#define DECL_GBK
Definition: domdoc.c:780
static void test_put_dataType(void)
Definition: domdoc.c:6499
#define set_props(doc, cache)
Definition: domdoc.c:8183
static const CHAR szEmailXML_20[]
Definition: domdoc.c:1148
static void test_transformNodeToObject(void)
Definition: domdoc.c:13589
static const namespace_as_attribute_t namespace_as_attribute_test_data[]
Definition: domdoc.c:13772
static const ns_item_t named_item_tests[]
Definition: domdoc.c:7958
static void test_mxnamespacemanager(void)
Definition: domdoc.c:11176
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:10197
static void test_testTransforms(void)
Definition: domdoc.c:6769
static const validate_on_parse_test_t validate_on_parse_tests[]
Definition: domdoc.c:14094
#define helper_expect_bstr_and_release(bstr, str)
Definition: domdoc.c:4652
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:13731
static void test_domnode(void)
Definition: domdoc.c:2213
static void test_nodeTypedValue(void)
Definition: domdoc.c:7075
static const char xsltext_xsl[]
Definition: domdoc.c:13308
#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:8184
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:12123
static struct attrtest_t attrtests[]
Definition: domdoc.c:13385
static const struct whitespace_t whitespace_test_data[]
Definition: domdoc.c:4784
static void _unset_props(int line, IXMLDOMDocument2 *doc)
Definition: domdoc.c:8207
static put_datatype_t put_datatype_data[]
Definition: domdoc.c:6458
static void test_normalize_attribute_values(void)
Definition: domdoc.c:13693
static void test_namespaces_change(void)
Definition: domdoc.c:6823
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:13577
static void test_IObjectSafety(void)
Definition: domdoc.c:7493
static void test_namespaces_as_attributes(void)
Definition: domdoc.c:13781
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:4659
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:7024
static const DOMNodeType put_data_types[]
Definition: domdoc.c:12818
static void _test_doc_load_from_path(IXMLDOMDocument *doc, const char *path, HRESULT expected_hr, VARIANT_BOOL expected_ret, int line)
Definition: domdoc.c:10827
static HRESULT WINAPI response_AddHeader(IResponse *iface, BSTR bstrHeaderName, BSTR bstrHeaderValue)
Definition: domdoc.c:498
static void test_cloneNode(void)
Definition: domdoc.c:5372
static void test_insertBefore(void)
Definition: domdoc.c:9560
static const get_attributes_t get_attributes[]
Definition: domdoc.c:10186
static void test_supporterrorinfo(void)
Definition: domdoc.c:12243
static void test_newline_normalization(void)
Definition: domdoc.c:12932
static ULONG WINAPI transformdest_AddRef(IUnknown *iface)
Definition: domdoc.c:13572
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:4225
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:4735
static void test_parseerror(void)
Definition: domdoc.c:12087
static HRESULT WINAPI response_put_ExpiresAbsolute(IResponse *iface, DATE dtExpires)
Definition: domdoc.c:468
static const DOMNodeType nodetypes_test[]
Definition: domdoc.c:11670
static HRESULT WINAPI response_GetTypeInfoCount(IResponse *iface, UINT *count)
Definition: domdoc.c:400
#define unset_props(doc)
Definition: domdoc.c:8206
static void test_createNode(void)
Definition: domdoc.c:8503
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:8837
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:13954
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:13473
static const xslpattern_test_t xslpattern_test[]
Definition: domdoc.c:7572
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:7645
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:5520
static const CHAR szEmailXML_17[]
Definition: domdoc.c:1117
#define check_default_props(doc)
Definition: domdoc.c:8129
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:5013
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:13341
static const node_type_t get_datatype[]
Definition: domdoc.c:10073
static const char omitxmldecl_xsl[]
Definition: domdoc.c:13321
static HRESULT WINAPI response_put_CacheControl(IResponse *iface, BSTR bstrCacheControl)
Definition: domdoc.c:600
static void test_putref_schemas(void)
Definition: domdoc.c:13072
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:13969
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:6490
static HRESULT WINAPI response_get_ExpiresAbsolute(IResponse *iface, VARIANT *pvarExpiresRet)
Definition: domdoc.c:462
static void test_mxnamespacemanager_override(void)
Definition: domdoc.c:11564
#define TEST_DOC_LOAD_FROM_PATH(doc, path, expected_hr, expected_ret)
Definition: domdoc.c:10825
static void test_indent(void)
Definition: domdoc.c:14237
#define create_document(iid)
Definition: domdoc.c:1216
static void test_namedmap_newenum(void)
Definition: domdoc.c:13146
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:9333
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:13492
static void test_load(void)
Definition: domdoc.c:10887
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:4188
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:4658
#define SZ_EMAIL_DTD
Definition: domdoc.c:978
static void test_load_with_site(void)
Definition: domdoc.c:14039
static void test_default_properties(void)
Definition: domdoc.c:7535
static const CHAR szEmailXML_13[]
Definition: domdoc.c:1059
static const char xsd_schema1_uri[]
Definition: domdoc.c:12518
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:13397
#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:4944
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:10140
static void _check_default_props(int line, IXMLDOMDocument2 *doc)
Definition: domdoc.c:8130
static void test_IXMLDOMDocument2(void)
Definition: domdoc.c:4321
static void test_events(void)
Definition: domdoc.c:8768
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:10128
static void test_put_nodeTypedValue(void)
Definition: domdoc.c:9005
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:13956
static const supporterror_t supporterror_test[]
Definition: domdoc.c:12232
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:8156
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:14037
static const IUnknownVtbl transformdestvtbl
Definition: domdoc.c:13582
static const struct queryresult_t elementsbytagname[]
Definition: domdoc.c:3396
static void test_removeQualifiedItem(void)
Definition: domdoc.c:8068
static const CHAR szEmailXML_16[]
Definition: domdoc.c:1102
static const char get_prefix_doc[]
Definition: domdoc.c:8587
static void test_selection(void)
Definition: domdoc.c:10490
static const char iso8859_1_xml[]
Definition: domdoc.c:790
static void test_get_tagName(void)
Definition: domdoc.c:10030
static const char omitxmldecl_doc[]
Definition: domdoc.c:13334
static const char * strip_spaces(const char *str)
Definition: domdoc.c:7057
static void url_forward_slash(char *url)
Definition: domdoc.c:10875
static HRESULT WINAPI response_Redirect(IResponse *iface, BSTR bstrURL)
Definition: domdoc.c:552
static const char xsd_schema1_xml[]
Definition: domdoc.c:12519
static void test_FormattingXML(void)
Definition: domdoc.c:6981
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:6888
static void _check_ws_preserved(int line, const char *ver, IXMLDOMDocument2 *doc, char const *str)
Definition: domdoc.c:4697
#define check_ws_preserved(ver, doc, str)
Definition: domdoc.c:4696
static void test_splitText(void)
Definition: domdoc.c:7823
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:13557
static void test_dispex(void)
Definition: domdoc.c:11683
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:4978
#define test_IObjectSafety_common(s)
Definition: domdoc.c:4224
static void test_XSLPattern(void)
Definition: domdoc.c:7671
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:7321
static const IDispatchVtbl dispeventVtbl
Definition: domdoc.c:242
#define XML_E_INVALIDATROOTLEVEL
Definition: xmldoc.c:33
static void get_class_support_data(void)
Definition: saxreader.c:52
static char * dest
Definition: rtl.c:135
static LPOLESTR
Definition: stg_prop.c:27
static ICollection collection
Definition: typelib.c:184
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
enum tagDOMNodeType DOMNodeType
@ NODE_ENTITY_REFERENCE
Definition: msxml6.idl:117
@ NODE_TEXT
Definition: msxml6.idl:115
@ NODE_PROCESSING_INSTRUCTION
Definition: msxml6.idl:119
@ NODE_DOCUMENT_TYPE
Definition: msxml6.idl:122
@ NODE_ENTITY
Definition: msxml6.idl:118
@ NODE_ATTRIBUTE
Definition: msxml6.idl:114
@ NODE_DOCUMENT
Definition: msxml6.idl:121
@ NODE_DOCUMENT_FRAGMENT
Definition: msxml6.idl:123
@ NODE_COMMENT
Definition: msxml6.idl:120
@ NODE_ELEMENT
Definition: msxml6.idl:113
@ NODE_CDATA_SECTION
Definition: msxml6.idl:116
@ NODE_NOTATION
Definition: msxml6.idl:124
HRESULT node_clone(xmlnode *, VARIANT_BOOL, IXMLDOMNode **)
Definition: node.c:679
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
#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 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:10182
const char * string
Definition: domdoc.c:10125
DOMNodeType type
Definition: domdoc.c:10124
const char * value
Definition: domdoc.c:7020
const char * name
Definition: domdoc.c:7018
VARTYPE type
Definition: domdoc.c:7019
const GUID * guid
Definition: domdoc.c:7520
const char * value
Definition: domdoc.c:7523
const char * clsid
Definition: domdoc.c:7521
const char * property
Definition: domdoc.c:7522
Definition: undname.c:54
Definition: cookie.c:202
const char * prefix
Definition: domdoc.c:13381
const char * name
Definition: domdoc.c:13379
const char * href
Definition: domdoc.c:13382
const char * uri
Definition: domdoc.c:13380
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: domdoc.c:111
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:6809
const char * name
Definition: domdoc.c:6810
HRESULT hr
Definition: domdoc.c:10070
DOMNodeType type
Definition: domdoc.c:10067
VARTYPE vt
Definition: domdoc.c:10069
const char * name
Definition: domdoc.c:10068
HRESULT get_hr
Definition: domdoc.c:12399
const char * put_content
Definition: domdoc.c:12396
const char * name
Definition: domdoc.c:12395
HRESULT put_hr
Definition: domdoc.c:12397
VARTYPE get_vt
Definition: domdoc.c:12398
DOMNodeType type
Definition: domdoc.c:12394
const char * uri
Definition: domdoc.c:7942
const char * name
Definition: domdoc.c:7941
HRESULT hr
Definition: domdoc.c:7943
DOMNodeType type
Definition: domdoc.c:6486
const char * name
Definition: domdoc.c:6451
HRESULT hr
Definition: domdoc.c:6453
const char * type
Definition: domdoc.c:6452
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:4940
const char * name
Definition: domdoc.c:4938
const GUID * clsid
Definition: domdoc.c:4937
const char * ns
Definition: domdoc.c:4939
Definition: parse.h:23
DOMNodeType type
Definition: domdoc.c:12227
const char * name
Definition: domdoc.c:12228
const WCHAR * name
Definition: ecma_167.h:138
const CLSID * clsid
Definition: domdoc.c:4780
const char * name
Definition: domdoc.c:4781
const char * list
Definition: domdoc.c:4975
const char * query
Definition: domdoc.c:4974
const char * query
Definition: domdoc.c:7567
const char * list
Definition: domdoc.c:7568
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,...)
__wchar_t WCHAR
Definition: xmlstorage.h:180
char CHAR
Definition: xmlstorage.h:175
unsigned char BYTE
Definition: xxhash.c:193