msxml3: Support 'namespace-prefixes' feature.
This commit is contained in:
parent
474791fd89
commit
4fb5872bd2
|
@ -1160,9 +1160,13 @@ static HRESULT SAXAttributes_populate(saxlocator *locator,
|
||||||
static const WCHAR xmlnsW[] = { 'x','m','l','n','s',0 };
|
static const WCHAR xmlnsW[] = { 'x','m','l','n','s',0 };
|
||||||
|
|
||||||
struct _attributes *attrs;
|
struct _attributes *attrs;
|
||||||
int index;
|
int i;
|
||||||
|
|
||||||
locator->nb_attributes = nb_namespaces+nb_attributes;
|
/* skip namespace definitions */
|
||||||
|
if ((locator->saxreader->features & NamespacePrefixes) == 0)
|
||||||
|
nb_namespaces = 0;
|
||||||
|
|
||||||
|
locator->nb_attributes = nb_namespaces + nb_attributes;
|
||||||
if(locator->nb_attributes > locator->attributesSize)
|
if(locator->nb_attributes > locator->attributesSize)
|
||||||
{
|
{
|
||||||
attrs = heap_realloc(locator->attributes, sizeof(struct _attributes)*locator->nb_attributes*2);
|
attrs = heap_realloc(locator->attributes, sizeof(struct _attributes)*locator->nb_attributes*2);
|
||||||
|
@ -1178,31 +1182,31 @@ static HRESULT SAXAttributes_populate(saxlocator *locator,
|
||||||
attrs = locator->attributes;
|
attrs = locator->attributes;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(index=0; index<nb_namespaces; index++)
|
for (i = 0; i < nb_namespaces; i++)
|
||||||
{
|
{
|
||||||
attrs[nb_attributes+index].szLocalname = SysAllocStringLen(NULL, 0);
|
attrs[nb_attributes+i].szLocalname = SysAllocStringLen(NULL, 0);
|
||||||
attrs[nb_attributes+index].szURI = locator->namespaceUri;
|
attrs[nb_attributes+i].szURI = locator->namespaceUri;
|
||||||
attrs[nb_attributes+index].szValue = bstr_from_xmlChar(xmlNamespaces[2*index+1]);
|
attrs[nb_attributes+i].szValue = bstr_from_xmlChar(xmlNamespaces[2*i+1]);
|
||||||
if(!xmlNamespaces[2*index])
|
if(!xmlNamespaces[2*i])
|
||||||
attrs[nb_attributes+index].szQName = SysAllocString(xmlnsW);
|
attrs[nb_attributes+i].szQName = SysAllocString(xmlnsW);
|
||||||
else
|
else
|
||||||
attrs[nb_attributes+index].szQName = QName_from_xmlChar(xmlns, xmlNamespaces[2*index]);
|
attrs[nb_attributes+i].szQName = QName_from_xmlChar(xmlns, xmlNamespaces[2*i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
for(index=0; index<nb_attributes; index++)
|
for (i = 0; i < nb_attributes; i++)
|
||||||
{
|
{
|
||||||
static const xmlChar xmlA[] = "xml";
|
static const xmlChar xmlA[] = "xml";
|
||||||
|
|
||||||
if (xmlStrEqual(xmlAttributes[index*5+1], xmlA))
|
if (xmlStrEqual(xmlAttributes[i*5+1], xmlA))
|
||||||
attrs[index].szURI = bstr_from_xmlChar(xmlAttributes[index*5+2]);
|
attrs[i].szURI = bstr_from_xmlChar(xmlAttributes[i*5+2]);
|
||||||
else
|
else
|
||||||
attrs[index].szURI = find_element_uri(locator, xmlAttributes[index*5+2]);
|
attrs[i].szURI = find_element_uri(locator, xmlAttributes[i*5+2]);
|
||||||
|
|
||||||
attrs[index].szLocalname = bstr_from_xmlChar(xmlAttributes[index*5]);
|
attrs[i].szLocalname = bstr_from_xmlChar(xmlAttributes[i*5]);
|
||||||
attrs[index].szValue = bstr_from_xmlCharN(xmlAttributes[index*5+3],
|
attrs[i].szValue = bstr_from_xmlCharN(xmlAttributes[i*5+3],
|
||||||
xmlAttributes[index*5+4]-xmlAttributes[index*5+3]);
|
xmlAttributes[i*5+4]-xmlAttributes[i*5+3]);
|
||||||
attrs[index].szQName = QName_from_xmlChar(xmlAttributes[index*5+1],
|
attrs[i].szQName = QName_from_xmlChar(xmlAttributes[i*5+1],
|
||||||
xmlAttributes[index*5]);
|
xmlAttributes[i*5]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
@ -2849,7 +2853,8 @@ static HRESULT WINAPI saxxmlreader_putFeature(
|
||||||
/* accepted cases */
|
/* accepted cases */
|
||||||
if ((feature == ExternalGeneralEntities && value == VARIANT_FALSE) ||
|
if ((feature == ExternalGeneralEntities && value == VARIANT_FALSE) ||
|
||||||
(feature == ExternalParameterEntities && value == VARIANT_FALSE) ||
|
(feature == ExternalParameterEntities && value == VARIANT_FALSE) ||
|
||||||
feature == Namespaces)
|
feature == Namespaces ||
|
||||||
|
feature == NamespacePrefixes)
|
||||||
{
|
{
|
||||||
return set_feature_value(This, feature, value);
|
return set_feature_value(This, feature, value);
|
||||||
}
|
}
|
||||||
|
|
|
@ -787,6 +787,50 @@ static struct call_entry content_handler_test_attributes_alternate_6[] = {
|
||||||
{ CH_ENDTEST }
|
{ CH_ENDTEST }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* 'namespaces' is on, 'namespace-prefixes' if off */
|
||||||
|
static struct attribute_entry ch_attributes_no_prefix[] = {
|
||||||
|
{ "prefix_test", "arg1", "test:arg1", "arg1" },
|
||||||
|
{ "", "arg2", "arg2", "arg2" },
|
||||||
|
{ "prefix_test", "ar3", "test:ar3", "arg3" },
|
||||||
|
{ NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct call_entry content_handler_test_attributes_alt_no_prefix[] = {
|
||||||
|
{ CH_PUTDOCUMENTLOCATOR, 1, 0, S_OK },
|
||||||
|
{ CH_STARTDOCUMENT, 1, 22, S_OK },
|
||||||
|
{ CH_STARTPREFIXMAPPING, 2, 95, S_OK, "test", "prefix_test" },
|
||||||
|
{ CH_STARTPREFIXMAPPING, 2, 95, S_OK, "", "prefix" },
|
||||||
|
{ CH_STARTELEMENT, 2, 95, S_OK, "prefix", "document", "document", ch_attributes_no_prefix },
|
||||||
|
{ CH_CHARACTERS, 3, 1, S_OK, "\n" },
|
||||||
|
{ CH_STARTPREFIXMAPPING, 3, 24, S_OK, "p", "test" },
|
||||||
|
{ CH_STARTELEMENT, 3, 24, S_OK, "prefix", "node1", "node1", NULL },
|
||||||
|
{ CH_ENDELEMENT, 3, 24, S_OK, "prefix", "node1", "node1" },
|
||||||
|
{ CH_ENDPREFIXMAPPING, 3, 24, S_OK, "p" },
|
||||||
|
{ CH_ENDELEMENT, 3, 35, S_OK, "prefix", "document", "document" },
|
||||||
|
{ CH_ENDPREFIXMAPPING, 3, 35, S_OK, "test" },
|
||||||
|
{ CH_ENDPREFIXMAPPING, 3, 35, S_OK, "" },
|
||||||
|
{ CH_ENDDOCUMENT, 4, 0, S_OK },
|
||||||
|
{ CH_ENDTEST }
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct call_entry content_handler_test_attributes_no_prefix[] = {
|
||||||
|
{ CH_PUTDOCUMENTLOCATOR, 0, 0, S_OK },
|
||||||
|
{ CH_STARTDOCUMENT, 0, 0, S_OK },
|
||||||
|
{ CH_STARTPREFIXMAPPING, 2, 96, S_OK, "test", "prefix_test" },
|
||||||
|
{ CH_STARTPREFIXMAPPING, 2, 96, S_OK, "", "prefix" },
|
||||||
|
{ CH_STARTELEMENT, 2, 96, S_OK, "prefix", "document", "document", ch_attributes_no_prefix },
|
||||||
|
{ CH_CHARACTERS, 2, 96, S_OK, "\n" },
|
||||||
|
{ CH_STARTPREFIXMAPPING, 3, 25, S_OK, "p", "test" },
|
||||||
|
{ CH_STARTELEMENT, 3, 25, S_OK, "prefix", "node1", "node1", NULL },
|
||||||
|
{ CH_ENDELEMENT, 3, 25, S_OK, "prefix", "node1", "node1" },
|
||||||
|
{ CH_ENDPREFIXMAPPING, 3, 25, S_OK, "p" },
|
||||||
|
{ CH_ENDELEMENT, 3, 27, S_OK, "prefix", "document", "document" },
|
||||||
|
{ CH_ENDPREFIXMAPPING, 3, 27, S_OK, "" },
|
||||||
|
{ CH_ENDPREFIXMAPPING, 3, 27, S_OK, "test" },
|
||||||
|
{ CH_ENDDOCUMENT, 0, 0 },
|
||||||
|
{ CH_ENDTEST }
|
||||||
|
};
|
||||||
|
|
||||||
static struct attribute_entry xmlspace_attrs[] = {
|
static struct attribute_entry xmlspace_attrs[] = {
|
||||||
{ "http://www.w3.org/XML/1998/namespace", "space", "xml:space", "preserve" },
|
{ "http://www.w3.org/XML/1998/namespace", "space", "xml:space", "preserve" },
|
||||||
{ NULL }
|
{ NULL }
|
||||||
|
@ -1765,12 +1809,12 @@ static void test_saxreader(void)
|
||||||
static const CHAR testXmlA[] = "test.xml";
|
static const CHAR testXmlA[] = "test.xml";
|
||||||
static const WCHAR testXmlW[] = {'t','e','s','t','.','x','m','l',0};
|
static const WCHAR testXmlW[] = {'t','e','s','t','.','x','m','l',0};
|
||||||
IXMLDOMDocument *doc;
|
IXMLDOMDocument *doc;
|
||||||
BSTR str;
|
|
||||||
VARIANT_BOOL v;
|
VARIANT_BOOL v;
|
||||||
|
|
||||||
while (table->clsid)
|
while (table->clsid)
|
||||||
{
|
{
|
||||||
struct call_entry *test_seq;
|
struct call_entry *test_seq;
|
||||||
|
BSTR str;
|
||||||
|
|
||||||
if (!is_clsid_supported(table->clsid, reader_support_data))
|
if (!is_clsid_supported(table->clsid, reader_support_data))
|
||||||
{
|
{
|
||||||
|
@ -1967,6 +2011,7 @@ static void test_saxreader(void)
|
||||||
str = SysAllocString(szSimpleXML);
|
str = SysAllocString(szSimpleXML);
|
||||||
hr = IXMLDOMDocument_loadXML(doc, str, &v);
|
hr = IXMLDOMDocument_loadXML(doc, str, &v);
|
||||||
EXPECT_HR(hr, S_OK);
|
EXPECT_HR(hr, S_OK);
|
||||||
|
SysFreeString(str);
|
||||||
|
|
||||||
V_VT(&var) = VT_UNKNOWN;
|
V_VT(&var) = VT_UNKNOWN;
|
||||||
V_UNKNOWN(&var) = (IUnknown*)doc;
|
V_UNKNOWN(&var) = (IUnknown*)doc;
|
||||||
|
@ -2031,15 +2076,42 @@ static void test_saxreader(void)
|
||||||
hr = ISAXXMLReader_parse(reader, var);
|
hr = ISAXXMLReader_parse(reader, var);
|
||||||
EXPECT_HR(hr, S_OK);
|
EXPECT_HR(hr, S_OK);
|
||||||
ok_sequence(sequences, CONTENT_HANDLER_INDEX, test_seq, "content test attributes", TRUE);
|
ok_sequence(sequences, CONTENT_HANDLER_INDEX, test_seq, "content test attributes", TRUE);
|
||||||
|
hr = ISAXXMLReader_putFeature(reader, _bstr_("http://xml.org/sax/features/namespaces"), VARIANT_TRUE);
|
||||||
|
EXPECT_HR(hr, S_OK);
|
||||||
|
|
||||||
|
/* switch off 'namespace-prefixes' feature */
|
||||||
|
hr = ISAXXMLReader_putFeature(reader, _bstr_("http://xml.org/sax/features/namespace-prefixes"), VARIANT_FALSE);
|
||||||
|
EXPECT_HR(hr, S_OK);
|
||||||
|
|
||||||
|
CreateStreamOnHGlobal(NULL, TRUE, &stream);
|
||||||
|
size.QuadPart = strlen(test_attributes);
|
||||||
|
IStream_SetSize(stream, size);
|
||||||
|
IStream_Write(stream, test_attributes, strlen(test_attributes), &written);
|
||||||
|
pos.QuadPart = 0;
|
||||||
|
IStream_Seek(stream, pos, STREAM_SEEK_SET, NULL);
|
||||||
|
V_VT(&var) = VT_UNKNOWN|VT_DISPATCH;
|
||||||
|
V_UNKNOWN(&var) = (IUnknown*)stream;
|
||||||
|
|
||||||
|
if (IsEqualGUID(table->clsid, &CLSID_SAXXMLReader40) ||
|
||||||
|
IsEqualGUID(table->clsid, &CLSID_SAXXMLReader60))
|
||||||
|
{
|
||||||
|
test_seq = content_handler_test_attributes_alt_no_prefix;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
test_seq = content_handler_test_attributes_no_prefix;
|
||||||
|
|
||||||
|
set_expected_seq(test_seq);
|
||||||
|
hr = ISAXXMLReader_parse(reader, var);
|
||||||
|
EXPECT_HR(hr, S_OK);
|
||||||
|
ok_sequence(sequences, CONTENT_HANDLER_INDEX, test_seq, "content test attributes", FALSE);
|
||||||
|
|
||||||
|
hr = ISAXXMLReader_putFeature(reader, _bstr_("http://xml.org/sax/features/namespace-prefixes"), VARIANT_TRUE);
|
||||||
|
EXPECT_HR(hr, S_OK);
|
||||||
|
|
||||||
ISAXXMLReader_Release(reader);
|
ISAXXMLReader_Release(reader);
|
||||||
table++;
|
table++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
|
||||||
|
|
||||||
ISAXXMLReader_Release(reader);
|
|
||||||
SysFreeString(str);
|
|
||||||
free_bstrs();
|
free_bstrs();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2161,6 +2233,7 @@ static const struct feature_ns_entry_t feature_ns_entry_data[] = {
|
||||||
|
|
||||||
static const char *feature_names[] = {
|
static const char *feature_names[] = {
|
||||||
"http://xml.org/sax/features/namespaces",
|
"http://xml.org/sax/features/namespaces",
|
||||||
|
"http://xml.org/sax/features/namespace-prefixes",
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue