From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/saxreader.c | 61 +++++++++++++++++++++++++++-------- dlls/msxml3/tests/saxreader.c | 9 ++---- dlls/msxml4/tests/saxreader.c | 3 -- dlls/msxml6/tests/saxreader.c | 2 -- 4 files changed, 51 insertions(+), 24 deletions(-) diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c index 94a7415cba0..21610450fca 100644 --- a/dlls/msxml3/saxreader.c +++ b/dlls/msxml3/saxreader.c @@ -313,6 +313,7 @@ enum saxreader_feature UseInlineSchema = 0x00001000, UseSchemaLocation = 0x00002000, LexicalHandlerParEntities = 0x00004000, + NormalizeLineBreaks = 0x00008000, FeatureForceDWord = 0xffffffff, }; @@ -329,6 +330,7 @@ static const struct saxreader_feature_pair saxreader_feature_map[] = { { LexicalHandlerParEntities, L"http://xml.org/sax/features/lexical-handler/parameter-entities" }, { NamespacePrefixes, L"http://xml.org/sax/features/namespace-prefixes" }, { Namespaces, L"http://xml.org/sax/features/namespaces" }, + { NormalizeLineBreaks, L"normalize-line-breaks" }, { ProhibitDTD, L"prohibit-dtd" }, { SchemaValidation, L"schema-validation" }, }; @@ -3957,8 +3959,8 @@ static void saxreader_parse_pi(struct saxlocator *locator) return; } - if (saxreader_cmp(locator, L"\r\n") - || saxreader_cmp(locator, L"\r")) + if (locator->saxreader->features & NormalizeLineBreaks + && (saxreader_cmp(locator, L"\r\n") || saxreader_cmp(locator, L"\r"))) { saxreader_string_append(locator, &buffer, L"\n", 1); } @@ -4003,10 +4005,18 @@ static void saxreader_parse_comment(struct saxlocator *locator) } else { - saxreader_string_append(locator, &buffer, &ch, 1); + if (locator->saxreader->features & NormalizeLineBreaks + && (saxreader_cmp(locator, L"\r\n") || saxreader_cmp(locator, L"\r"))) + { + saxreader_string_append(locator, &buffer, L"\n", 1); + } + else + { + saxreader_string_append(locator, &buffer, &ch, 1); + saxreader_skip(locator, 1); + } } - saxreader_skip(locator, 1); ch = *saxreader_get_ptr_noread(locator); } @@ -4257,10 +4267,19 @@ static void saxreader_parse_chardata(struct saxlocator *locator) return; } - if (locator->saxreader->version >= MSXML4) - saxreader_parse_characters_newparser(locator, &context); + if (locator->saxreader->features & NormalizeLineBreaks) + { + if (locator->saxreader->version >= MSXML4) + saxreader_parse_characters_newparser(locator, &context); + else + saxreader_parse_characters(locator, &context); + } else - saxreader_parse_characters(locator, &context); + { + saxreader_string_append(locator, &context.buffer, &context.ch, 1); + saxreader_skip(locator, 1); + context.ch = *saxreader_get_ptr(locator); + } } free(context.buffer.data); @@ -4303,10 +4322,19 @@ static void saxreader_parse_cdata(struct saxlocator *locator) return saxlocator_end_cdata(locator, &context.position); } - if (locator->saxreader->version >= MSXML4) - saxreader_parse_characters_newparser(locator, &context); + if (locator->saxreader->features & NormalizeLineBreaks) + { + if (locator->saxreader->version >= MSXML4) + saxreader_parse_characters_newparser(locator, &context); + else + saxreader_parse_characters(locator, &context); + } else - saxreader_parse_characters(locator, &context); + { + saxreader_string_append(locator, &context.buffer, &context.ch, 1); + saxreader_skip(locator, 1); + context.ch = *saxreader_get_ptr(locator); + } } free(context.buffer.data); @@ -5994,11 +6022,14 @@ static HRESULT WINAPI isaxxmlreader_getFeature(ISAXXMLReader *iface, const WCHAR if (reader->version < MSXML4 && (feature == ExhaustiveErrors || feature == SchemaValidation)) return E_INVALIDARG; + if (feature == NormalizeLineBreaks && reader->version >= MSXML4) + return E_INVALIDARG; if (feature == Namespaces || feature == NamespacePrefixes || feature == ExhaustiveErrors || - feature == SchemaValidation) + feature == SchemaValidation || + feature == NormalizeLineBreaks) return get_feature_value(reader, feature, value); FIXME("%p, %s, %p stub\n", iface, debugstr_w(name), value); @@ -6014,11 +6045,15 @@ static HRESULT WINAPI isaxxmlreader_putFeature(ISAXXMLReader *iface, const WCHAR feature = get_saxreader_feature(name); + if (feature == NormalizeLineBreaks && reader->version >= MSXML4) + return E_INVALIDARG; + /* accepted cases */ if ((feature == ExhaustiveErrors && value == VARIANT_FALSE) || (feature == SchemaValidation && value == VARIANT_FALSE) || feature == Namespaces || - feature == NamespacePrefixes) + feature == NamespacePrefixes || + feature == NormalizeLineBreaks) { return set_feature_value(reader, feature, value); } @@ -6193,7 +6228,7 @@ HRESULT SAXXMLReader_create(MSXML_VERSION version, void **obj) reader->IVBSAXXMLReader_iface.lpVtbl = &vbsaxxmlreadervtbl; reader->ISAXXMLReader_iface.lpVtbl = &saxxmlreadervtbl; reader->refcount = 1; - reader->features = Namespaces | NamespacePrefixes; + reader->features = Namespaces | NamespacePrefixes | NormalizeLineBreaks; reader->version = version; reader->empty_bstr = SysAllocString(L""); diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c index 58dd1c8cd2e..e4b9e88d5e1 100644 --- a/dlls/msxml3/tests/saxreader.c +++ b/dlls/msxml3/tests/saxreader.c @@ -3085,9 +3085,7 @@ static void test_saxreader_normalize_line_breaks(void) v = VARIANT_FALSE; hr = ISAXXMLReader_getFeature(reader, L"normalize-line-breaks", &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(v == VARIANT_TRUE, "Unexpected value %d.\n", v); hr = ISAXXMLReader_putContentHandler(reader, &contentHandler); @@ -3141,7 +3139,6 @@ static void test_saxreader_normalize_line_breaks(void) /* Disable normalization */ hr = ISAXXMLReader_putFeature(reader, L"normalize-line-breaks", VARIANT_FALSE); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); /* Text content */ @@ -3150,7 +3147,7 @@ static void test_saxreader_normalize_line_breaks(void) set_expected_seq(normalize_line_breaks_off_text_seq); hr = ISAXXMLReader_parse(reader, var); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok_sequence(sequences, CONTENT_HANDLER_INDEX, normalize_line_breaks_off_text_seq, "Normalize line breaks (off): text", TRUE); + ok_sequence(sequences, CONTENT_HANDLER_INDEX, normalize_line_breaks_off_text_seq, "Normalize line breaks (off): text", FALSE); /* Attribute values */ V_VT(&var) = VT_BSTR; @@ -3174,7 +3171,7 @@ static void test_saxreader_normalize_line_breaks(void) set_expected_seq(normalize_line_breaks_off_cdata_seq); hr = ISAXXMLReader_parse(reader, var); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok_sequence(sequences, CONTENT_HANDLER_INDEX, normalize_line_breaks_off_cdata_seq, "Normalize line breaks (off): cdata", TRUE); + ok_sequence(sequences, CONTENT_HANDLER_INDEX, normalize_line_breaks_off_cdata_seq, "Normalize line breaks (off): cdata", FALSE); /* PI */ V_VT(&var) = VT_BSTR; @@ -3182,7 +3179,7 @@ static void test_saxreader_normalize_line_breaks(void) set_expected_seq(normalize_line_breaks_off_pi_seq); hr = ISAXXMLReader_parse(reader, var); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok_sequence(sequences, CONTENT_HANDLER_INDEX, normalize_line_breaks_off_pi_seq, "Normalize line breaks (off): PI", TRUE); + ok_sequence(sequences, CONTENT_HANDLER_INDEX, normalize_line_breaks_off_pi_seq, "Normalize line breaks (off): PI", FALSE); ISAXXMLReader_Release(reader); table++; diff --git a/dlls/msxml4/tests/saxreader.c b/dlls/msxml4/tests/saxreader.c index 8859e858eee..5169f54f53a 100644 --- a/dlls/msxml4/tests/saxreader.c +++ b/dlls/msxml4/tests/saxreader.c @@ -2871,16 +2871,13 @@ static void test_saxreader_normalize_line_breaks(void) v = 123; hr = ISAXXMLReader_getFeature(reader, L"normalize-line-breaks", &v); - todo_wine ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); ok(v == 123, "Unexpected value %d.\n", v); hr = ISAXXMLReader_putFeature(reader, L"normalize-line-breaks", VARIANT_FALSE); - todo_wine ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); hr = ISAXXMLReader_putFeature(reader, L"normalize-line-breaks", VARIANT_TRUE); - todo_wine ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); ISAXXMLReader_Release(reader); diff --git a/dlls/msxml6/tests/saxreader.c b/dlls/msxml6/tests/saxreader.c index 4ecec94b9fc..91bbbf7ab17 100644 --- a/dlls/msxml6/tests/saxreader.c +++ b/dlls/msxml6/tests/saxreader.c @@ -4820,12 +4820,10 @@ static void test_saxreader_normalize_line_breaks(void) v = 123; hr = ISAXXMLReader_getFeature(reader, L"normalize-line-breaks", &v); - todo_wine ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); ok(v == 123, "Unexpected value %d.\n", v); hr = ISAXXMLReader_putFeature(reader, L"normalize-line-breaks", VARIANT_FALSE); - todo_wine ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); ISAXXMLReader_Release(reader); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10183