Commit 65e62c33 authored by Nikolay Sivov's avatar Nikolay Sivov Committed by Alexandre Julliard

xmllite/reader: Fix reader position returned for xml declaration node.

parent 6cf9524f
...@@ -281,7 +281,8 @@ typedef struct ...@@ -281,7 +281,8 @@ typedef struct
UINT depth; UINT depth;
UINT max_depth; UINT max_depth;
BOOL is_empty_element; 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 */ UINT resume[XmlReadResume_Last]; /* offsets used to resume reader */
} xmlreader; } xmlreader;
...@@ -1294,12 +1295,16 @@ static HRESULT reader_parse_xmldecl(xmlreader *reader) ...@@ -1294,12 +1295,16 @@ static HRESULT reader_parse_xmldecl(xmlreader *reader)
{ {
static const WCHAR xmldeclW[] = {'<','?','x','m','l',' ',0}; static const WCHAR xmldeclW[] = {'<','?','x','m','l',' ',0};
static const WCHAR declcloseW[] = {'?','>',0}; static const WCHAR declcloseW[] = {'?','>',0};
struct reader_position position;
HRESULT hr; HRESULT hr;
/* check if we have "<?xml " */ /* 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); hr = reader_parse_versioninfo(reader);
if (FAILED(hr)) if (FAILED(hr))
return hr; return hr;
...@@ -1313,10 +1318,14 @@ static HRESULT reader_parse_xmldecl(xmlreader *reader) ...@@ -1313,10 +1318,14 @@ static HRESULT reader_parse_xmldecl(xmlreader *reader)
return hr; return hr;
reader_skipspaces(reader); 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_skipn(reader, 2);
reader->nodetype = XmlNodeType_XmlDeclaration; reader->nodetype = XmlNodeType_XmlDeclaration;
reader->empty_element.position = position;
reader_set_strvalue(reader, StringValue_LocalName, &strval_xml); reader_set_strvalue(reader, StringValue_LocalName, &strval_xml);
reader_set_strvalue(reader, StringValue_QualifiedName, &strval_xml); reader_set_strvalue(reader, StringValue_QualifiedName, &strval_xml);
reader_set_strvalue(reader, StringValue_Value, &strval_empty); reader_set_strvalue(reader, StringValue_Value, &strval_empty);
...@@ -3291,6 +3300,9 @@ static HRESULT WINAPI xmlreader_GetLineNumber(IXmlReader* iface, UINT *line_numb ...@@ -3291,6 +3300,9 @@ static HRESULT WINAPI xmlreader_GetLineNumber(IXmlReader* iface, UINT *line_numb
case XmlNodeType_Attribute: case XmlNodeType_Attribute:
*line_number = This->attr->position.line_number; *line_number = This->attr->position.line_number;
break; break;
case XmlNodeType_XmlDeclaration:
*line_number = This->empty_element.position.line_number;
break;
default: default:
*line_number = This->position.line_number; *line_number = This->position.line_number;
break; break;
...@@ -3323,6 +3335,9 @@ static HRESULT WINAPI xmlreader_GetLinePosition(IXmlReader* iface, UINT *line_po ...@@ -3323,6 +3335,9 @@ static HRESULT WINAPI xmlreader_GetLinePosition(IXmlReader* iface, UINT *line_po
case XmlNodeType_Attribute: case XmlNodeType_Attribute:
*line_position = This->attr->position.line_position; *line_position = This->attr->position.line_position;
break; break;
case XmlNodeType_XmlDeclaration:
*line_position = This->empty_element.position.line_position;
break;
default: default:
*line_position = This->position.line_position; *line_position = This->position.line_position;
break; break;
......
...@@ -760,7 +760,6 @@ static void test_read_xmldeclaration(void) ...@@ -760,7 +760,6 @@ static void test_read_xmldeclaration(void)
ok(type == XmlNodeType_XmlDeclaration, ok(type == XmlNodeType_XmlDeclaration,
"Expected XmlNodeType_XmlDeclaration, got %s\n", type_to_str(type)); "Expected XmlNodeType_XmlDeclaration, got %s\n", type_to_str(type));
/* new version 1.2.x and 1.3.x properly update position for <?xml ?> */ /* 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_READER_POSITION2(reader, 1, 3, ~0u, 55);
TEST_DEPTH(reader, 0); TEST_DEPTH(reader, 0);
...@@ -829,6 +828,7 @@ todo_wine ...@@ -829,6 +828,7 @@ todo_wine
hr = IXmlReader_MoveToElement(reader); hr = IXmlReader_MoveToElement(reader);
ok(hr == S_OK, "got %08x\n", hr); ok(hr == S_OK, "got %08x\n", hr);
TEST_READER_POSITION2(reader, 1, 3, ~0u, 55);
type = XmlNodeType_None; type = XmlNodeType_None;
hr = IXmlReader_GetNodeType(reader, &type); hr = IXmlReader_GetNodeType(reader, &type);
...@@ -855,7 +855,6 @@ todo_wine { ...@@ -855,7 +855,6 @@ todo_wine {
hr = IXmlReader_Read(reader, &type); hr = IXmlReader_Read(reader, &type);
ok(hr == S_OK, "expected S_OK, got %08x\n", hr); ok(hr == S_OK, "expected S_OK, got %08x\n", hr);
ok(type == XmlNodeType_XmlDeclaration, "expected XmlDeclaration, got %s\n", type_to_str(type)); 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_POSITION2(reader, 1, 3, ~0u, 21);
TEST_READER_STATE(reader, XmlReadState_Interactive); TEST_READER_STATE(reader, XmlReadState_Interactive);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment