Module: wine Branch: master Commit: 65e62c33087a51c8e285c0ab0039999013b2de88 URL: http://source.winehq.org/git/wine.git/?a=commit;h=65e62c33087a51c8e285c0ab00...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Thu Mar 9 07:14:10 2017 +0300
xmllite/reader: Fix reader position returned for xml declaration node.
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/xmllite/reader.c | 23 +++++++++++++++++++---- dlls/xmllite/tests/reader.c | 3 +-- 2 files changed, 20 insertions(+), 6 deletions(-)
diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c index 07330f5..28da5e1 100644 --- a/dlls/xmllite/reader.c +++ b/dlls/xmllite/reader.c @@ -281,7 +281,8 @@ typedef struct UINT depth; UINT max_depth; BOOL is_empty_element; - struct element empty_element; + struct element empty_element; /* used for empty elements without end tag <a />, + and to keep <?xml reader position */ UINT resume[XmlReadResume_Last]; /* offsets used to resume reader */ } xmlreader;
@@ -1294,12 +1295,16 @@ static HRESULT reader_parse_xmldecl(xmlreader *reader) { static const WCHAR xmldeclW[] = {'<','?','x','m','l',' ',0}; static const WCHAR declcloseW[] = {'?','>',0}; + struct reader_position position; HRESULT hr;
/* check if we have "<?xml " */ - if (reader_cmp(reader, xmldeclW)) return S_FALSE; + if (reader_cmp(reader, xmldeclW)) + return S_FALSE;
- reader_skipn(reader, 5); + reader_skipn(reader, 2); + position = reader->position; + reader_skipn(reader, 3); hr = reader_parse_versioninfo(reader); if (FAILED(hr)) return hr; @@ -1313,10 +1318,14 @@ static HRESULT reader_parse_xmldecl(xmlreader *reader) return hr;
reader_skipspaces(reader); - if (reader_cmp(reader, declcloseW)) return WC_E_XMLDECL; + if (reader_cmp(reader, declcloseW)) + return WC_E_XMLDECL; + + /* skip '?>' */ reader_skipn(reader, 2);
reader->nodetype = XmlNodeType_XmlDeclaration; + reader->empty_element.position = position; reader_set_strvalue(reader, StringValue_LocalName, &strval_xml); reader_set_strvalue(reader, StringValue_QualifiedName, &strval_xml); reader_set_strvalue(reader, StringValue_Value, &strval_empty); @@ -3291,6 +3300,9 @@ static HRESULT WINAPI xmlreader_GetLineNumber(IXmlReader* iface, UINT *line_numb case XmlNodeType_Attribute: *line_number = This->attr->position.line_number; break; + case XmlNodeType_XmlDeclaration: + *line_number = This->empty_element.position.line_number; + break; default: *line_number = This->position.line_number; break; @@ -3323,6 +3335,9 @@ static HRESULT WINAPI xmlreader_GetLinePosition(IXmlReader* iface, UINT *line_po case XmlNodeType_Attribute: *line_position = This->attr->position.line_position; break; + case XmlNodeType_XmlDeclaration: + *line_position = This->empty_element.position.line_position; + break; default: *line_position = This->position.line_position; break; diff --git a/dlls/xmllite/tests/reader.c b/dlls/xmllite/tests/reader.c index d09316a..208e4be 100644 --- a/dlls/xmllite/tests/reader.c +++ b/dlls/xmllite/tests/reader.c @@ -760,7 +760,6 @@ static void test_read_xmldeclaration(void) ok(type == XmlNodeType_XmlDeclaration, "Expected XmlNodeType_XmlDeclaration, got %s\n", type_to_str(type)); /* new version 1.2.x and 1.3.x properly update position for <?xml ?> */ -todo_wine TEST_READER_POSITION2(reader, 1, 3, ~0u, 55);
TEST_DEPTH(reader, 0); @@ -829,6 +828,7 @@ todo_wine
hr = IXmlReader_MoveToElement(reader); ok(hr == S_OK, "got %08x\n", hr); + TEST_READER_POSITION2(reader, 1, 3, ~0u, 55);
type = XmlNodeType_None; hr = IXmlReader_GetNodeType(reader, &type); @@ -855,7 +855,6 @@ todo_wine { hr = IXmlReader_Read(reader, &type); ok(hr == S_OK, "expected S_OK, got %08x\n", hr); ok(type == XmlNodeType_XmlDeclaration, "expected XmlDeclaration, got %s\n", type_to_str(type)); -todo_wine TEST_READER_POSITION2(reader, 1, 3, ~0u, 21); TEST_READER_STATE(reader, XmlReadState_Interactive);