Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
c48b7566
Commit
c48b7566
authored
Mar 13, 2011
by
Nikolay Sivov
Committed by
Alexandre Julliard
Mar 14, 2011
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
msxml3: Unlink node first before adding it as a child.
parent
81f2a237
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
146 additions
and
12 deletions
+146
-12
node.c
dlls/msxml3/node.c
+2
-0
domdoc.c
dlls/msxml3/tests/domdoc.c
+144
-12
No files found.
dlls/msxml3/node.c
View file @
c48b7566
...
...
@@ -354,6 +354,8 @@ HRESULT node_insert_before(xmlnode *This, IXMLDOMNode *new_child, const VARIANT
}
doc
=
node_obj
->
node
->
doc
;
xmldoc_add_ref
(
This
->
node
->
doc
);
/* xmlAddChild doesn't unlink node from previous parent */
xmlUnlinkNode
(
node_obj
->
node
);
xmlAddChild
(
This
->
node
,
node_obj
->
node
);
xmldoc_release
(
doc
);
node_obj
->
parent
=
This
->
iface
;
...
...
dlls/msxml3/tests/domdoc.c
View file @
c48b7566
...
...
@@ -4,6 +4,7 @@
* Copyright 2005 Mike McCormack for CodeWeavers
* Copyright 2007-2008 Alistair Leslie-Hughes
* Copyright 2010 Adam Martinson for CodeWeavers
* Copyright 2010-2011 Nikolay Sivov for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
...
...
@@ -180,6 +181,21 @@ static void _expect_ref(IUnknown* obj, ULONG ref, int line)
ok_
(
__FILE__
,
line
)(
rc
-
1
==
ref
,
"expected refcount %d, got %d
\n
"
,
ref
,
rc
-
1
);
}
#define EXPECT_LIST_LEN(list,len) _expect_list_len(list, len, __LINE__)
static
void
_expect_list_len
(
IXMLDOMNodeList
*
list
,
LONG
len
,
int
line
)
{
LONG
length
;
HRESULT
hr
;
length
=
0
;
hr
=
IXMLDOMNodeList_get_length
(
list
,
&
length
);
ok_
(
__FILE__
,
line
)(
hr
==
S_OK
,
"got 0x%08x
\n
"
,
hr
);
ok_
(
__FILE__
,
line
)(
length
==
len
,
"got %d, expected %d
\n
"
,
length
,
len
);
}
#define EXPECT_HR(hr,hr_exp) \
ok(hr == hr_exp, "got 0x%08x, expected 0x%08x\n", hr, hr_exp)
static
const
WCHAR
szEmpty
[]
=
{
0
};
static
const
WCHAR
szIncomplete
[]
=
{
'<'
,
'?'
,
'x'
,
'm'
,
'l'
,
' '
,
...
...
@@ -3985,32 +4001,46 @@ static void test_XPath(void)
VARIANT
var
;
VARIANT_BOOL
b
;
IXMLDOMDocument2
*
doc
;
IXMLDOMDocument
*
doc2
;
IXMLDOMNode
*
rootNode
;
IXMLDOMNode
*
elem1Node
;
IXMLDOMNode
*
node
;
IXMLDOMNodeList
*
list
;
IXMLDOMElement
*
elem
;
IXMLDOMAttribute
*
attr
;
HRESULT
hr
;
BSTR
str
;
doc
=
create_document
(
&
IID_IXMLDOMDocument2
);
if
(
!
doc
)
return
;
ole_check
(
IXMLDOMDocument_loadXML
(
doc
,
_bstr_
(
szExampleXML
),
&
b
));
ole_check
(
IXMLDOMDocument
2
_loadXML
(
doc
,
_bstr_
(
szExampleXML
),
&
b
));
ok
(
b
==
VARIANT_TRUE
,
"failed to load XML string
\n
"
);
/* switch to XPath */
ole_check
(
IXMLDOMDocument2_setProperty
(
doc
,
_bstr_
(
"SelectionLanguage"
),
_variantbstr_
(
"XPath"
)));
/* some simple queries*/
ole_check
(
IXMLDOMDocument_selectNodes
(
doc
,
_bstr_
(
"root"
),
&
list
));
ole_check
(
IXMLDOMNodeList_get_item
(
list
,
0
,
&
rootNode
));
ole_check
(
IXMLDOMNodeList_reset
(
list
));
EXPECT_REF
(
doc
,
1
);
hr
=
IXMLDOMDocument2_selectNodes
(
doc
,
_bstr_
(
"root"
),
&
list
);
EXPECT_HR
(
hr
,
S_OK
);
EXPECT_REF
(
doc
,
1
);
EXPECT_LIST_LEN
(
list
,
1
);
EXPECT_REF
(
list
,
1
);
hr
=
IXMLDOMNodeList_get_item
(
list
,
0
,
&
rootNode
);
EXPECT_HR
(
hr
,
S_OK
);
EXPECT_REF
(
list
,
1
);
EXPECT_REF
(
rootNode
,
1
);
hr
=
IXMLDOMNodeList_reset
(
list
);
EXPECT_HR
(
hr
,
S_OK
);
expect_list_and_release
(
list
,
"E2.D1"
);
if
(
rootNode
==
NULL
)
return
;
ole_check
(
IXMLDOMDocument_selectNodes
(
doc
,
_bstr_
(
"root//c"
),
&
list
));
ole_check
(
IXMLDOMDocument
2
_selectNodes
(
doc
,
_bstr_
(
"root//c"
),
&
list
));
expect_list_and_release
(
list
,
"E3.E1.E2.D1 E3.E2.E2.D1"
);
ole_check
(
IXMLDOMDocument_selectNodes
(
doc
,
_bstr_
(
"//c[@type]"
),
&
list
));
ole_check
(
IXMLDOMDocument
2
_selectNodes
(
doc
,
_bstr_
(
"//c[@type]"
),
&
list
));
expect_list_and_release
(
list
,
"E3.E2.E2.D1"
);
ole_check
(
IXMLDOMNode_selectNodes
(
rootNode
,
_bstr_
(
"elem"
),
&
list
));
...
...
@@ -4054,7 +4084,7 @@ static void test_XPath(void)
expect_list_and_release
(
list
,
""
);
/* foo undeclared in document node */
ole_expect
(
IXMLDOMDocument_selectNodes
(
doc
,
_bstr_
(
"root//foo:c"
),
&
list
),
E_FAIL
);
ole_expect
(
IXMLDOMDocument
2
_selectNodes
(
doc
,
_bstr_
(
"root//foo:c"
),
&
list
),
E_FAIL
);
/* undeclared in <root> node */
ole_expect
(
IXMLDOMNode_selectNodes
(
rootNode
,
_bstr_
(
".//foo:c"
),
&
list
),
E_FAIL
);
/* undeclared in <elem> node */
...
...
@@ -4068,7 +4098,7 @@ static void test_XPath(void)
_variantbstr_
(
"xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'"
)));
/* now the namespace can be used */
ole_check
(
IXMLDOMDocument_selectNodes
(
doc
,
_bstr_
(
"root//test:c"
),
&
list
));
ole_check
(
IXMLDOMDocument
2
_selectNodes
(
doc
,
_bstr_
(
"root//test:c"
),
&
list
));
expect_list_and_release
(
list
,
"E3.E3.E2.D1 E3.E4.E2.D1"
);
ole_check
(
IXMLDOMNode_selectNodes
(
rootNode
,
_bstr_
(
".//test:c"
),
&
list
));
expect_list_and_release
(
list
,
"E3.E3.E2.D1 E3.E4.E2.D1"
);
...
...
@@ -4081,7 +4111,7 @@ static void test_XPath(void)
ole_expect
(
IXMLDOMDocument2_setProperty
(
doc
,
_bstr_
(
"SelectionNamespaces"
),
_variantbstr_
(
"xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29' xmlns:foo=###"
)),
E_FAIL
);
ole_expect
(
IXMLDOMDocument_selectNodes
(
doc
,
_bstr_
(
"root//foo:c"
),
&
list
),
E_FAIL
);
ole_expect
(
IXMLDOMDocument
2
_selectNodes
(
doc
,
_bstr_
(
"root//foo:c"
),
&
list
),
E_FAIL
);
VariantInit
(
&
var
);
ole_check
(
IXMLDOMDocument2_getProperty
(
doc
,
_bstr_
(
"SelectionNamespaces"
),
&
var
));
...
...
@@ -4096,7 +4126,109 @@ static void test_XPath(void)
IXMLDOMNode_Release
(
rootNode
);
IXMLDOMNode_Release
(
elem1Node
);
IXMLDOMDocument_Release
(
doc
);
/* alter document with already built list */
hr
=
IXMLDOMDocument2_selectNodes
(
doc
,
_bstr_
(
"root"
),
&
list
);
EXPECT_HR
(
hr
,
S_OK
);
EXPECT_LIST_LEN
(
list
,
1
);
hr
=
IXMLDOMDocument2_get_lastChild
(
doc
,
&
rootNode
);
EXPECT_HR
(
hr
,
S_OK
);
EXPECT_REF
(
rootNode
,
1
);
EXPECT_REF
(
doc
,
1
);
hr
=
IXMLDOMDocument2_removeChild
(
doc
,
rootNode
,
NULL
);
EXPECT_HR
(
hr
,
S_OK
);
IXMLDOMNode_Release
(
rootNode
);
EXPECT_LIST_LEN
(
list
,
1
);
hr
=
IXMLDOMNodeList_get_item
(
list
,
0
,
&
rootNode
);
EXPECT_HR
(
hr
,
S_OK
);
EXPECT_REF
(
rootNode
,
1
);
IXMLDOMNodeList_Release
(
list
);
hr
=
IXMLDOMNode_get_nodeName
(
rootNode
,
&
str
);
EXPECT_HR
(
hr
,
S_OK
);
ok
(
!
lstrcmpW
(
str
,
_bstr_
(
"root"
)),
"got %s
\n
"
,
wine_dbgstr_w
(
str
));
SysFreeString
(
str
);
IXMLDOMNode_Release
(
rootNode
);
/* alter node from list and get it another time */
hr
=
IXMLDOMDocument2_loadXML
(
doc
,
_bstr_
(
szExampleXML
),
&
b
);
EXPECT_HR
(
hr
,
S_OK
);
ok
(
b
==
VARIANT_TRUE
,
"failed to load XML string
\n
"
);
hr
=
IXMLDOMDocument2_selectNodes
(
doc
,
_bstr_
(
"root"
),
&
list
);
EXPECT_HR
(
hr
,
S_OK
);
EXPECT_LIST_LEN
(
list
,
1
);
hr
=
IXMLDOMNodeList_get_item
(
list
,
0
,
&
rootNode
);
EXPECT_HR
(
hr
,
S_OK
);
hr
=
IXMLDOMNode_QueryInterface
(
rootNode
,
&
IID_IXMLDOMElement
,
(
void
**
)
&
elem
);
EXPECT_HR
(
hr
,
S_OK
);
V_VT
(
&
var
)
=
VT_I2
;
V_I2
(
&
var
)
=
1
;
hr
=
IXMLDOMElement_setAttribute
(
elem
,
_bstr_
(
"attrtest"
),
var
);
EXPECT_HR
(
hr
,
S_OK
);
IXMLDOMElement_Release
(
elem
);
IXMLDOMNode_Release
(
rootNode
);
/* now check attribute to be present */
hr
=
IXMLDOMNodeList_get_item
(
list
,
0
,
&
rootNode
);
EXPECT_HR
(
hr
,
S_OK
);
hr
=
IXMLDOMNode_QueryInterface
(
rootNode
,
&
IID_IXMLDOMElement
,
(
void
**
)
&
elem
);
EXPECT_HR
(
hr
,
S_OK
);
hr
=
IXMLDOMElement_getAttributeNode
(
elem
,
_bstr_
(
"attrtest"
),
&
attr
);
EXPECT_HR
(
hr
,
S_OK
);
IXMLDOMAttribute_Release
(
attr
);
IXMLDOMElement_Release
(
elem
);
IXMLDOMNode_Release
(
rootNode
);
/* and now check for attribute in original document */
hr
=
IXMLDOMDocument_get_documentElement
(
doc
,
&
elem
);
EXPECT_HR
(
hr
,
S_OK
);
hr
=
IXMLDOMElement_getAttributeNode
(
elem
,
_bstr_
(
"attrtest"
),
&
attr
);
EXPECT_HR
(
hr
,
S_OK
);
IXMLDOMAttribute_Release
(
attr
);
IXMLDOMElement_Release
(
elem
);
/* attach node from list to another document */
doc2
=
create_document
(
&
IID_IXMLDOMDocument
);
hr
=
IXMLDOMDocument2_loadXML
(
doc
,
_bstr_
(
szExampleXML
),
&
b
);
EXPECT_HR
(
hr
,
S_OK
);
ok
(
b
==
VARIANT_TRUE
,
"failed to load XML string
\n
"
);
hr
=
IXMLDOMDocument2_selectNodes
(
doc
,
_bstr_
(
"root"
),
&
list
);
EXPECT_HR
(
hr
,
S_OK
);
EXPECT_LIST_LEN
(
list
,
1
);
hr
=
IXMLDOMNodeList_get_item
(
list
,
0
,
&
rootNode
);
EXPECT_HR
(
hr
,
S_OK
);
EXPECT_REF
(
rootNode
,
1
);
hr
=
IXMLDOMDocument_appendChild
(
doc2
,
rootNode
,
NULL
);
EXPECT_HR
(
hr
,
S_OK
);
EXPECT_REF
(
rootNode
,
1
);
EXPECT_REF
(
doc2
,
1
);
EXPECT_REF
(
list
,
1
);
EXPECT_LIST_LEN
(
list
,
1
);
IXMLDOMNode_Release
(
rootNode
);
IXMLDOMNodeList_Release
(
list
);
IXMLDOMDocument_Release
(
doc2
);
IXMLDOMDocument2_Release
(
doc
);
free_bstrs
();
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment